Ce sujet vous propose de mettre en œuvre la technique cryptographique la plus standard: un décalage fixé par une clé secrète. Un peu d’algorithmique (tests et boucles for), un peu d’arithmétique modulaire, et c’est réglé.
Chiffre de César
Écrivez une fonction :
qui renvoie le code du message, suivant le chiffre de César paramétré par l’entier cle. Pour mémoire, cela signifie que chaque lettre du message est remplacée par la lettre qui se trouve cle « cases » plus loin dans l’alphabet, quitte à revenir au début si on a atteint la fin de l’alphabet.
On pourra d’abord se contenter de transformer les lettres de l’alphabet latin, et on laissera les autres caractères inchangés.
Deux outils cruciaux :
la fonction ord, qui renvoie le numéro d’un caractère (et on admet que les lettres ont des codes consécutifs) ;
la fonction chr, inverse de la précédente ;
l’opération %, qui calcule le reste de la division euclidienne.
On a donc par exemple :
ord('a') est le code de la lettre a ;
ord('b')-ord('a') == 1 ;
chr(ord('a')+12) == 'm' ;
ord('a')+ (ord('z')-ord('a')+11) % 26 == ord('k')
N’hésitez bien sûr pas à définir des fonctions auxiliaires pour décomposer le travail. Elles pourront aussi être utiles pour la suite.
En fait, il y en a une à laquelle vous ne couperez pas :
qui applique le chiffre de César à une seule lettre.
Faut-il écrire une autre fonction pour le décodage ?
Chiffre de Vigenère
Le chiffre de Vigenère généralise celui de César : la clé est maintenant un mot. Dans cette clé :
la lettre a représente un décalage de 0,
la lettre b représente un décalage de 1,
la lettre c représente un décalage de 2,
- …
L’idée du code est la suivante :
- on décale la première lettre du message d’après la première lettre de la clé ;
- on décale la deuxième lettre du message d’après la deuxième lettre de la clé ;
- …
- quand on a épuisé la clé, on revient à sa première lettre…
- …
Par exemple, si on chiffre 'information' avec la clé cle, on obtient :
mot à coder : information clé répétée : clecleclecl code obtenu : kyjqcqcemqy
Écrivez des fonctions :
et
qui réalisent le codage et le décodage.
Plus de souplesse
On travaille modulo 26 parce qu’on apprend à l’école qu’il y a 26 lettres dans l’alphabet. Mais c’est faux : il y a bien plus de caractères dans les textes courants, surtout si on compte la ponctuation.
Reprenez la fonction cesar pour lui donner un troisième argument optionnel alphabet, qui est une chaîne ou une liste, contenant tous les caractères autorisés :
Cette fonction doit échouer si le message contient un caractère absent de l’alphabet.
Même chose pour vigenere.
Une version plus réaliste
Un système de chiffrage générique ne dépend en fait pas de l’alphabet choisi: on travaille en binaire, et le message comme la clé sont des suites d’octets. Adaptez votre code pour qu’il travaille sur le type bytes et non str.
Dans ce cas, l’usage est plutôt d’utiliser un XOR (un OU EXCLUSIF bit à bit) plutôt qu’une somme modulaire, ce qui est un poil moins coûteux (et la fonction de codage et de décodage sont les mêmes).
N’hésitez pas à vous documenter…
Pour aller plus loin
Le sujet du TP de rentrée du niveau 2 de la formation ISN de 2012-2013 proposait une méthode de cryptanalyse du chiffre de Vigenère, basée sur la détection de motifs répétés et le calcul de l’indice de coïncidence. Le sujet est disponible en ligne sur http://isn.irem.univ-mrs.fr/2012-2013/formation/module/2/.