kryptoanaliza
z szyfrogramem wskazanym przez kolegęunknown
plain_text
5 months ago
2.6 kB
5
Indexable
import collections prawdopodobienstwa_liter = { 'A': 0.082, 'B': 0.082, 'C': 0.015, 'D': 0.028, 'E': 0.043, 'F': 0.127, 'G': 0.022, 'H': 0.061, 'I': 0.070, 'J': 0.002, 'K': 0.008, 'L': 0.040, 'M': 0.067, 'N': 0.075, 'O': 0.019, 'P': 0.019, 'Q': 0.001, 'R': 0.060, 'S': 0.063, 'T': 0.091, 'U': 0.010, 'V': 0.010, 'W': 0.023, 'X': 0.023, 'Y': 0.001, 'Z': 0.001 } def mod_inverse(a, m): a = a % m for x in range(1, m): if (a * x) % m == 1: return x raise ValueError(f"Brak odwrotności modularnej dla a = {a} i m = {m}") def deszyfruj_affine(szyfrogram, a, b): odszyfrowany_tekst = '' try: a_inv = mod_inverse(a, 26) except ValueError: return '' for znak in szyfrogram: if znak.isalpha(): znak = znak.upper() odszyfrowany_znak = (a_inv * (ord(znak) - ord('A') - b)) % 26 odszyfrowany_tekst += chr(odszyfrowany_znak + ord('A')) else: odszyfrowany_tekst += znak return odszyfrowany_tekst def analiza_czestotliwosci(szyfrogram): liczba_liter = collections.Counter(szyfrogram.upper()) suma_liter = sum(liczba_liter[znak] for znak in liczba_liter if znak.isalpha()) rozklad_czestotliwosci = {znak: licznik / suma_liter for znak, licznik in liczba_liter.items() if znak.isalpha()} return rozklad_czestotliwosci def roznica_czestotliwosci(czestotliwosci, prawdopodobienstwa): roznica = 0 for litera in czestotliwosci: if litera in prawdopodobienstwa: roznica += abs(czestotliwosci[litera] - prawdopodobienstwa[litera]) return roznica szyfrogram = "ZRWU LAJC OWLL NC ZRC XCIZR AH QC" czestotliwosci_szyfrogramu = analiza_czestotliwosci(szyfrogram) print("Częstotliwości liter w szyfrogramie:", czestotliwosci_szyfrogramu) wszystkie_wyniki = [] for a in range(1, 26): try: mod_inverse(a, 26) except ValueError: continue for b in range(0, 26): odszyfrowany_tekst = deszyfruj_affine(szyfrogram, a, b) if odszyfrowany_tekst == '': continue czestotliwosci_odszyfrowanego = analiza_czestotliwosci(odszyfrowany_tekst) roznica = roznica_czestotliwosci(czestotliwosci_odszyfrowanego, prawdopodobienstwa_liter) wszystkie_wyniki.append((a, b, roznica, odszyfrowany_tekst)) wszystkie_wyniki.sort(key=lambda x: x[2]) print("\nWszystkie możliwe wyniki (posortowane):") for wynik in wszystkie_wyniki: a, b, roznica, tekst = wynik print(f"a = {a}, b = {b}, różnica = {roznica}") print(f"Odszyfrowany tekst: {tekst}\n")
Editor is loading...