Vous êtes sur la page 1sur 3

TD Informatique : Codage – décodage,

et cassage du code de Vigenère

I) Le code de César :
En préambule nous allons commencer par le codage de César qui consiste en une simple
substitution des caractères par décalage, ce dernier étant la clé du code.

Je vous donne le programme : td code de césar, testez le programme et essayez de comprendre les
différents éléments le composant. Un premier message à décoder vous est donné (en dessous après le
#)
Il y a deux techniques pour attaquer ce code :
• l’attaque fréquentielle
• la force brute

Première question : Créez une procédure que vous appellerez AttFreq(m) , qui utilise une liste de 26
nombres dans laquelle on note le nombre de fois ou apparaît chacun des caractères dans la chaîne de
caractère m. Visualiser alors la fréquence de chaque caractères sous la forme d’une courbe.

Deuxième question : Déterminez alors la lettre la plus fréquente dans le code (en français le e
représente en moyenne 17 %, c’est plus du double des autres lettres), la procédure AttFreq(m) doit
retourner le décalage. Déterminez alors le texte initial.

Troisième question : Créez une procédure ForceBrute(m) qui teste 26 décalages possibles, retrouvez
le texte initial.

II) Le code de Vigenère :

Nous allons étudier un dispositif de cryptographie remontant au 16° siècle, il a fallu attendre le 19°
siècle pour que ce codage puisse être « cassé ».

Le code de Vigenere, permet à partir du carré de Vigenere (cf page suivante) et d’un mot clé de
coder de façon bien plus efficace un message. Chaque lettre se voit substituer une autre lettre mais
décalée par le mot clé. Il s’agit d’un codage poly-alphabétique.

pythagore est codé en PJZVREHYQ avec la clé ALGORYTHME

Ainsi lorsque la lettre correspondante du mot clé est A, il n’y a pas de décalage, lorsque la lettre est B,
il y a un décalage de 1, C un décalage de 2 et ainsi de suite...

Dans cet exemple le mot clé est plus long que le message, mais c’est rarement le cas, le mot clé devra
être répété autant de fois que nécessaire pour avoir une longueur au moins égale au message à coder.
Mot clé

Message à coder

a) Codage :
Vous allez repartir du programme td code de vigenère pour créer votre procédure de codage avec le
code de Vigenère.

Voici le message que nous allons coder avec la clé «vhugo»: (il est fourni en bas du programme après
le #)

demaindeslaubealheureoublanchitlacampagnejepartiraivoistujesaisquetumattendsjira
iparlaforetjiraiparlamontagnejenepuisdemeurerloindetoipluslongtempsjemarcheraile
syeuxfixessurmespenseessansrienvoiraudehorssansentendreaucunbruitseulinconnule
doscourbelesmainscroiseestristeetlejourpourmoiseracommelanuitjeneregarderainilor
dusoirquitombenilesvoilesauloindescendantversharfleuretquandjarriveraijemettraisu
rtatombeunbouquetdehouxvertetdebruyereenfleur

Première question : Il faut répéter la clé suffisamment de fois pour qu’il puisse être utilisé dans les
opérations de codage et de codage, créez une clef plus longue que le message m.

Deuxième question : Parcourez maintenant les caractères du message m en parallèle des caractères de
la clef, utilisez la procédure Cesar pour créer le mot codé.

Troisième question : Testez votre programme en utilisant aa, puis yy comme mot clé, que se passe t-
il ? Testez enfin avec le mot clé «vhugo». Testez alors l’attaque fréquentielle, qu’en concluez vous ?
b) Décodage :
Quatrième question : Vous allez maintenant définir une procédure DecodageVigenere(m,cle) ,
inspirez-vous de la procédure Vigenere(m,cle).

Cinquième question : Testez votre programme en décodant le texte précédemment codé (vous pouvez
utiliser les procédures à la « chaîne »)

c) Attaque du code :
Nous allons procéder par attaques fréquentielles en supposant que nous connaissons la longueur de la
clé. Nous essaierons ensuite plusieurs longueurs de clés possibles.

Vous terminerez en essayant de décoder le texte ci dessous (qui sera fourni en bas du programme après
le second #)

'lsysjlrouptwwbwibiuexiaxuarmclfsymczvoqwcxrsxztgvddwrhpbdmikgarrifcfwvtxpqhxtfrgoepvefrgwtkh
vihekzdwynuexihhwgqshygbhxgxuswwxejipfaxiourxjwwqsjlusuzpbvrhrxwpssentkhsehwgalrtvggwppjw
cqwtlvqrrcnoclujbeflexmhopmcxghwsxjwwsshtkgqytecprltfgzdfdagahgpoqioexmfwuidgggwltntsxbatdc
kibxnoeswxosqsjlpspeczkcqwfnwbmsjkuiuhtnzrdrheggfeuxujrmhbpgqsjlghlsclsihpfnggxrhjwwdxixprlsc
lnojpdbtshxqbgbtytfkghvtnzoyiregjhrikgquijqpcxwcxesvwxhpggcrkqwuitmsidrsjwsoujxdwvxghecqxgxw
besckgddwracigrdnuduictkhxrtmqwoichwguirbvwrrhwggyiglifryexuoxxdntrxtdxnshrdndzlecmnvlztknoe
swxosoeqhjspirtxcxppbvrlvtmwsvndeksoeqhjspiatdckibxghqsjlcjlsclvcxwsnisqmtlqiyicmkzpegkkjdmiw
gjdrifqbfltoczhxsxrovwtkfsvrjbvgeppgevhwgxvcxgwtphoisxuglrsxnoomvggrxrhxkbgyvtnphhjggvdrrags
wgtgggwujtwadxxgsirrhtughcpbvsqjxgfsyecmwbfeuxefhqtxrilwtloolwgtxwvjpenolxxesihpdguolqtxvexsc
tkahppoksoeqhjspiatdckibxeoysjecwwhxkgcqekbpuweclnoeswxosoeqhjspitmpcxwkbxwrrhwgzdmgw
whhqel'

Sixième question : Ouvrez le programme td attaque code vigenère, et dans la procédure


AttVigenere(m) vous allez créer une liste lis de n chaînes de caractères vides.

Septième question : Il s’agit de séparer m en n sous listes (fonction de la taille de la clé supposée n), si
on prend n=5 par exemple :
- les 1°,6°,11°,... caractères de m devront être dans le premier élément de la liste lis[0]
- les 2°,7°,12°,... devront être dans le second élément de la liste lis[1]
- etc.

Huitième question : Nous allons procéder par attaque fréquentielle sur chacune de ces sous listes. En
déduire à chaque fois la lettre correspondant au décalage renvoyé par la procédure AttFreq(m) . En
déduire le mot code. Tester le résultat pour le message codé avec « vhugo ».

Le problème est que la longueur de la clé nous est, a priori, inconnue, c’est pour cela qu’il va
également falloir faire une attaque en force brute en testant toutes les longueurs de clé de 1 à 10
(uniquement en affichant les 40 premiers caractères).

Neuvième question : Mettez en place cette dernière stratégie pour le message précédemment codé
avec « vhugo », essayez également de voir si ça fonctionne pour d’autres clés.

Dixième question : Déterminez maintenant la clé du texte inconnu, et décodez-le.

Question subsidiaire : Il serait également intéressant de ne pas avoir à lire toutes les combinaisons
possibles et choisir automatiquement les meilleures combinaisons, proposer une solution ?

Vous aimerez peut-être aussi