Solution de sorgs-varte pour À l'aise

intro crypto

27 décembre 2023

Table des matières

Description

Un petit challenge de décodage d’une phrase. Une recherche google et une lecture wikipedia du Vigénère pour avoir la formule de codage/décodage.

En désignant la ie lettre du texte clair par Texte[i], la ie du chiffré par Chiffré[i], et la ie lettre de la clé, répétée suffisamment de fois, par Clés[i], elle se formalise par :

  • Chiffré[i] = (Texte[i] + Clés[i]) modulo 26
  • Texte[i] = (Chiffré[i] - Clés[i]) modulo 26

Solution

import string

list_alpha = list(string.ascii_lowercase)
print(list_alpha)
print("hackropole1")

str_to_decode = """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"

# Chiffré[i] = (Texte[i] + Clés[i]) modulo 26
# Texte[i] = (Chiffré[i] - Clés[i]) modulo 26

def crypte(text, key):
    coded_str = ""
    delta = 0
    for i in range(0, len(text)):
        if text[i].lower() not in list_alpha:
            coded_str += text[i]
            delta+=1
            continue
        letter_index = (list_alpha.index(text[i].lower()) + list_alpha.index(key[i%len(key)-delta%len(key)].lower())) % 26
        letter = list_alpha[letter_index]
        coded_str += letter

    return coded_str

def decrypte(text, key):
    decoded_str = ""
    delta = 0
    for i in range(0, len(text)):
        if text[i].lower() not in list_alpha:
            decoded_str += text[i]
            delta+=1
            continue
        letter_index = (list_alpha.index(text[i].lower()) - list_alpha.index(key[i%len(key)-delta%len(key)].lower())) % 26
        letter = list_alpha[letter_index]
        decoded_str += letter

    return decoded_str

result = decrypte(str_to_decode, key)
print(result)
print(crypte(result, key))