Aller au contenu principal

Informatique · Terminale · 5 min de lecture

Chiffrement symétrique et asymétrique

Chiffrement symétrique : la même clé, partagée, sert à chiffrer et à déchiffrer ; chiffrement asymétrique : une clé publique chiffre, seule la clé privée associée déchiffre ; en HTTPS, un protocole asymétrique sert à échanger une clé symétrique de session, puis les échanges sont chiffrés symétriquement (plus rapide) ; exemples de chiffrements simples (décalage, ou exclusif).

Chapitre du programme : Numérique et sciences informatiques (spécialité)

Bloc 1 sur 7 · Comprendre

Comprendre : une clé pour chiffrer, une clé pour déchiffrer

Chiffrer un message, c'est le transformer pour qu'il soit illisible par qui ne possède pas la clé ; déchiffrer, c'est retrouver le message d'origine grâce à la clé.

Chiffrement symétrique : la même clé, partagée par l'expéditeur et le destinataire, sert à chiffrer et à déchiffrer. Exemple historique, le chiffrement par décalage : chaque lettre est remplacée par celle qui se trouve d lettres plus loin dans l'alphabet (en revenant à A après Z). La clé est d ; on déchiffre avec le décalage opposé. Dans le programme, ord donne le code d'un caractère et chr le caractère d'un code ; le reste de la division par 26 (% 26) fait revenir à A après Z.

def cesar(texte, d):
    resultat = ""
    for c in texte:
        rang = (ord(c) - ord("A") + d) % 26
        resultat = resultat + chr(ord("A") + rang)
    return resultat

secret = cesar("BONJOUR", 3)
print(secret)
print(cesar(secret, -3))
ERQMRXU
BONJOUR

Avec seulement 26 décalages possibles, ce chiffrement se casse en les essayant tous : il sert à comprendre le principe, pas à protéger un secret.

Bloc 2 sur 7 · Approfondir

Approfondir : ou exclusif, asymétrique, HTTPS

Chiffrement par ou exclusif (xor). On combine chaque bit du message avec le bit de même rang de la clé : le résultat vaut 1 si les deux bits sont différents, 0 s'ils sont égaux. En Python, l'opérateur est ^. Dans l'extrait, 0b10110010 écrit un entier en binaire, et format(c, "08b") écrit c en binaire sur 8 chiffres. Appliquer deux fois la même clé redonne le message, car (m xor k) xor k = m : la même clé chiffre et déchiffre.

m = 0b10110010
k = 0b01101100
c = m ^ k
print(format(c, "08b"), c)
print(format(c ^ k, "08b"), c ^ k)
11011110 222
10110010 178

Sur un texte, on chiffre le code de chaque caractère : ord(c) donne le code (un entier) du caractère c, et chr(x) le caractère de code x.

cle = 42
message = "NSI"
chiffre = []
for c in message:
    chiffre.append(ord(c) ^ cle)
print(chiffre)
texte = ""
for x in chiffre:
    texte = texte + chr(x ^ cle)
print(texte)
[100, 121, 99]
NSI

Chiffrement asymétrique. Chaque personne possède deux clés associées : une clé publique, que tout le monde peut connaître, et une clé privée, qu'elle garde secrète. Ce qui est chiffré avec la clé publique ne peut être déchiffré qu'avec la clé privée associée. Pour envoyer un secret à Bob, on le chiffre donc avec la clé publique de Bob ; seul Bob pourra le lire. RSA est un exemple de tel chiffrement.

HTTPS combine les deux. Le chiffrement symétrique est plus rapide, mais il faut d'abord partager la clé sans qu'elle soit interceptée. En HTTPS, un protocole asymétrique sert à échanger une clé symétrique de session ; ensuite, tous les échanges sont chiffrés symétriquement avec cette clé.

Bloc 3 sur 7 · Exemple

Exemple guidé : chiffrer un octet par ou exclusif

Énoncé. La clé est 0110 1100. On chiffre l'octet 1011 0010. Quelle est la valeur, en base 10, de l'octet chiffré ?

Méthode : comparer les bits rang par rang.

Tableau : Poids, 128, 64, 32, 16, 8, 4, 2, 1
Poids1286432168421
Message10110010
Clé01101100
xor11011110

L'octet chiffré est 1101 1110. Ses bits à 1 ont pour poids 128, 64, 16, 8, 4 et 2 : 128 + 64 + 16 + 8 + 4 + 2 = 222.

Déchiffrer : on applique le même ou exclusif avec la même clé, 1101 1110 xor 0110 1100 = 1011 0010, soit 178, le message d'origine (voir l'exécution ci-dessus).

Bloc 4 sur 7 · Visualiser

Voir : symétrique ou asymétrique ?

Tableau : Critère, Symétrique, Asymétrique
CritèreSymétriqueAsymétrique
Clésune seule clé, partagéeune clé publique et une clé privée associées
Chiffreravec la clé partagéeavec la clé publique du destinataire
Déchiffreravec la même cléavec la clé privée du destinataire
Difficultépartager la clé en secretplus lent
Exemplesdécalage, ou exclusifRSA
Rôle dans HTTPSchiffrer les échangeséchanger la clé de session

Continuez sur votre lancée

Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.

  • Les formules et les repères à retenir
  • Les erreurs fréquentes expliquées
  • Un exercice avec des aides et sa correction

L’accès gratuit comprend les cours et exercices de votre niveau choisi.

Sources

  • BO spécial n°8 du 25 juillet 2019 — programme de spécialité numérique et sciences informatiques de terminale générale, annexe (https://eduscol.education.fr/document/30010/download) — rubrique « Architectures matérielles, systèmes d'exploitation et réseaux », sécurisation des communications
  • A. S. Tanenbaum, D. J. Wetherall, Réseaux, 5e édition, Pearson — chapitre 8, « Sécurité des réseaux » (chiffrement à clé symétrique, à clé publique)
  • Documentation officielle de Python 3, The Python Language Reference et The Python Standard Library (https://docs.python.org/3/) — opérateur ^ (ou exclusif bit à bit), fonctions ord, chr et format

Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.

Explorer les autres cours

Accès rapide