Lycée   >   Terminale   >   NSI   >   Comprendre le chiffrement symétrique

Comprendre le chiffrement symétrique

  • Fiche de cours
  • Quiz
  • Profs en ligne
Objectifs
  • Comprendre le principe d’un algorithme de chiffrement symétrique pour sécuriser des communications.
  • Implémenter en Python un algorithme de chiffrement symétrique.
Point clé

L’algorithme de chiffrement symétrique est un algorithme de chiffrement qui utilise la même clé secrète pour le chiffrement et pour le déchiffrement d’un message. Il s’agit d’une clé partagée.

Pour bien comprendre
  • Représenter un texte en utilisant différents encodages. (NSI 1re)
  • Introduire la cryptographie.

La cryptographie (« écriture secrète ») consiste à protéger un message en utilisant des clés pour le chiffrer.

La cryptographie repose sur des algorithmes qui utilisent des clés pour chiffrer et pour déchiffrer des messages. Il peut s’agir d’un algorithme de chiffrement symétrique ou d’un algorithme de chiffrement asymétrique.

On étudie ici les algorithmes de chiffrement symétrique.

1. L'algorithme de chiffrement symétrique
a. Principe
Le chiffrement symétrique est un algorithme cryptographique qui utilise la même clé secrète pour le chiffrement et pour le déchiffrement d’un message. Il s’agit d’une clé partagée.
b. Avantage et inconvénient

L’avantage de ce système est qu’il permet de chiffrer et de déchiffrer des messages de grande taille de manière très rapide et sans trop consommer de mémoire.

L’inconvénient principal est la transmission de la clé qui doit être longue pour être efficace (128 bits minimum).

2. Exemples d'algorithmes de chiffrement symétrique
a. Le chiffrement de César

Voici le principe du chiffrement de César : pour rendre secrets ses messages, Jules César décalait toutes les lettres de 3 rangs vers la droite. Le A devient alors D, etc.

Le chiffrement de César est un chiffrement par décalage dans l'alphabet, qui consiste à chiffrer un message en décalant toutes les lettres d’un certain nombre de rangs vers la droite.
Le chiffrement de César est un chiffrement par substitution monoalphabétique, c'est-à-dire qu'une même lettre du message en clair sera toujours remplacée par la même lettre. 
La clé de ce chiffrement correspond au nombre de rangs de décalage.
Exemple
Voici le chiffrement du message « MATHEMATIQUE » en décalant chaque lettre de 3 rangs.
Lettre en clair M A T H E M A T I Q U E
Lettre chiffrée obtenue
en décalant la lettre
en clair de 3 rangs
P D W K H P D W L T X H
Le message chiffré est donc PDWKHPDWLTXH.

C’est l'un des chiffrements symétriques les plus simples à réaliser mais malheureusement aussi l’un des plus simples à déchiffrer. Une simple analyse des fréquences d’apparition des lettres permet en effet de retrouver facilement le message et la clé.

b. Le chiffrement de Vigenère

Une variante du chiffrement de César est le chiffrement de Vigenère.

Le chiffrement de Vigenère est un chiffrement par substitution polyalphabétique, c'est-à-dire qu'une même lettre du message en clair peut être remplacée par des lettres différentes.
On décale les lettres par rapport à la clé, la clé va donc définir le décalage pour chaque lettre du message.
Exemple
Voici le rang des lettres de l’alphabet.
On utilise la clé « NSI ».

Voici le chiffrement du message « MATHEMATIQUE » avec cette clé.
On a répété autant de fois que nécessaire la clé NSI dans la ligne clé du tableau.
  • Pour le M : décaler de 13, c’est ajouter 13 au rang de M :
    13 + 13 = 26, la lettre correspondante est donc Z.
  • Pour le A : décaler de 18, c’est ajouter 18 au rang de A :
    + 18 = 19, la lettre correspondante est donc S.
  • Pour le T : décaler de 8, c’est ajouter 8 au rang de T :
    20 + 8 = 28, on dépasse 26.
    Il ne faut pas oublier que lorsqu’on dépasse 26, on repart de la lettre A, donc on compte modulo 26. 28 correspond à 2 modulo 26, la lettre correspondante est donc B.
Le message chiffré est donc ZSBUWUNLQDMM.

Pour déchiffrer le message, on applique le même principe avec la même clé.

3. L'implémentation en Python de l'algorithme de chiffrement de Vigenère

Pour implémenter en Python l’algorithme de chiffrement de Vigenère, il faut utiliser le rang des lettres de l’alphabet. On va utiliser le codage Unicode pour cela.

Rappels
  • Implémenter un algorithme, c’est le traduire dans un langage de programmation.
  • La table Unicode rassemble tous les caractères existants, soit prêt de 150 000 caractères. Le codage le plus utilisé est l’UTF-8, où les caractères classiques sont codés sur 8 bits, c’est-à-dire 1 octet, et les caractères plus rares sont codés sur un nombre variable d’octets (2, 3 ou 4). À chaque caractère correspond un nombre en binaire.
a. Passer du caractère latin au caractère Unicode, et inversement
Obtenir le caractère Unicode

La fonction native ord retourne l’entier qui représente le caractère Unicode : c'est le numéro Unicode.

Exemple
  • ord('A') retourne 65 : il s’agit de la valeur qui code le caractère Unicode associé au caractère latin A.
  • ord('Z') retourne 90 : il s’agit de la valeur qui code le caractère Unicode associé au caractère latin Z.
Si on veut que ces nombres correspondent au rang de l’alphabet, il faudra leur retrancher 65.
Obtenir le caractère latin

Pour retrouver le caractère latin à partir de son numéro Unicode (entier qui code le caractère en Unicode), il faut utiliser la fonction native chr suivie entre parenthèses du numéro Unicode du caractère.

b. L'opération modulo en Python

L’opération modulo entre un entier a et un entier b permet d’obtenir le reste de la division euclidienne de a par b. Ce reste se note a%b.

Exemples
125%5 = 0 et 12%5 = 2
Le symbole % représente l’opérateur modulo en Python, il permet de revenir à zéro à un moment choisi.
c. L'implémentation en Python

Voici l’implémentation de l’algorithme de chiffrement de Vigenère.

Python Explication
def chiffrer_vigenere(mot,cle): On définit la fonction qui a pour paramètres le mot à chiffrer et la clé de chiffrement.

Mot et cle sont des chaines de caractères.
  message_chiffre="" On crée une chaine de caractères vide qui contiendra le message chiffré.
  k=len(cle) On récupère la longueur de la clé, qu’on stocke dans la variable k.
  i=0 i donne le caractère latin étudié dans la clé. On commence avec le premier caractère de la clé.
  for lettre in mot: Pour chaque lettre du mot à chiffrer,
    rang_lettre=ord(lettre)-65 On détermine le rang de la lettre du mot : on utilise le numéro Unicode 
(ord(lettre)), on se ramène à des nombres compris entre 0 et 25 en retranchant 65.
    rang_cle=ord(cle[i])-65 On détermine le rang de la lettre de la clé : on utilise le numéro Unicode, on se ramène à des nombres compris entre 0 et 25 en retranchant 65.
    rang_chiffre=
    (rang_lettre+rang_cle)%
26
On additionne les rangs. Pour rester dans l’alphabet, on effectue le calcul modulo 26.
    lettre_chiffre=chr(rang_chiffre+65) Le numéro Unicode de la lettre chiffrée s’obtient en ajoutant 65 au rang chiffré.

On obtient le caractère latin qui correspond en utilisant la fonction native chr.
    i=(i+1)%k On passe au caractère suivant de la clé.

(Le modulo k (%k) permet de revenir au début de la clé lorsque la clé a été entièrement parcourue.)
    message_chiffre+=lettre_chiffre On concatène (met bout à bout) la lettre chiffrée au message grâce à +.
return message_chiffre On retourne alors la chaine de caractères qui contient le message chiffré.
Exemple
Voici l’exécution de ce programme sur Python Tutor, pour chiffrer le message « MATHEMATIQUE » avec la clé « NSI ».
d. Une autre méthode

Lorsqu’on itère sur le mot à chiffrer, c’est-à-dire qu’on répète le programme sur les différentes lettres du mot, la position et la valeur qui correspondent à chaque lettre peuvent être récupérées en même temps en utilisant la fonction native enumerate().

On peut ainsi écrire plus simplement la fonction précédente.

Voici l’explication de ce programme, ligne par ligne.

Python Explication
def code_vigenere(mot, cle): On définit la fonction qui a pour paramètres le mot à chiffrer et la clé de chiffrement.
  mot_code="" On crée une chaine de caractères vide qui contiendra le message chiffré.
  for i,c in enumerate(mot): On récupère dans le mot à chiffrer l’indice i et le caractère latin c qui correspond à l’indice.
     d=cle[i%len(cle)] On détermine le caractère latin d de la clé pour l’indice i.
     d=ord(d)–65 On détermine alors le rang : on utilise le numéro Unicode
(ord(d)),
on se ramène à des nombres compris entre 0 et 25 en retranchant 65.
     mot_code+=chr((ord(c)–65+d)%26+65) (ord(c)–65+d)%26
permet d’obtenir le rang du caractère chiffré (compris entre 0 et 25).

On ajoute 65 pour obtenir le numéro Unicode et on applique la fonction chr pour obtenir le caractère latin chiffré.

On concatène ce caractère au mot_code.
  return mot_code On retourne alors la chaine de caractères latins, qui contient le message chiffré.

Comment as-tu trouvé ce cours ?

Évalue ce cours !

 

Question 1/5

La médiane de 6 notes est 13. Cela signifie que :

Question 2/5

On a obtenu la série statistique suivante :

Combien vaut la médiane ?

Question 3/5

On a obtenu la série ci-dessous :

Quelle est la médiane de cette série ?

Question 4/5

On a relevé les tailles en cm des élèves d’une classe :

 

Parmi les propositions suivantes, laquelle est vraie ?

Question 5/5

Les notes en français de deux classes littéraires sont données dans le tableau suivant :

Quelle est la note médiane ?

Vous avez obtenu75%de bonnes réponses !

Recevez l'intégralité des bonnes réponses ainsi que les rappels de cours associés :

Votre adresse e-mail sera exclusivement utilisée pour vous envoyer notre newsletter. Vous pourrez vous désinscrire à tout moment, à travers le lien de désinscription présent dans chaque newsletter. Pour en savoir plus sur la gestion de vos données personnelles et pour exercer vos droits, vous pouvez consulter notre charte.

Une erreur s'est produite, veuillez ré-essayer

Consultez votre boite email, vous y trouverez vos résultats de quiz!

Découvrez le soutien scolaire en ligne avec myMaxicours

Le service propose une plateforme de contenus interactifs, ludiques et variés pour les élèves du CP à la Terminale. Nous proposons des univers adaptés aux tranches d'âge afin de favoriser la concentration, encourager et motiver quel que soit le niveau. Nous souhaitons que chacun se sente bien pour apprendre et progresser en toute sérénité ! 

Fiches de cours les plus recherchées

NSI

Comprendre le chiffrement asymétrique

NSI

Décrire de manière détaillée le protocole HTTPS

NSI

Comprendre qu'un programme peut être une donnée

NSI

Introduire les notions de calculabilité et de décidabilité

NSI

Utiliser la récursivité en Python

NSI

Utiliser une API et des bibliothèques

NSI

Utiliser les paradigmes impératifs et fonctionnels

NSI

Utiliser le paradigme objet

NSI

Repérer les bugs : typages, effets de bords, débordements

NSI

Repérer les bugs : structures