Le chiffrement de César
Jules César protégeait ses messages avec une méthode toute simple : remplacer chaque lettre par celle située trois rangs plus loin dans l'alphabet. A devient D, B devient E... Programmons ce code secret !
Les lettres sont des nombres
Pour l'ordinateur, chaque caractère a un numéro. code donne le numéro d'un caractère, et caractère fait l'inverse :
affiche code('A') // 65
affiche code('B') // 66
affiche code('Z') // 90
affiche caractère(67) // C
Les majuscules de A à Z portent les numéros 65 à 90, dans l'ordre. Décaler une lettre, c'est donc ajouter un nombre à son code.
Décaler une lettre
Problème : après Z, il faut revenir à A. Avec un décalage de 3, X doit donner A, Y donner B et Z donner C. L'outil parfait pour « tourner en rond », c'est mod.
- On calcule le rang de la lettre dans l'alphabet, de 0 à 25 :
code(lettre) - 65. - On ajoute le décalage, et on prend le reste de la division par 26.
- On revient au code en rajoutant 65.
lettre est un texte vaut 'Y'
rang est un nombre
rang vaut (code(lettre) - 65 + 3) mod 26
affiche caractère(65 + rang) // B
Pour Y : son rang est 24 ; 24 + 3 = 27 ; 27 mod 26 = 1 ; la lettre de rang 1 est B.
Question : Avec un décalage de 3, quelle lettre remplace Z ? — C. Z a le rang 25 ; 25 + 3 = 28 ; 28 mod 26 = 2 ; la lettre de rang 2 est C.
Chiffrer un message entier
On parcourt le message lettre par lettre. Les lettres sont décalées ; les autres caractères (espaces, ponctuation) sont recopiés tels quels.
fonction chiffrer(message, decalage)
resultat est un texte vaut ''
lettre est un texte
rang est un nombre
pour i de 1 à longueur(message)
lettre vaut copier(message, i, 1)
si code(lettre) >= 65 et code(lettre) <= 90 alors
rang vaut (code(lettre) - 65 + decalage) mod 26
resultat ajoute caractère(65 + rang)
sinon
resultat ajoute lettre
fin si
fin pour
retourne resultat
fin fonction
affiche chiffrer('BONJOUR CODDY', 3) // ERQMRXU FRGGB
Le message doit être en majuscules sans accent : c'est la plage des codes 65 à 90.
Déchiffrer
Pour retrouver le message, il faut décaler dans l'autre sens. Reculer de 3, c'est comme avancer de 26 - 3 = 23 : on réutilise donc la même fonction !
fonction chiffrer(message, decalage)
resultat est un texte vaut ''
lettre est un texte
rang est un nombre
pour i de 1 à longueur(message)
lettre vaut copier(message, i, 1)
si code(lettre) >= 65 et code(lettre) <= 90 alors
rang vaut (code(lettre) - 65 + decalage) mod 26
resultat ajoute caractère(65 + rang)
sinon
resultat ajoute lettre
fin si
fin pour
retourne resultat
fin fonction
secret est un texte
secret vaut chiffrer('RENDEZ-VOUS A MIDI', 3)
affiche 'Message chiffré : ' + secret
affiche 'Message déchiffré : ' + chiffrer(secret, 26 - 3)
Casser le code
Ce code est-il sûr ? Pas du tout : il n'existe que 25 décalages possibles. Il suffit de tous les essayer et de lire le résultat. Ajoute ces lignes après la fonction chiffrer :
intercepte est un texte vaut 'OH KLERX HVW XQ VDJH'
pour cle de 1 à 25
affiche cle + ' : ' + chiffrer(intercepte, 26 - cle)
fin pour
Une seule ligne donne une phrase lisible : c'est la bonne clé. Cette attaque s'appelle la force brute. Les codes modernes utilisent des clés si longues qu'il faudrait des milliards d'années pour toutes les essayer.
En résumé
- Chaque caractère a un numéro :
code('A') vaut 65, caractère(65) donne A. - Chiffrer : décaler le rang de chaque lettre, avec
mod 26 pour revenir au début. - Déchiffrer : décaler de
26 - clé. - Un code avec trop peu de clés se casse en les essayant toutes.