Done challenge 9
[cipher-challenge.git] / 2021 / 2021-challenge5.md
1 ---
2 jupyter:
3 jupytext:
4 formats: ipynb,md
5 text_representation:
6 extension: .md
7 format_name: markdown
8 format_version: '1.3'
9 jupytext_version: 1.11.1
10 kernelspec:
11 display_name: Python 3 (ipykernel)
12 language: python
13 name: python3
14 ---
15
16 ```python Collapsed="false"
17 from szyfrow.caesar import *
18 from szyfrow.affine import *
19 from szyfrow.keyword_cipher import *
20 from szyfrow.column_transposition import *
21 from szyfrow.railfence import *
22 from szyfrow.support.text_prettify import *
23
24 import numpy as np
25 import pandas as pd
26 import matplotlib.pyplot as plt
27
28 import collections
29 %matplotlib inline
30 ```
31
32 ```python Collapsed="false"
33 challenge_number = 5
34 plaintext_a_filename = f'plaintext.{challenge_number}a.txt'
35 plaintext_b_filename = f'plaintext.{challenge_number}b.txt'
36 ciphertext_a_filename = f'ciphertext.{challenge_number}a.txt'
37 ciphertext_b_filename = f'ciphertext.{challenge_number}b.txt'
38 ```
39
40 ```python Collapsed="false"
41 ca = open(ciphertext_a_filename).read()
42 cb = open(ciphertext_b_filename).read()
43
44 sca = sanitise(ca)
45 rsca = cat(reversed(sca))
46 scb = sanitise(cb)
47 ```
48
49 ```python
50 sca_counts = collections.Counter(sca)
51 sca_counts
52 ```
53
54 ```python
55 pd.Series(sca_counts).sort_index().plot.bar()
56 ```
57
58 ```python
59 key_a, score_a = railfence_break(sca, fitness=Ptrigrams)
60 print(key_a, '\n')
61 pa = railfence_decipher(sca, key_a)
62 print(pa)
63 ```
64
65 ```python
66 (word_a, fill_a, empty_a), score_a = column_transposition_break(rsca, fitness=Ptrigrams)
67 print(word_a, fill_a, empty_a, '\n')
68 pa = column_transposition_decipher(rsca, word_a, fillcolumnwise=fill_a, emptycolumnwise=empty_a)
69 print(pa)
70 ```
71
72 ```python
73 (word_a, wrap_a), score_a = keyword_break(sca, fitness=Pletters)
74 print(word_a, wrap_a, '\n')
75 pa = keyword_decipher(sca, word_a, wrap_a)
76 print(pa)
77 ```
78
79 ```python
80 word_a, score_a = monoalphabetic_sa_break(sca)
81 print(word_a, '\n')
82 pa = keyword_decipher(sca, word_a)
83 print(pa)
84 ```
85
86 ```python
87 word_a, score_a = vigenere_frequency_break(sca, fitness=Ptrigrams)
88 print(word_a, '\n')
89 pa = vigenere_decipher(sca, word_a)
90 print(pa)
91 ```
92
93 ```python
94 pa = railfence_decipher(sca, key_a)
95 print(prettify(pa))
96 ```
97
98 ```python Collapsed="false"
99 open(plaintext_a_filename, 'w').write(prettify(pa))
100 ```
101
102 ```python
103 morse_chars = 'a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9'.split()
104 # morse_chars
105 ```
106
107 ```python
108 morse_codes = '.- / -... / -.-. / -.. / . / ..-. / --. / .... / .. / .--- / -.- / .-.. / -- / -. / --- / .--. / --.- / .-. / ... / - / ..- / ...- / .-- / -..- / -.-- / --.. / ----- / .---- / ..--- / ...-- / ....- / ..... / -.... / --... / ---.. / ----.'.split(' / ')
109 ```
110
111 ```python
112 char_to_morse = {l: c for l, c in zip(morse_chars, morse_codes)}
113 morse_to_char = {c: l for l, c in zip(morse_chars, morse_codes)}
114 [char_to_morse[l] for l in 'abc']
115 ```
116
117 ```python
118 morse_table = ''.maketrans('AD', '.-')
119 cb_dd = cb.translate(morse_table)
120 cb_words = cb_dd.split(' / ')
121 cb_letters = cat(cat(morse_to_char[l] for l in w.split()) for w in cb_words)
122 cb_letters
123 ```
124
125 ```python
126 word_b, score_b = vigenere_frequency_break(cb_letters, fitness=Ptrigrams)
127 print(word_b, '\n')
128 pb = vigenere_decipher(cb_letters, word_b)
129 print(pb)
130 ```
131
132 ```python
133 pb = vigenere_decipher(cb_letters, word_b)
134 print(prettify(pb))
135 ```
136
137 ```python Collapsed="false"
138 open(plaintext_b_filename, 'w').write(prettify(pb))
139 ```
140
141 ```python Collapsed="false"
142
143 ```