#!/usr/bin/env python # 29-5-5: Zašifrovaný text crypted = input("Zadej šifrovaný text: ") known = input("Zadej známou větu: ") N = len(crypted) V = len(known) assert V <= N, "Známá věta musí být kratší, než vstupní text." # Odečte dvě písmena def chr_sub(a, b): return chr((ord(a) - ord(b) + 26) % 26 + ord('a')) def try_key_length(K): # Předpočítáme si upravené posloupnosti # Konstrukce "".join() jen vytvoří string z generátoru znaků diff_crypted = "".join(chr_sub(crypted[i], crypted[i + K]) for i in range(N - K)) diff_known = "".join(chr_sub(known[i], known[i + K]) for i in range(V - K)) # Zkusíme najít známou větu v zašifrované p = diff_crypted.find(diff_known) while p != -1: rot_key = "".join(chr_sub(crypted[i], known[i - p]) for i in range(p, p + K)) offset = K - p % K # Vrátíme možný klíč yield rot_key[offset:] + rot_key[:offset] p = diff_crypted.find(diff_known, p + 1) k = 1 # Pro k = V už najdeme větu úplně všude while k < V: for key in try_key_length(k): decrypted = "".join(chr_sub(crypted[i], key[i % k]) for i in range(N)) print() print("Možný klíč:", key) print("Dešifrovaný text:", decrypted) k += 1