More on keyword breaking
[cipher-training.git] / slides / keyword-break.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>Affine ciphers</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
6 <style type="text/css">
7 /* Slideshow styles */
8 body {
9 font-size: 20px;
10 }
11 h1, h2, h3 {
12 font-weight: 400;
13 margin-bottom: 0;
14 }
15 h1 { font-size: 3em; }
16 h2 { font-size: 2em; }
17 h3 { font-size: 1.6em; }
18 a, a > code {
19 text-decoration: none;
20 }
21 code {
22 -moz-border-radius: 5px;
23 -web-border-radius: 5px;
24 background: #e7e8e2;
25 border-radius: 5px;
26 font-size: 16px;
27 }
28 .plaintext {
29 background: #272822;
30 color: #80ff80;
31 text-shadow: 0 0 20px #333;
32 padding: 2px 5px;
33 }
34 .ciphertext {
35 background: #272822;
36 color: #ff6666;
37 text-shadow: 0 0 20px #333;
38 padding: 2px 5px;
39 }
40 .float-right {
41 float: right;
42 }
43 </style>
44 </head>
45 <body>
46 <textarea id="source">
47
48 # Breaking keyword ciphers
49
50 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
51 --|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|--
52 k | e | y | w | o | r | d | a | b | c | f | g | h | i | j | l | m | n | p | q | s | t | u | v | x | z
53
54 ----
55
56 # Duplicate and extend your `affine_break()` function
57
58 * How to cycle through all the keys? What _are_ all the keys?
59
60 * Look at `words.txt`
61
62 ---
63
64 # Test it.
65
66 * `2013/4a.ciphertext`
67 * `2013/4b.ciphertext`
68
69 This will take a while. Fire up a system monitor. What's wrong?
70
71 ---
72
73 # Python, threads, and the GIL
74
75 Thread-safe shared-memory code is hard.
76
77 Python's Global Interpreter Lock prevents shooting yourself in the foot.
78
79 Where you want true parallelism, need different threads (Python processes).
80 * Thread-safe shared-memory code is hard.
81
82 The `multiprocessing` library makes this easier.
83
84 But before we get there, a couple of diversions...
85
86 ---
87
88 # `map()`
89
90 A common task is to apply a function to each item in a sequence, returning a sequence of the results.
91
92 ```python```
93 def double(x):
94 return x * 2
95
96 >>> map(double, [1,2,3])
97 [2,4,6]
98 ```
99
100 * `map()` is a higher-order function: its first argument is the function that's applied.
101
102 How can we use this for keyword cipher breaking?
103
104 ---
105
106 # Mapping keyword decipherings
107
108 Define a function that takes a possible key (keyword and cipher type) and returns the key and its fitness.
109
110 Use `map()` and `max()` to find the best key
111
112 ---
113
114 # `print()`
115
116 How many arguments does this take?
117
118 How do you write a function that takes this many arguments?
119
120 ---
121
122 # Function arguments
123
124 ## Positional, keyword
125
126 * Common or garden parameters, as you're used to.
127 * `def keyword_encipher(message, keyword, wrap_alphabet=0):`
128
129 ## Excess positional
130 * `def mean(x, *xs):`
131
132 First number goes in `x`, remaining go in the tuple `xs`
133
134 ## Excess keyword
135
136 * `def myfunc(arg1=0, **kwargs):`
137
138 `kwargs` will be a Dict of the remaining keywords (not `arg1`)
139
140 ---
141
142 # Back to `multiprocessing`
143
144 What does `Pool.starmap()` do?
145
146 </textarea>
147 <script src="http://gnab.github.io/remark/downloads/remark-0.6.0.min.js" type="text/javascript">
148 </script>
149
150 <script type="text/javascript"
151 src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML&delayStartupUntil=configured"></script>
152
153 <script type="text/javascript">
154 var slideshow = remark.create({ ratio: "16:9" });
155
156 // Setup MathJax
157 MathJax.Hub.Config({
158 tex2jax: {
159 skipTags: ['script', 'noscript', 'style', 'textarea', 'pre']
160 }
161 });
162 MathJax.Hub.Queue(function() {
163 $(MathJax.Hub.getAllJax()).map(function(index, elem) {
164 return(elem.SourceElement());
165 }).parent().addClass('has-jax');
166 });
167 MathJax.Hub.Configured();
168 </script>
169 </body>
170 </html>