9 jupytext_version: 1.3.4
11 display_name: Python 3
18 currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
19 parentdir = os.path.dirname(currentdir)
20 sys.path.insert(0,parentdir)
24 from cipher.caesar import *
25 from cipher.affine import *
26 from cipher.keyword_cipher import *
27 from cipher.column_transposition import *
28 from cipher.vigenere import *
29 from cipher.autokey import *
31 from support.text_prettify import *
32 from support.utilities import *
33 from support.plot_frequency_histogram import *
39 plaintext_a_filename = f'{challenge_number}a.plaintext'
40 plaintext_b_filename = f'{challenge_number}b.plaintext'
41 ciphertext_a_filename = f'{challenge_number}a.ciphertext'
42 ciphertext_b_filename = f'{challenge_number}b.ciphertext'
46 ca = open(ciphertext_a_filename).read()
47 cb = open(ciphertext_b_filename).read()
59 fc = collections.Counter(sca)
60 plot_frequency_histogram(fc, sort_key=fc.get)
64 kworda, score = vigenere_frequency_break(sca, fitness=Ptrigrams)
69 pa = vigenere_decipher(sca, kworda)
74 fpa = lcat(tpack(segment(pa)))
79 open(plaintext_a_filename, 'w').write(fpa)
85 with open('morse.txt') as f:
86 for line in f.readlines():
94 mcb = wcat(cat(morse_letters[l] for l in w.split()) for w in cb.split(' / '))
100 fc = collections.Counter(sanitise(mcb))
101 plot_frequency_histogram(fc, sort_key=fc.get)
105 index_of_coincidence_scan(smcb, max_key_length=30)
109 kwordb, score = vigenere_frequency_break(smcb, fitness=Ptrigrams, max_key_length=30)
114 kwordb, score = autokey_sa_break(smcb, fitness=Ptrigrams, max_keylength=10, max_iterations=5000)
119 autokey_decipher(smcb, kwordb)
123 tgs = [smcb[i:i+3] for i in range(len(smcb)-2)]
124 collections.Counter(tgs).most_common(10)
128 wcat(w for w in mcb.split() if len(w) == 3)
132 wcat(w if len(w) >= 3 and w.lower() in keywords else w.lower()
133 for w in mcb.split())
137 [(i, w) for i, w in enumerate(mcb.split())
139 if w.lower() in keywords ]
143 [(i, w) for i, w in enumerate(mcb.split())
148 pb = wcat(caesar_decipher(w, i + 1) for i, w in enumerate(mcb.split()))
153 open(plaintext_b_filename, 'w').write(pb)