Le ciphertext étant :
Gqfltwj emgj clgfv ! Aqltj rjqhjsksg ekxuaqs, ua xtwk
n'feuguvwb gkwp xwj, ujts f'npxkqvjgw nw tjuwcz
ugwygjtfkf qz uw efezg sqk gspwonu. Jgsfwb-aqmu f
Pspygk nj 29 cntnn hqzt dg igtwy fw xtvjg rkkunqf.
il faut prendre en compte que le chiffre de Vigénère ne supporte que les caractères de l’alphabet (A-Z). De base, nous pouvons donc écarter les espaces, la ponctuation, les chiffres et tous autres caractères. Le chiffre de Vigénère ne fait pas de différence entre minuscule et majuscule, nous pouvons donc travailler sur un plan ou sur l’autre sans que cela n’affecte le déchiffrement.
Ici, nous allons travailler sur plan “majuscule”.
Notre message en plaintext “standarisé” est donc :
GQFLTWJEMGJCLGFVAQLTJRJQHJSKSGEKXUAQSUAXTWKNFEUGUVWBGKWPXWJUJTSFNPXKQVJGWNWTJUWCZUGWYGJTFKFQZUWEFEZGSQKGSPWONUJGSFWBAQMUFPSPYGKNJCNTNNHQZTDGIGTWYFWXTVJGRKKUNQF
Le chiffre de Vigenère est un énorme tableau avec en abscisse et en ordonnée la lettre en clair et la lettre de la clé permettant soit de chiffrer soit de déchiffrer. Une méthode mathématique simple permet de définir une méthode de déchiffrement, par exemple :
A = 0, B = 1, C = 2, etc...
Cela veut dire que, avec une lettre A et une clef à A, nous aurons un résultat de chiffrement à ‘A’ (A(0) + A(0) = A(0))
- Si nous prenons
plain('B') = 1
,key('A') = 0
, alors1+0 = 1 = cipher('B')
. - Si nous prenons
plain('J') = 9
,key('F') = 6
, alors9+6 = 15 = cipher('O')
.
Et nous avons une bordure basse (A = 0
) et une bordure haute (Z = 26
), il nous faudra donc “modulé” tout ceci (% 26
).
Pour notre code, nous allons convertir tous nos caractères en décimal et les placer dans une plage entre 0 et 26 pour reprendre notre “A=0, Z=26”. Et pour notre clef, nous allons faire très simple, nous allons simplement “étendre” (expand) pour quelle soit à la taille (ou supérieure) à notre texte. Puis, quand nous aurons effectué notre calcul de déchiffrement, nous allons reconvertir le résultat pour le remettre sur un plan ASCII (ou A=65 et Z=90)
Voici le code Python :
key = "FCSC"
# read the plaintext (stored in file)
with open("ciphertext") as file:
ciphertext = file.read()
# enlarge your key !
expand_key = key * (len(ciphertext)//len(key))
key_index = 0
for letter in ciphertext:
# only char between A and Z
if 64 < ord(letter.upper()) < 91:
# convert to decimal, and shift to range 0-26
# 65 == 'A'
l = ord(letter.upper()) - 65
k = ord(expand_key[key_index]) - 65
# decrypt the cipher-letter with the key-letter
p = (l - k) % 26
# come back to ascii range
print(chr(p+65), end="")
key_index += 1
Si nous lançons notre programme :
$ ./vigenere.py
BONJOURCHERAGENTVOTREPROCHAINEMISSIONSIVOUSLACCEPTEZBIENSURSERADINFILTRERLERESEAUSOUTERRAINOUSECACHENOSENNEMISRENDEZVOUSANANTESLEAVRILPOURLEDEBUTDEVOTREMISSION
A priori, on nous donne rendez-vous à Nantes :)