3 """CL rozhrani pro sadu kryptoanalytickych nastroju."""
9 from ocesavac import ocesat
11 from jakobsen import reference
14 from spolecne import ABECEDA
17 def analyza(zprava, opsny):
30 if not mod_m and not mod_x:
31 if ' ' in ocesat(zprava, True)[1:-1]:
33 analyza.append("Automaticky zvolena analyza s mezerami.")
36 analyza.append("Automaticky zvolena analyza bez mezer.")
39 analyza.append("\nZakladni udaje:")
41 analyza.append("Delka zpravy (vcetne mezer a zvlastnich znaku: " +
43 analyza.append("Delka zpravy (bez mezer a zvlastnich znaku): " +
44 str(len(ocesat(zprava, False))))
46 # Prumerna delka slova
48 analyza.append("\nPrumerna delka slova:")
49 slova = ocesat(zprava, True).split()
50 analyza.append('{0:.3}'.format(float(sum([len(word) for word in slova]))/len(slova)))
53 analyza.append("\nFrekvencni analyza:")
60 celkem = sum(freq.values())
61 for char in sorted(freq, key=freq.get, reverse=True):
62 analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, freq[char],
63 float(freq[char])/celkem))
67 analyza.append("\nIndex koincidence (s mezerami):")
68 analyza.append('{0:.2%}'.format(
69 koincidence.index_koincidence(zprava, True)))
71 #TODO tady by se spravne mela porovnavat delka ocesane zpravy
72 analyza.append("\nIndexy koincidence (bez mezer):")
73 analyza.append(koincidence.tabulka_indexu(zprava))
78 analyza.append("\nHeslo k Vigenerovi (" + opsny[-1] + "):")
79 vig_heslo, vig_text = vigenere.vsechno(zprava, int(opsny[-1]))
80 analyza.append(vig_heslo)
81 analyza.append(vig_text)
85 analyza.append("\nJakobsen (s mezerami):")
86 analyza.append(jakobsen.desifruj(zprava))
88 analyza.append("\nJakobsen (bez mezer):")
89 analyza.append(jakobsen.desifruj(zprava, False))
92 (posun, posunuty_text) = posuny.nejlepsi(zprava)
93 if 'P' in opsny or 'A' in opsny:
94 analyza.append("\nPosuny v abecede (nejlepsi posun {0}):".format(posun))
95 analyza.append("\n".join("{0:>2} {1}".format(
96 i + 1, posuny.vsechny(zprava)[i]) for i in range(26)))
98 analyza.append("\nNejlepsi posun ({0}):".format(posun))
99 analyza.append(posunuty_text)
102 if 'B' in opsny or 'A' in opsny:
103 analyza.append("\nBigramy podle cetnosti:")
108 for i in range(0, len(zprava)-1):
109 if zprava[i:i+2] in bigramy:
110 bigramy[zprava[i:i+2]] += 1
111 celkem = sum(bigramy.values())
112 for char in sorted(bigramy, key=bigramy.get, reverse=True):
113 if bigramy[char] == 0:
115 analyza.append('{0} {1:>3} {2:>6.2%}'.format(char, bigramy[char],
116 float(bigramy[char])/celkem))
117 return '\n'.join(analyza)
119 if __name__ == '__main__':
120 if len(sys.argv) > 1:
125 telo = sys.stdin.read()
126 zprava = telo.strip().upper()
127 print(analyza(zprava, opsny))