Solution de g0thier pour À l'aise

intro crypto

4 janvier 2025

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 :

  1. 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.
  2. 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é.