X-Git-Url: http://git.tomasm.cz/krypto.git/blobdiff_plain/09f076927cd6294ae6c3db9268496dc3a8fc87f4..9a7f4d2d842d83d05da41586cfa11dab3de162bb:/jakobsen.py diff --git a/jakobsen.py b/jakobsen.py index 25f01dc..0127326 100644 --- a/jakobsen.py +++ b/jakobsen.py @@ -13,13 +13,11 @@ def nova_tabulka(zprava, abc=MABECEDA): for j in abc: tabulka[i][j] = 0 for i in range(len(zprava) - 1): - if zprava[i] in tabulka and zprava[i+1] in tabulka[zprava[i]]: - tabulka[zprava[i]][zprava[i+1]] += 1 + tabulka[zprava[i]][zprava[i+1]] += 1 celkem = sum(sum(tab2.values()) for tab2 in tabulka.values()) - if celkem != 0: - for i in abc: - for j in abc: - tabulka[i][j] /= float(celkem) + for i in abc: + for j in abc: + tabulka[i][j] /= float(celkem) return tabulka def vzdalenost(tab1, tab2, abc=MABECEDA): @@ -51,28 +49,32 @@ class reference: pass def jakobsen(zprava, ref): - slovnik = dict(zip(poradi_dle_frekvence(zprava), ref.poradi)) - tabulka = nova_tabulka(substituce(zprava, slovnik)) - vzdal = vzdalenost(tabulka, ref.tabulka) + slovnik = dict(zip(poradi_dle_frekvence(zprava, ref.abeceda), ref.poradi)) + tabulka = nova_tabulka(substituce(zprava, slovnik, ref.abeceda), ref.abeceda) + vzdal = vzdalenost(tabulka, ref.tabulka, ref.abeceda) vzdal_old = vzdal + 1 while vzdal_old > vzdal: vzdal_old = vzdal for (x, y) in combinations(ref.abeceda, 2): slovnik[x], slovnik[y] = slovnik[y], slovnik[x] - v1 = vzdalenost(nova_tabulka(substituce(zprava, slovnik)), - ref.tabulka) + v1 = vzdalenost(nova_tabulka(substituce(zprava, slovnik, ref.abeceda), ref.abeceda), + ref.tabulka, ref.abeceda) if v1 < vzdal: vzdal = v1 else: slovnik[x], slovnik[y] = slovnik[y], slovnik[x] + return slovnik + - return '\n'.join([''.join(substituce(zprava, slovnik)), - ' '.join(ref.abeceda), - ' '.join([slovnik[c] for c in ref.abeceda])]) - -def desifruj(zprava, refs): - f = open(refs, 'rb') +def desifruj(zprava, mezery=True): + if mezery: + f = open('ref') + else: + f = open('refb') ref = pickle.load(f) f.close() - return jakobsen(zprava, ref) + slovnik = jakobsen(ocesat(zprava, mezery), ref) + return '\n'.join([''.join(substituce(zprava, slovnik, ref.abeceda)), + ' '.join(ref.abeceda), + ' '.join([slovnik[c] for c in ref.abeceda])])