bugfix
[krypto.git] / krypto.py
1 #!/usr/bin/env python
2
3 """CL rozhrani pro sadu kryptoanalytickych nastroju."""
4
5 import sys
6 import pickle
7 import argparse
8
9 from ocesavac import ocesat
10 import jakobsen
11 from jakobsen import reference
12 import koincidence
13 import posuny
14 from spolecne import ABECEDA
15 import vigenere
16
17 if len(sys.argv) > 1:
18     opsny = sys.argv[1]
19 else:
20     opsny = ''
21
22 telo = sys.stdin.read()
23 zprava = telo.strip().upper()
24
25 # Prepinani spacemodu
26 mod_m = False
27 mod_x = False
28 if 'X' in opsny:
29     mod_x = True
30 if 'M' in opsny:
31     mod_m = True
32 if 'A' in opsny:
33     mod_x = True
34     mod_m = True
35 if not mod_m and not mod_x:
36     if ' ' in ocesat(zprava, True)[1:-1]:
37         mod_m = True
38         print "Automaticky zvolena analyza s mezerami."
39     else:
40         mod_x = True
41         print "Automaticky zvolena analyza bez mezer."
42     
43 # Zakladni udaje
44 print "\nZakladni udaje:"
45 if mod_m:
46     print ("Delka zpravy (vcetne mezer a zvlastnich znaku: " +
47         str(len(zprava)))
48 print ("Delka zpravy (bez mezer a zvlastnich znaku): " +
49     str(len(ocesat(zprava, False))))
50
51 # Prumerna delka slova
52 if mod_m:
53     print "\nPrumerna delka slova:"
54     slova = ocesat(zprava, True).split()
55     print ('{0:.3}'.format(float(sum([len(word) for word in slova]))/len(slova)))
56
57 # Frekvence znaku 
58 print "\nFrekvencni analyza:"
59 freq = dict()
60 for char in ABECEDA:
61     freq[char] = 0
62 for char in zprava:
63     if char in freq:
64         freq[char] += 1
65 celkem = sum(freq.values())
66 for char in sorted(freq, key=freq.get, reverse=True):
67     print ('{0} {1:>3} {2:>6.2%}'.format(char, freq[char],
68                    float(freq[char])/celkem))
69
70 # Index koincidence
71 if mod_m:
72     print "\nIndex koincidence (s mezerami):"
73     print ('{0:.2%}'.format(
74                    koincidence.index_koincidence(zprava, True)))
75 if mod_x and len(zprava) >= 30:
76     #TODO tady by se spravne mela porovnavat delka ocesane zpravy
77     print "\nIndexy koincidence (bez mezer):"
78     print koincidence.tabulka_indexu(zprava)
79
80 # Vigenere
81 if 'V' in opsny:
82     print "\nHeslo k Vigenerovi (" + opsny[-1] + "):"
83     vig_heslo, vig_text = vigenere.vsechno(zprava, int(opsny[-1]))
84     print vig_heslo
85     print vig_text
86
87 # Jakobsen
88 if mod_m:
89     print "\nJakobsen (s mezerami):"
90     print jakobsen.desifruj(zprava)
91 if mod_x:
92     print "\nJakobsen (bez mezer):"
93     print jakobsen.desifruj(zprava, False)
94
95 # Posuny v abecede
96 (posun, posunuty_text) = posuny.nejlepsi(zprava)
97 if 'P' in opsny or 'A' in opsny:
98     print "\nPosuny v abecede (nejlepsi posun {0}):".format(posun)
99     print("\n".join("{0:>2} {1}".format(
100                    i + 1, posuny.vsechny(zprava)[i]) for i in range(26)))
101 else:
102     print "\nNejlepsi posun ({0}):".format(posun)
103     print posunuty_text
104
105 # Bigramy
106 if 'B' in opsny or 'A' in opsny:
107     print "\nBigramy podle cetnosti:"
108     bigramy = dict()
109     for i in ABECEDA:
110         for j in ABECEDA:
111             bigramy[i+j] = 0
112     for i in range(0, len(zprava)-1):
113         if zprava[i:i+2] in bigramy:
114             bigramy[zprava[i:i+2]] += 1
115     celkem = sum(bigramy.values())
116     for char in sorted(bigramy, key=bigramy.get, reverse=True):
117         if bigramy[char] == 0:
118             break
119         print('{0} {1:>3} {2:>6.2%}'.format(char, bigramy[char],
120                        float(bigramy[char])/celkem))