Code de Vigenère

mai 2020 / Code de Vigenère

Un code d'agent secret

Initier les enfants aux rudiments du langage informatique était en bonne place dans les envies d'activité en confinement. Soyons clair: pas question ici de parler de syntaxe ou de grammaire propre à un langage mais bien plutôt de comprendre la logique de la démarche et du raisonnement. qu'est-ce qu'une variable? Une boucle? Une condition?

Pour démarrer avec la programmation il fallait un projet pas trop compliqué et assez ludique dont le résultat soit tout à fait vérifiable. Et si on fabriquait une machine à code secret?! Ok, mais lequel? Le code César qui consiste à remplacer une lettre par une autre lettre est beaucoup trop simple à mon goût. Sa variante avec mot clef (appelée Chiffre de Vigenère) est bien plus fun! C'est parti pour un peu de théorie cryptographique:

Dans le code de César, une lettre remplace une autre lettre, toujours identique. Dans un décalage de deux lettres par exemple, AMOUR s’écrira COQWT. Ce code est assez simple à déchiffrer en se basant sur la fréquence répétitive des lettres (comme le E par exemple). Dans le chiffre de Vigenère, les choses se corsent un peu plus. A l'aide d'un mot clef et une table d'encodage on va mettre en rapport la lettre qu'on souhaite coder (colonne) avec la lettre de la clef (ligne).

Table de Vigenère

Table de Vigenère

Amour et musique

Amour et musique

On entre la lettre qu'on souhaite coder par le haut du tableau et on cherche la ligne correspondant à la clef. A l'intersection se trouve la lettre codée. Si je veux coder AMOUR et que ma clef est MUSIQUE, je cherches d'abord colonne A et ligne M, ce qui correspond à M. Ensuite je cherches colonne M et ligne U qui me donne 5 et je continue ainsi jusqu'à obtenir M5516. Pour décoder, je fais le chemin inverse. Si le message est plus long que la clef, alors la clef est répétée indéfiniment jusqu'à la fin du message.

En terme informatique le problème est assez simple puisqu'il s'agit additionner la position de la lettre qu'on veut coder avec la position de la lettre clef dans un tableau... ok, je m'explique:

encodage

encodage

Si j'imagine que chaque lettre correspond à une position, le A (que je veux encoder) correspond à 0, le M(qui est ma clef) correspond à 12. Je fais donc 0+12=12 donc M. Le M (2ème lettre de AMOUR) correspond à 12 et le U (2ème lettre de MUSIQUE) correspond à 20. 12+20=32, je vais à la position 32 et j'y trouve le 5. Et ainsi de suite!

En réalité, et comme souvent en informatique, la grande difficulté réside non pas dans la fonction elle-même mais plutôt dans la gestion des exceptions possibles. Et si quelqu'un entre un caractère qui n'a pas été prévu? Et si la clef est plus longue que le message? Et si quelqu'un (pour une raison que j'ignore) décide d'encoder "Guerre et paix" et me fait surchauffer les serveurs d'Infomaniak?

boucle php

boucle php

Et si vous êtes arrivé jusqu'ici, vous aurez remarqué que si je veux coder le caractère Z par exemple avec la clef Z, j'additionne 25+25=50 et qu'ainsi, je sors du tableau... ce qui est gênant! On résout ce cas de figure en posant une condition de type: si X est plus grand que 36, alors X=(X-36). Vous suivez? La règle est tellement simple que pour la partie décodage il nous a (presque) suffit de remplacer le + par le - pour ça fonctionne.

Et pour conclure:
voici le lien du site pour vous amuser aussi!
code de Vigenère
Et la clef pour déchiffrer le message suivant est "chiffre"

Le résultat final

Le résultat final

Nh7hwPtvvowfGlkl7jxK3wum4ivw1kqxhztnpvjxbhg6tf4tvAwBtqFkkl7xerxvhkmfEx1h7uwFxgnmw4uiu6ujxJeilA4jE3uginirrv6AtzMipA7ijbwgjzjyJ3qB7hqvw!6Mqqv3ul7inJxkuozjbhg6tf4Jxgnistxvcwpnjbuwp7kfzx1wixxvv1pvfuvveB7zsbqgzAflv3fhvx4Lr1hCywv3olAxfxi1httwJ3sBm4qr3eyGuyFkthxmnv3tlvi4Lr1tmxxrkg6qsnExgstnlzfnl7f4ryvym4vLi1xCn5ui2kztnKa12qpnGifpi

Toutes les images du projet