diff --git a/Algorithms/cryptology/vigenere_cipher/vigenere.py b/Algorithms/cryptology/vigenere_cipher/vigenere.py index 69a71af..c2bde0d 100644 --- a/Algorithms/cryptology/vigenere_cipher/vigenere.py +++ b/Algorithms/cryptology/vigenere_cipher/vigenere.py @@ -10,7 +10,8 @@ * 2019-11-07 Initial programming """ - +import re +from collections import Counter alphabet = "abcdefghijklmnopqrstuvwxyz " @@ -49,16 +50,48 @@ def decrypt(cipher, key): return decrypted +# Nettoyage et préparation du texte +def clean_text(text): + return re.sub(r'[^a-z]', '', text.lower()) + +# Index de Coïncidence +def index_of_coincidence(text): + N = len(text) + freqs = Counter(text) + return sum(f * (f - 1) for f in freqs.values()) / (N * (N - 1)) if N > 1 else 0 + +# Estimation de la longueur de la clé +def estimate_key_length(text, max_len=20): + ic_scores = [] + for key_len in range(1, max_len + 1): + groups = [text[i::key_len] for i in range(key_len)] + avg_ic = sum(index_of_coincidence(group) for group in groups) / key_len + ic_scores.append((key_len, avg_ic)) + likely_lengths = sorted(ic_scores, key=lambda x: -x[1]) + return likely_lengths[0][0] + +# Déduire la clé par fréquence +def deduce_key(text, key_len): + alphabet = "abcdefghijklmnopqrstuvwxyz" + letter_to_index = {ch: idx for idx, ch in enumerate(alphabet)} + index_to_letter = {idx: ch for idx, ch in enumerate(alphabet)} + key = '' + + for i in range(key_len): + group = text[i::key_len] + freq = Counter(group) + most_common = freq.most_common(1)[0][0] + shift = (letter_to_index[most_common] - letter_to_index['e']) % 26 + key += index_to_letter[shift] + return key def main(): - message = "i loove peanuts" - key = "banana" + message = "gagoclcqgzhzkwnqadgvvqbxtmnqgugczdcgjmumweuqsgirrceqffpxtugipbtqrvwfhqimntgfguwvnujvgaqggccugzogglwzognivugwgugzhtqurxsxriugbvritazipmvmwkgkjmbkgmkxgkcxcusrvbqggfpvgzhiplcuhhwmeqggqcrewitmigzmgzuhcznmuqhgquoqzfkvvmwrutgepiwqvedvgvcusevcpqgspwtuhvtiwciiuipeiegkjarepanmwiowtfsxktuqasnikfeygtgehvpmddswhcuesevlwzbskzkzqfpvwqdekauudrttgedswauusigaxazepbgerlepcdpspinaiifqrmfhgaimnhwqrqgekmpfglttgemiwfnqgdgkjqghganmaggauaiwnmwdgtjirqoyzlgfcznmoqhentkcivpgoqhxcqgzhhwmfqgtqqpfgiqciqoxtmuabeglkehmpowmwktqgzzevikxzvuwwhfekboabkcqvmwruqsgiegtcduiepgywegmrxoxgmvapckywqcyniugwvfmfullkdgdgrwzcuheoiueslpmpgwxrzqrcefmfqgjqzoqgjrmeffenmuemriqvmwipbnqgcwmwdgtgzfgsjnikegekmpfsevzghcmtcpqffplggfhgpczqygcpnfeuvqgslzcpqhivmxuccgvvqpetjqgwcnmgocqomraiiwvedwqgxcdtfkagzgifmvmqycvvximuikqbkfmunzseafqvfwqnxshgarmbjgbfqgetmvqgstcuciiompfocncoqghwvtqtcgbfqqvkavmzgwqufcyvzgfcddikfoypwkdzvuzkhspcqpqgkcxcusrviidoefaeaituaqgfuuqnzmexikfdcwasgspgpcxskgugzhhgarawktqpqgpgotauegugzhhgogzsvvlgroxkowqgfwanmdiuipfsltlgxomtmv " + key = deduce_key(message, 5) encrypted_message = encrypt(message, key) decrypted_message = decrypt(encrypted_message, key) - print("Original message: " + message) - print("Encrypted message: " + encrypted_message) - print("Decrypted message: " + decrypted_message) - + + print("key: " + key) main()