N.S.I. WorkSpace T-Th-C,Terminale C.4 – Sécurisation des communications.

C.4 – Sécurisation des communications.

Categories:

Objectifs

  • Connaissances visées
    • Notions de chiffrement symétrique, chiffrement asymétrique
    • Notions de clés partagées, clé publique, clé privée
    • Notions de protocole HTTPS, de certificat
  • Compétences à développer
    • Décrire les principes de chiffrement symétrique (clef partagée) et asymétrique (avec clef privée/clef publique).
    • Décrire l’échange d’une clef symétrique en utilisant un protocole asymétrique pour sécuriser une communication HTTPS.

Chiffrement symétrique

Principe

Les caractères du message à chiffrer sont d’abord convertis en binaire.

Écrire en Python les instructions d’une fonction qui permet de convertir les caractères d’un texte en binaire.
Pour cela chercher la documentation des fonctions ‘ord()’ et ‘bin()’ à utiliser.

Ensuite on choisit une clé de chiffrement composée de lettres et/ou de chiffres et/ou de caractères spéciaux : on dit que cette clé est alphanumérique. Par exemple : MOTsecret58#

Cette clé est également convertir en binaire.

Cette clé sera utilisée pour le chiffrement mais aussi pour le déchiffrement.

Pour chiffrer et déchiffrer on utilise l’opérateur booléen ‘xor’ (ou exclusif).

Cet opérateur effectue une comparaison bit à bit : si les deux bits sont identiques – 0 et 0 ou 1 et 1 – le résultat sera « 0 » (zéro), sinon il sera « 1 ».

Par exemple (13)10 ^ (6)10 vaut (11)10. (le caractère ‘^’ correspond à l’opérateur xor en Python).

En effet (13)10 = (1101)2 et (6)10 = (0110)2 donc 1101 xor 0110 donne (1011)2 soit (11)10.

Si la longueur de la clé (c’est à dire le nombre de caractères qui la constituent) est plus courte que le longueur du message, il faut l’appliquer autant de fois que nécessaire.

Par exemple :

message →	Bonjour, quelle réponse as-tu trouvé à la première question du DS ?
Clé	→	MOTsecret58#MOTsecret58#MOTsecret58#MOTsecret58#MOTsecret58#MOTsecr

Le déchiffrement se fait de la même manière : si le caractère chiffré vaut (11)10 et qu’il a été chiffré avec la clé (6)10 alors le caractère déchiffré sera (13)10. En effet (1011)2 xor (0110)2 vaut (1101)2.

Écrire en Python les fonctions ‘chiffre(msg, key)’ et ‘dechiffre(msgch, key)’ qui permettent de chiffrer un message ‘msg’ avec une clé ‘key’ et de déchiffrer un message chiffré ‘msgch’ à l’aide de la même clé en utilisant l’opérateur booléen ‘xor’.

Chiffrement asymétrique

Principe

Contrairement au chiffrement symétrique qui utilise une clé qui permet de chiffrer et déchiffrer, le chiffrement asymétrique utilise deux clés : une pour chiffrer et une autre pour déchiffrer. Sachant qu’il est impossible de déchiffrer en utilisant la première clé.

Principe du chiffrement RSA

Pour chiffrer un message, on commence par convertir ce message sous la forme d’un entier naturel m.

Pour cela on peut utiliser le codage ASCII des caractères.

Par exemple si le message est « Bonjour ! », le message converti en nombre entier naturel sera : (661111101061111171143233)10.

Ressource : code ASCII (https://upload.wikimedia.org/wikipedia/commons/d/dd/ASCII-Table.svg)

Écrire en Python une fonction str_to_int(msg) qui prend en argument un message msg et qui renvoie un entier constitué des chiffres successifs du code ASCII (en base 10) de chacune des lettres du message.

Écrire la fonction int_to_str(nint) qui prend en argument un nombre entier nint obtenu avec la fonction str_to_int(msg) et qui renvoie la chaîne de caractères correspondant au message msg passé en paramètre à cette dernière fonction.

Tester les fonctions précédentes avec le message constitué de ces trois lettres : ‘NSI’.
str_to_int(‘NSI’) >>> 788373
int_to_str(788373) >>> ‘NSI’

Chiffrement avec une clé publique.

Constitution d’une clé publique

Soit deux nombres premiers p et q, comme par exemple p = 6991 et q = 7529.
Calculer n = p × q
Calculer f = (p – 1) × (q – 1)
Choisir un nombre premier e tel que e < f, par exemple e = 23.

Le couple (e, n) constitue la clé publique.

Chiffrement du message

Écrire une fonction rsa_chiffre(m, e, n) qui prend en arguments un nombre entier m correspondant à un message converti avec la fonction str_to_int(msg), et les deux valeurs de la clé publique et qui renvoie le message sous une forme chiffrée, c’est à dire sous la forme d’un nombre entier c.
Ce nombre c est obtenu en effectuant le calcul suivant : c = (m ** e) % n.

Tester la fonction ci-dessus, avec 
n = (p × q = 6991 × 7529 =) 52635239
e = 23
m = 788373
rsa_chiffre(m, e, n) >>> 14279727
Solution possible
def rsa_chiffre(m, e, n):
    msgchif = (m ** e) % n
    return msgchif

Déchiffrement avec une clé privée

Constitution d’une clé privée

La clé privée est un couple de valeur (d, n), tel que d < f, et (d × e) % f = 1

Écrire une fonction private_key(e, f) qui prend en arguments les valeurs de e et de f et qui renvoie la valeur de d.

Solution possible
def private_key(e, f):
    d = 1
    while d < f:
        if (e * d) % f == 1 :
            return d
        d += 1
Tester la fonction ci-dessus, avec e = 23 et f = (6990 × 7528 =) 52620720
private_key(23, 52620720) >>> 11439287

Déchiffrement d’un message

Écrire une fonction rsa_dechiffre(c, d, n) qui prend en arguments les valeurs de c, d et n et renvoie un nombre entier m correspondant au message déchiffré, sachant que m = (c **d) % n.
Attention ! (c ** d) peut donner un résultat très grand.
Aussi pour calculer m, on procédera de la manière suivante :
on initialise une variable tmp à 1 ;
on effectue une itération (boucle bornée) de d tours ;
à chaque tour on calcule (tmp × c) % n et le résultat est affecté à tmp
à la fin on renvoie la valeur de tmp

Tester la fonction ci-dessus, avec c = 14279727, d = 11439287 et n = 52635239
rsa_dechiffre(c, d, n) >>> 788373
Solution possible
def rsa_dechiffre(c, d, n):
    tmp = 1
    for x in range(0, d):
        tmp = tmp * c
        tmp = tmp % n
    return tmp

Vérifier avec la fonction int_to_str(nint) que le nombre entier renvoyé par la fonction rsa_dechiffre(c, d, n) correspond bien au message msg de départ.

int_to_str(788373) >>> ‘NSI’

Recommencer tous les calculs en utilisant d’autres nombres premiers…
http://compoasso.free.fr/primelistweb/page/prime/liste_online.php

Ce Qu’il Faut Retenir…

Quand au sein d’un réseau deux machines s’échangent des messages, si ces derniers sont interceptés par une tierce personne malveillante, les informations qu’ils contiennent ne doivent pas pouvoir être lues.

Pour rendre ces messages incompréhensible, ils vont être chiffrés.

Le chiffrement est l’opération qui consiste à rendre un message incompréhensible.

Quelques références terminologiques1

  • Coder / Encoder signifie “Constituer un message, un énoncé selon les règles d’un système d’expression − langue naturelle ou artificielle, sous une forme accessible à un destinataire.”
    Ainsi un message peut être codé en ‘Morse’2. Pour coder il suffit de disposer d’un dictionnaire de correspondance entre les caractères du message et les caractères, signes ou symboles d’un autre système de communication. En informatique il s’agit d’une façon d’écrire les mêmes données, mais de manière différente : par exemple on peut encode un même texte en ‘UTF-8’ ou en ‘ISO/CEI 8859-15’3. Pour décoder on réaliser l’opération inverse à l’aide du même dictionnaire. Le codage (encodage) n’a donc aucune vocation à assurer la confidentialité des informations traitées.
  • Chiffrer : L’action de procéder à un chiffrement. Le chiffrement est un procédé de cryptographie grâce auquel on souhaite rendre la compréhension d’un document impossible à toute personne avec une clé de chiffrement.
  • Déchiffrer consiste à retrouver le texte original (aussi appelé clair) d’un message chiffré avec une clé de déchiffrement.
  • Décrypter consiste à retrouver le texte original à partir d’un message chiffré sans posséder la clé de déchiffrement. Décrypter ne peut accepter d’antonyme : il est en effet impossible de crypter (réaliser un cryptage) c’est à dire de créer un message chiffré sans posséder de clé de chiffrement ! Les termes « encrypter » et « deencrypter » sont des anglicismes à bannir du présent sujet d’étude.
  • La cryptographie est une des disciplines de la cryptologie s’attachant à protéger des messages (assurant confidentialité, authenticité et intégrité) en s’aidant souvent de secrets ou clés.
  • La cryptologie, étymologiquement la science du secret. Cette science englobe la cryptographie – l’écriture secrète –, la cryptanalyse – l’analyse et l’attaque de cette dernière –, et la stéganographie – l’art de la dissimulation.
  • Ne pas confondre ‘chiffrement’ et ‘chiffrage’. Le chiffrage, c’est évaluer le coût de quelque chose. ABSOLUMENT RIEN à voir avec le chiffrement.

Chiffrement symétrique

L’expéditeur du message utilise une clé pour chiffrer le message, et le destinataire utilise ensuite la même clé pour le déchiffrer.

Un dictionnaire comportant les 26 caractères de l’alphabet comme clés et les caractères chiffrés comme valeurs obtenus par un décalage de 13, constitue une clé de chiffrement symétrique, puisque le même dictionnaire peut servir à chiffrer et à déchiffrer.

Une chaîne de caractères dont les éléments sont utilisés pour chiffrer les caractères d’un message en utilisant l’opérateur booléen ‘xor’ constitue une clé de chiffrement symétrique, puisque cette même chaîne de caractères sera utilisée pour le chiffrement et le déchiffrement.

Dans le cas d’un chiffrement avec une clé symétrique il est essentiel que cette clé reste secrète et connue seulement de l’expéditeur et du récepteur du message.

Chiffrement asymétrique

Cette méthode de chiffrement repose sur deux clés : une clé publique de chiffrement et une clé privée de déchiffrement.

Le système de chiffrement RSA repose sur la difficulté de factorisation d’un nombre très grand, c’est à dire de factoriser un nombre en produit de deux nombres premiers, et utilise des théorèmes d’arithmétique.

  • La clé publique est constituée de deux valeurs : e et n, telles que n est le produit de deux nombres premiers p1 et p2, et e est un nombre premier strictement inférieur à (p1 – 1) × (p2 – 1).
  • La clé publique est constituée de deux valeurs : d et n, avec d strictement inférieur à n et tel que le reste dans la division euclidienne de e × d par (p1 – 1) × (p2 – 1) soit égal à 1.

TLS-Handshake (infographie)


1Source : https://chiffrer.info/

2Code Morse : https://upload.wikimedia.org/wikipedia/commons/8/8e/International_Morse_Code-fr.svg

3Revoir le cours de spécialité NSI de Première, sur la représentation d’un texte en machine


Pour aller plus loin…

  • Piste 1 : rechercher des informations sur le protocole SSH
  • Piste 2 : rechercher des informations sur le protocole WPA2
Article sous licence << Cliquez pour plus d’informations <<