#acl Formateurs:read,write,revert All:read == Chiffre de César == Écrivez une fonction : {{{#!highlight python def cesar(message,cle): ... return code }}} 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 : {{{#!highlight python def cesar1(lettre,cle): ... return code }}} 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 cle `cle`, on obtient : {{{ mot à coder : information clé répétée : clecleclecl code obtenu : kyjqcqcemqy }}} Écrivez des fonctions : {{{#!highlight python def vigenere(message,cle): ... return code }}} et {{{#!highlight python def devigenere(code,cle): ... return message }}} qui réalisent le codage et le décodage. == Pour aller plus loin == Le sujet du TP de rentrée du niveau 2 en 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/]].