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.

Istnieje jednakże prostszy, szczególnie dla celów implementacyjnych, sposób deszyfrowania. Wymaga on wykonania operacji „odwrócenia” hasła, jak poniżej:

K2(i) = [26 – K(i)] mod 26

gdzie K(i) – kolejna litera słowa kluczowego, numerowane A=0, B=1 itd., a K2(i) – kolejna litera hasła „odwróconego”. 26 oznacza liczbę liter alfabetu łacińskiego.

Efektem działania takiego przekształcenia dla hasła „TAJNE” będzie słowo „HARNW”..


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

  1. text = 'informatyka jest fajna'
  2. key = 'tajne'
  3.  
  4. alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  5.  
  6. def vigenere(text, key, alphabet, mode='encrypt'):
  7. message = ''
  8. key_len = len(key)
  9. text = text.upper()
  10. key = key.upper()
  11.  
  12. for i in range(len(text)):
  13. if text[i] in alphabet:
  14. if mode == 'encrypt':
  15. c = (alphabet.find(text[i]) + (alphabet.find(key[i % key_len]))) % len(alphabet)
  16. elif mode == 'decrypt':
  17. c = (alphabet.find(text[i]) - (alphabet.find(key[i % key_len]))) % len(alphabet)
  18. message += alphabet[c]
  19. else:
  20. message += text[i]
  21.  
  22. return message
  23.  
  24.  
  25. cipher_text = vigenere(text, key, alphabet)
  26. print(cipher_text)
  27. print(vigenere(cipher_text, key, alphabet, 'decrypt'))

Wersja z odwracaniem klucza:

  1. text = 'informatyka jest fajna'
  2. key = 'tajne'
  3.  
  4. alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  5.  
  6. def encrypt(text, key, alphabet):
  7. message = ''
  8. text = text.upper()
  9. key = key.upper().replace(' ', '')
  10. key_len = len(key)
  11. kidx = 0
  12.  
  13. for char in text:
  14. if char in alphabet:
  15. text_index = alphabet.find(char)
  16. key_index = alphabet.find(key[kidx % key_len])
  17. c = (text_index + key_index) % len(alphabet)
  18. kidx+=1
  19. message += alphabet[c]
  20. else:
  21. message += char
  22.  
  23. return message
  24.  
  25. def decrypt(text, key, alphabet):
  26. reversed_key = ''
  27. for c in key.upper().replace(' ', ''):
  28. key_index = (len(alphabet)-alphabet.find(c)) % len(alphabet)
  29. reversed_key += alphabet[key_index]
  30. return encrypt(text, reversed_key, alphabet)
  31.  
  32. cipher_text = encrypt(text, key, alphabet)
  33. print(cipher_text)
  34. print(decrypt(cipher_text, key, alphabet))