Advertisement
Guest User

Vigenerova sifra

a guest
Dec 16th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.35 KB | None | 0 0
  1. # Pouziva sa kniznica itertools a jej funkcia product na generovanie vsetkych moznosti (variacii) / chceme poznat vsetky kluce
  2. from itertools import product
  3.  
  4. # Zasifrovana sprava (cast z nej, mozes nahradit za cely text)
  5. cipher_text = 'RSX ZRTOGM AQ MYWGHYHIAY DI RNETEN FKJIV.'
  6.  
  7. # Pomocna funkcia na detekciu ci ide o male pismenko
  8. def is_upper_case(char):
  9.     return 65 <= char and char <= 90
  10.  
  11. # Obdobne ci ide o velke pismenko
  12. def is_lower_case(char):
  13.     return 97 <= char and char <= 122
  14.  
  15. # Ide o pismeno vobec?
  16. def is_letter(char):
  17.     return is_upper_case(char) or is_lower_case(char)
  18.  
  19. # Sifrovanie pomocou vigenerovej sifry (aj desifrovanie, kedze sifra pracuje rovnako iba kluc sa "preklapa")
  20. def crypt(input_text, key):
  21.     output_text = ''
  22.     z = 0
  23.     for index in range(0, len(input_text)):
  24.         c = ord(input_text[index])
  25.         output_character = ''
  26.         if (is_upper_case(c)):
  27.             output_character = chr((c - 65 + key[z % len(key)]) % 26 + 65)
  28.             z += 1
  29.         elif (is_lower_case(c)):
  30.             output_character = chr((c - 97 + key[z % len(key)]) % 26 + 97)
  31.             z += 1
  32.         else:
  33.             output_character = chr(c)
  34.  
  35.         output_text += output_character
  36.  
  37.     return output_text
  38.  
  39. # Ziskanie numerickych hodnot kluca
  40. def filter_key(key):
  41.     result = []
  42.     for index in range(0, len(key)):
  43.         c = ord(key[index])
  44.         if (is_letter(c)):
  45.             result.append((c - 65) % 32)
  46.    
  47.     return result
  48.  
  49. # Vypis do konzoly a suboru "vystup.txt", ak chces pustit druhy a treti krat, zmaz tento subor "vystup.txt" najprv
  50. def vypis(text):
  51.     print(text)
  52.     with open('vystup.txt', 'a') as my_file:
  53.         my_file.write(text + '\n')
  54.         my_file.close()
  55.  
  56. # Mozne pismenka v kluci
  57. ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
  58.  
  59. # Dlzka kluca
  60. KEY_LENGTH = 5
  61.  
  62. # Ziskanie vsetkych variacii (moznych klucov)
  63. POSSIBLE_KEYS = [''.join(i) for i in product(ALPHABET, repeat = KEY_LENGTH)]
  64.  
  65. # Dekodovanie pomocou klucov
  66. for key in POSSIBLE_KEYS:
  67.  
  68.     transformed_key = filter_key(key)
  69.     for i in range(0, len(transformed_key)):
  70.         transformed_key[i] = 26 - transformed_key[i] % 26
  71.  
  72.     vypis('Key: ' + key)
  73.     vypis("Decoded: " + crypt(cipher_text, transformed_key) + '\n')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement