kryptoanaliza
z szyfrogramem wskazanym przez kolegęunknown
plain_text
a year ago
2.6 kB
9
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...