Table des matières
Description
Cette épreuve vous propose de déchiffrer un message chiffré avec la méthode inventée par Blaise de Vigénère.
La clé est FCSC et le message chiffré est :
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.
Le flag est le nom de la ville mentionnée dans ce message.
Solution
import string
ASCII = [*string.ascii_letters]
LOWER = [*string.ascii_lowercase]
UPPER = [*string.ascii_uppercase]
def decode_vigenere(key, txt):
i_key = 0
output = []
for i in range(len(txt)):
character = txt[i]
if character in ASCII:
# La table est remontante, on opère donc une soustraction par les indexes (A: ABC, B: BCD, etc...).
reindex = LOWER.index(character.lower()) - LOWER.index(key[i_key])
# Ajoute la lettre décodée, en respectant sa casse.
output.append(LOWER[reindex] if character in LOWER else UPPER[reindex])
# Mise à jour de l'index de la clé.
i_key = (i_key + 1) % len(key)
# Pas de changement pour les autres caractères.
else:
output.append(character)
return ''.join(output)
txt = """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."""
key = "FCSC".lower()
print( decode_vigenere(key, txt) )
Bonjour cher agent ! Votre prochaine mission, si vous
l'acceptez bien sur, sera d'infiltrer le reseau
souterrain ou se cache nos ennemis. Rendez-vous a
Nantes le 29 avril pour le debut de votre mission.
Fonctionnement
Le code ci-dessus parcourt chaque caractère du texte et applique la logique suivante :
-
Si le caractère appartient aux lettres ASCII :
- On détermine :
- L’indice du caractère dans l’alphabet.
- L’indice correspondant du caractère de la clé.
Notez que lower est utilisé ici pour traiter indifféremment les majuscules des minuscules.
- En s’appuyant sur le fait que la table de Vigenère est remontante, on calcule :
Indice Décodé = Indice Texte - Indice Clé
- Avec cet indice, on retrouve la lettre décodée dans la liste alphabétique correspondante (majuscule ou minuscule) et on l’ajoute au texte décodé.
- On incrémente l’indice de la clé (en veillant à ce qu’il soit borné par sa longueur) pour préparer la prochaine itération.
- On détermine :
-
Si le caractère n’est pas une lettre ASCII :
- On le conserve tel quel dans le texte décodé.
Enfin, une fois le traitement terminé, le texte entier décodé est affiché.