Table des matières
Chiffre de Vigenère
Il s'agit d'une méthode décrite par le diplomate Blaise de Vigenère dans son traité sur les chiffres paru en 1583. C'est une version plus complexe du Chiffre de César et c'est un chiffre symétrique.
Chiffre symétrique
Chiffre : ensemble de règles permettant de transformer un message de sa version lisible en une version illisible.
Chiffrer / Déchiffrer : Utiliser le chiffre dans un sens ou dans l'autre.
Clé : Paramètres de réglage du chiffre choisi.
Alice et Bob utilisent une technique de chiffrement / déchiffrement. Tous les deux utilisent la même clé K – K pour key. On parle alors de chiffrement symétrique.
Plutôt que de parler de A qui communique avec B, l'usage est de parler d'Alice qui communique avec Bob. On envisage parfois un espion essayant d'intercepter le message. En anglais espionnage = eavesdropping, ce qui conduit à l'usage de parler d'Eve, l'espionne.
Problème : Alice et Bob ont dû échanger cette clé et ils ont intérêt à en changer régulièrement.
Méthode
Dans le chiffre de César, on décalait l'alphabet d'une certaine quantité. Dans le chiffre de Vigenère on fait de même mais le décalage change à chaque lettre. La clé n'est pas un simple nombre mais un mot ou une phrase.
Exemple
Message : De famille connue, et noble depuis le quinzieme siecle, son pere, Jean, controleur ordinaire des guerres, lui fait donner une education classique tres poussee, l’envoyant pour cela a Paris.
J'ai retiré les accents.
Clé : VIGENERE
On parcours la clé et le message simultanément.
- 1ère lettre de la clé V. On applique un décalage A → V. La première lettre du message, D → Y
- 2e, I ⇒ décalage A → I. La 2e lettre du message E → M
- 3e, G ⇒ décalage A → G. La 3e lettre du message (ignore l'espace) F → L
- 4e, E ⇒ décalage A → E. La 4e lettre du message A → E
- 5e, N ⇒ décalage A → N. La 5e lettre du message M → Z
- 6e, E ⇒ décalage A → E. La 6e lettre du message I → M
- 7e, R ⇒ décalage A → R. La 7e lettre du message L → C
- 8e, E ⇒ décalage A → E. La 8e lettre du message L → P
- 9e, on recommence à V ⇒ décalage A → V. La 9e lettre du message E → Z
- …
Message chiffré : Ym lezmcpz kurayv, io vufyi uikcow yi hydvfmrqv wdmipr, wfr kmxi, Wirr, xwtxescipz uvqmeedzk hrw xyzzxif, plm aiox qserzz arr iuyxizmbr tpvaymdyv xmmy tbyjwzm, r’iazfcvvz tbyi gztg e Ceimn.
Déchiffrement
Même principe mais dans l'autre sens.
- 1ère lettre de la clé V. On applique un décalage V → A. La première lettre du message, Y → D
- 2e, I ⇒ décalage I → A. La 2e lettre du message M → E
- …
À faire
Fonction shift_letter
Vous devez écrire en Python une fonction shift_letter(letter, n)
letterest un caractère,- si c'est une lettre majuscule de A à Z, sans accent, elle sera décalée
- sinon elle sera inchangée
nest l'amplitude du décalage, positif ou négatif, n'est pas limité,- la fonction renvoie le résultat du décalage (ou pas de décalage si pas une majuscule sans accent)
Vous pourrez utiliser les fonctions
ord(letter)qui pour un caractère donné renvoie son code entier,chr(code)qui pour un code entier donné renvoie le caractère correspondant,- le modulo
%car n'oubliez pas qu'après Z on revient à A, il y a une idée de cercle et dans ces cas là le modulo est souvent très utile.
Cette fonction est identique à celle vue dans le chiffre de César. Vous pouvez la reprendre si vous l'avez déjà faite.
Pour réaliser un décalage A → I il suffit de choisir n = ord('I') - ord('A').
Fonction cypher
Vous devez écrire en Python une fonction cypher(text, clé)
textest la chaîne de caractère à chiffrer. De préférence, des majuscules et des caractères de ponctuation,cléest le texte clé, en majuscule sans accent,- renvoie le texte chiffré.
Fonction decypher
Vous devez écrire en Python une fonction decypher(crypted, clé)
cryptedest la chaîne de caractère du texte chiffré,cléest le texte clé, en majuscule sans accent,- renvoie le texte déchiffré.
Test
Pour vérifier le bon fonctionnement :
# message de Alice à Bob
crypted = cypher("BOB, PENSE A ACHETER DES TOMATES.", "POIREAU")
print(crypted)
# réponse chiffrée de Bob
message_reponse = decypher("EOA UI PLDPTVQE, D'TB XIINXH HZFMS EXZWJ.", "POIREAU")
print(message_reponse)
