Szyfr Vigenère’a
Program symuluje działanie szyfru Vigenère’a czyli udoskonalonego szyfru Cezara
Deszyfrowanie w powyższym przykładzie odbywa się na zasadzie "odwróconego" szyfrowania - zobacz opis w wikipedii.
Zobacz:
- szyfrowania szyfrem Vigenère’a, to kolejna odmiana szyfru Cezara, gdzie rolę klucza spełnia jakieś słowo np. TAJNE, a zaszyfrowany znak uzyskujemy z odpowiednio zbudowanej tablicy znaków - patrz link powyżej;
Przykładowa implementacja w Pythonie
text = 'informatyka jest fajna' key = 'tajne' alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' def vigenere(text, key, alphabet, mode='encrypt'): message = '' key_len = len(key) text = text.upper() key = key.upper() for i in range(len(text)): if text[i] in alphabet: if mode == 'encrypt': c = (alphabet.find(text[i]) + (alphabet.find(key[i % key_len]))) % len(alphabet) elif mode == 'decrypt': c = (alphabet.find(text[i]) - (alphabet.find(key[i % key_len]))) % len(alphabet) message += alphabet[c] else: message += text[i] return message cipher_text = vigenere(text, key, alphabet) print(cipher_text) print(vigenere(cipher_text, key, alphabet, 'decrypt'))
Wersja z odwracaniem klucza:
text = 'informatyka jest fajna' key = 'tajne' alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' def encrypt(text, key, alphabet): message = '' text = text.upper() key = key.upper().replace(' ', '') key_len = len(key) kidx = 0 for char in text: if char in alphabet: text_index = alphabet.find(char) key_index = alphabet.find(key[kidx % key_len]) c = (text_index + key_index) % len(alphabet) kidx+=1 message += alphabet[c] else: message += char return message def decrypt(text, key, alphabet): reversed_key = '' for c in key.upper().replace(' ', ''): key_index = (len(alphabet)-alphabet.find(c)) % len(alphabet) reversed_key += alphabet[key_index] return encrypt(text, reversed_key, alphabet) cipher_text = encrypt(text, key, alphabet) print(cipher_text) print(decrypt(cipher_text, key, alphabet))