kryptoanaliza

z szyfrogramem wskazanym przez kolegę
 avatar
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...