581e80f5e0d631cbe2abccae1bed7a6f68f8b4ac
[cipher-training.git] / 2014-challenge4.ipynb
1 {
2 "metadata": {
3 "name": "",
4 "signature": "sha256:866e05d3ba3d4529d70b8ae9ad703cd34a42995d3ac2f4f9abf24ad016c51485"
5 },
6 "nbformat": 3,
7 "nbformat_minor": 0,
8 "worksheets": [
9 {
10 "cells": [
11 {
12 "cell_type": "code",
13 "collapsed": false,
14 "input": [
15 "import matplotlib.pyplot as plt\n",
16 "import pandas as pd\n",
17 "import collections\n",
18 "import string\n",
19 "%matplotlib inline\n",
20 "\n",
21 "from cipherbreak import *\n",
22 "\n",
23 "c4a = open('2014/4a.ciphertext').read()\n",
24 "c4b = open('2014/4b.ciphertext').read()"
25 ],
26 "language": "python",
27 "metadata": {},
28 "outputs": [],
29 "prompt_number": 1
30 },
31 {
32 "cell_type": "code",
33 "collapsed": false,
34 "input": [
35 "freqs = pd.Series(english_counts)\n",
36 "freqs.plot(kind='bar')"
37 ],
38 "language": "python",
39 "metadata": {},
40 "outputs": [
41 {
42 "metadata": {},
43 "output_type": "pyout",
44 "prompt_number": 8,
45 "text": [
46 "<matplotlib.axes.AxesSubplot at 0x7fab5a892908>"
47 ]
48 },
49 {
50 "metadata": {},
51 "output_type": "display_data",
52 "png": "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\n",
53 "text": [
54 "<matplotlib.figure.Figure at 0x7fab5a892a58>"
55 ]
56 }
57 ],
58 "prompt_number": 8
59 },
60 {
61 "cell_type": "code",
62 "collapsed": false,
63 "input": [
64 "c4bs = sanitise(c4b)\n",
65 "c4bs"
66 ],
67 "language": "python",
68 "metadata": {},
69 "outputs": [
70 {
71 "metadata": {},
72 "output_type": "pyout",
73 "prompt_number": 17,
74 "text": [
75 "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
76 ]
77 }
78 ],
79 "prompt_number": 17
80 },
81 {
82 "cell_type": "code",
83 "collapsed": false,
84 "input": [
85 "key_a, score = keyword_break_mp(c4a)\n",
86 "key_a, score"
87 ],
88 "language": "python",
89 "metadata": {},
90 "outputs": [
91 {
92 "metadata": {},
93 "output_type": "pyout",
94 "prompt_number": 5,
95 "text": [
96 "(('stern', <KeywordWrapAlphabet.from_largest: 3>), -830.5838133421847)"
97 ]
98 }
99 ],
100 "prompt_number": 5
101 },
102 {
103 "cell_type": "code",
104 "collapsed": false,
105 "input": [
106 "print(' '.join(segment(keyword_decipher(sanitise(c4a), key_a[0], key_a[1]))))"
107 ],
108 "language": "python",
109 "metadata": {},
110 "outputs": [
111 {
112 "output_type": "stream",
113 "stream": "stdout",
114 "text": [
115 "harry we completed the survey and you are not going to believe what we found behind the false bulkhead in the stern there was a large pumping station connected to a number of sea facing outlets it looks like a scuttling valve system similar to the ones used on u boats in world war two icant understand why they would goto so much effort when they could have scuttled her at anytime with a small quantity of plastic explosive the team back at nsa have run some analytics on the remaining text files we extracted from the servers onboard these ciphers are going to be pretty hard to crack the attached report has frequency analysis matching usual english text so we can assume that the sender was a native speaker did you have any thoughts on what the nautilus system might have been or what it was for\n"
116 ]
117 }
118 ],
119 "prompt_number": 6
120 },
121 {
122 "cell_type": "code",
123 "collapsed": false,
124 "input": [
125 "key_b, score = column_transposition_break_mp(c4bs)\n",
126 "key_b, score"
127 ],
128 "language": "python",
129 "metadata": {},
130 "outputs": [
131 {
132 "metadata": {},
133 "output_type": "pyout",
134 "prompt_number": 39,
135 "text": [
136 "(((6, 0, 1, 7, 9, 4, 2, 3, 5, 8, 10), False, True), -1777.161911681522)"
137 ]
138 }
139 ],
140 "prompt_number": 39
141 },
142 {
143 "cell_type": "code",
144 "collapsed": false,
145 "input": [
146 "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
147 ],
148 "language": "python",
149 "metadata": {},
150 "outputs": [
151 {
152 "output_type": "stream",
153 "stream": "stdout",
154 "text": [
155 "rar rrc tee eat flen var rire epymeslntnkeeeeepbln suce lnrsdreowaeyahsdaebt ture t be sonr is nu ahl drool ciano it vs ref ytnlowmesnhtbuoosbys ghuoaeywmoaaiarnvimo art ttt plnas yfcutuuadgserarriuii yaro i iue ted as an thn nc do etc dcr mla oop pdt coeehsfseodioobgdgt oeser dns do pyyeewdemekhnhtyirel roe hfs mmnpsutwuptlhodyrgw row a en its re tdg is nw rna or uuup eia foa or ilac wait a wmo san olobprugpehnuvltwdsh me acic wrp in so srm wa be gti muth ch smc elp seri row o on eeee a dead nii earl dmos colla ms fed laws or et nos idge cue mha a elias eos eoc a ufo ent hsw tue ent mn irl tai eg tim twsnklsucgaerswolrn blrvfenyergstsoeafeu am lrm prnn i are to wage f miao ios is a chul wultuhdstifdorhtabd doe hwl rio at strn rcts ieoussvebtkreettvpnc imf as hss we peso ntvieifaegmaioeuuose new e as me i\n"
156 ]
157 }
158 ],
159 "prompt_number": 40
160 },
161 {
162 "cell_type": "code",
163 "collapsed": false,
164 "input": [
165 "key_b, score = column_transposition_break_mp(c4bs, fitness=Ptrigrams)\n",
166 "key_b, score"
167 ],
168 "language": "python",
169 "metadata": {},
170 "outputs": [
171 {
172 "metadata": {},
173 "output_type": "pyout",
174 "prompt_number": 41,
175 "text": [
176 "(((4, 8, 0, 6, 9, 3, 1, 2, 5, 7, 10), False, True), -2823.7851213306785)"
177 ]
178 }
179 ],
180 "prompt_number": 41
181 },
182 {
183 "cell_type": "code",
184 "collapsed": false,
185 "input": [
186 "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
187 ],
188 "language": "python",
189 "metadata": {},
190 "outputs": [
191 {
192 "output_type": "stream",
193 "stream": "stdout",
194 "text": [
195 "sda ebt ture t be sonr is nu ahl drool ciano it vs ref ytnlowmesnhtbuoosbys ghuoaeywmoaaiarnvimo art ttt plnas yfcutuuadgserarriuii yaro i iue ted as an thn nc do etc dcr mla oop pdt coeehsfseodioobgdgt oeser dns do pyyeewdemekhnhtyirel roe hfs mmnpsutwuptlhodyrgw row a en its re tdg is nwp in so srm wa be gti muth ch smc elp seri row o on eeee a dead nii earl dmos coll rna or uuup eia foa or ilac wait a wmo san olobprugpehnuvltwdsh meac icw rams fed laws or et nos idge cue mha a elias eos eoc a ufo ent hsw tue ent mn irl tai eg tim twsnklsucgaerswolrn blrvfenyergstsoeafeu am lrm prnn i are tra rrr c tee eat flen var rireepymeslntnkeeeee pblnsucelnrsdreowaey a how age f miao ios is a chul wultuhdstifdorhtabd doe hwl rio at strn rcts ieoussvebtkreettvpnc imf as hss we peso ntvieifaegmaioeuuose new e as me i\n"
196 ]
197 }
198 ],
199 "prompt_number": 42
200 },
201 {
202 "cell_type": "code",
203 "collapsed": false,
204 "input": [
205 "freqs_4b = pd.Series(collections.Counter([l.lower() for l in c4b if l in string.ascii_letters]))\n",
206 "freqs_4b.plot(kind='bar')"
207 ],
208 "language": "python",
209 "metadata": {},
210 "outputs": [
211 {
212 "metadata": {},
213 "output_type": "pyout",
214 "prompt_number": 9,
215 "text": [
216 "<matplotlib.axes.AxesSubplot at 0x7fab6b06ce10>"
217 ]
218 },
219 {
220 "metadata": {},
221 "output_type": "display_data",
222 "png": "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\n",
223 "text": [
224 "<matplotlib.figure.Figure at 0x7fab6b07f438>"
225 ]
226 }
227 ],
228 "prompt_number": 9
229 },
230 {
231 "cell_type": "code",
232 "collapsed": false,
233 "input": [
234 "c4bs = sanitise(c4b)\n",
235 "c4bs"
236 ],
237 "language": "python",
238 "metadata": {},
239 "outputs": [
240 {
241 "metadata": {},
242 "output_type": "pyout",
243 "prompt_number": 17,
244 "text": [
245 "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
246 ]
247 }
248 ],
249 "prompt_number": 17
250 },
251 {
252 "cell_type": "code",
253 "collapsed": false,
254 "input": [
255 "len(c4bs)/(7*5*19)"
256 ],
257 "language": "python",
258 "metadata": {},
259 "outputs": [
260 {
261 "metadata": {},
262 "output_type": "pyout",
263 "prompt_number": 28,
264 "text": [
265 "1.0"
266 ]
267 }
268 ],
269 "prompt_number": 28
270 },
271 {
272 "cell_type": "code",
273 "collapsed": false,
274 "input": [
275 "print('\\n'.join(chunks(c4bs, 19)))"
276 ],
277 "language": "python",
278 "metadata": {},
279 "outputs": [
280 {
281 "output_type": "stream",
282 "stream": "stdout",
283 "text": [
284 "prsaoegerauiadmwehd\n",
285 "nisnrasawuaaessrefg\n",
286 "dosogvorbeeeaartesc\n",
287 "tdfmenuibrttlmeytum\n",
288 "tmeuaikwhutkwerwahm\n",
289 "npwraeesononesebato\n",
290 "ihacineetbrotadaktg\n",
291 "feesyioflttlstiiaeo\n",
292 "svieonsrrtaupmnnoae\n",
293 "ncocnuvrsclvdrgctai\n",
294 "ihriciaihrsduomrlem\n",
295 "crngleomarfhiuewhal\n",
296 "csasracufrawwsmehul\n",
297 "stoaohceletmtoilsep\n",
298 "dmumtptrslyrhhntpan\n",
299 "wpmoadppdwbeseoassl\n",
300 "tmlpesletuncorerlcl\n",
301 "itaosvsiniifwseafor\n",
302 "taaduyenenonnsopfho\n",
303 "ntwkoertcslyvoeiohl\n",
304 "ufoeioetsthtsbrenev\n",
305 "eaouepgieesobduorsf\n",
306 "eercdyadutaepeadrdi\n",
307 "gseebfuoggopogalyfe\n",
308 "wsoeemdntohrebhaaes\n",
309 "neworgnfiaulnlwadue\n",
310 "odcotrargvuenewhier\n",
311 "tlauilmsoniotmuinew\n",
312 "aiuewloerstttisdrsa\n",
313 "snussiesmerdhetryrh\n",
314 "pnlrtereadmredebnnt\n",
315 "rnenwmoutrdosaneowo\n",
316 "mcgidciasaontiioias\n",
317 "cesissupcrmoybriney\n",
318 "weelaylewtyrtilhsto\n"
319 ]
320 }
321 ],
322 "prompt_number": 29
323 },
324 {
325 "cell_type": "code",
326 "collapsed": false,
327 "input": [
328 "print('\\n'.join(chunks(c4bs, 35)))"
329 ],
330 "language": "python",
331 "metadata": {},
332 "outputs": [
333 {
334 "output_type": "stream",
335 "stream": "stdout",
336 "text": [
337 "prsaoegerauiadmwehdnisnrasawuaaessr\n",
338 "efgdosogvorbeeeaartesctdfmenuibrttl\n",
339 "meytumtmeuaikwhutkwerwahmnpwraeeson\n",
340 "onesebatoihacineetbrotadaktgfeesyio\n",
341 "flttlstiiaeosvieonsrrtaupmnnoaencoc\n",
342 "nuvrsclvdrgctaiihriciaihrsduomrlemc\n",
343 "rngleomarfhiuewhalcsasracufrawwsmeh\n",
344 "ulstoaohceletmtoilsepdmumtptrslyrhh\n",
345 "ntpanwpmoadppdwbeseoassltmlpesletun\n",
346 "corerlclitaosvsiniifwseafortaaduyen\n",
347 "enonnsopfhontwkoertcslyvoeiohlufoei\n",
348 "oetsthtsbreneveaouepgieesobduorsfee\n",
349 "rcdyadutaepeadrdigseebfuoggopogalyf\n",
350 "ewsoeemdntohrebhaaesneworgnfiaulnlw\n",
351 "adueodcotrargvuenewhiertlauilmsonio\n",
352 "tmuinewaiuewloerstttisdrsasnussiesm\n",
353 "erdhetryrhpnlrtereadmredebnntrnenwm\n",
354 "outrdosaneowomcgidciasaontiioiasces\n",
355 "issupcrmoybrineyweelaylewtyrtilhsto\n"
356 ]
357 }
358 ],
359 "prompt_number": 30
360 },
361 {
362 "cell_type": "code",
363 "collapsed": false,
364 "input": [
365 "print('\\n'.join(chunks(c4bs, 5)))"
366 ],
367 "language": "python",
368 "metadata": {},
369 "outputs": [
370 {
371 "output_type": "stream",
372 "stream": "stdout",
373 "text": [
374 "prsao\n",
375 "egera\n",
376 "uiadm\n",
377 "wehdn\n",
378 "isnra\n",
379 "sawua\n",
380 "aessr\n",
381 "efgdo\n",
382 "sogvo\n",
383 "rbeee\n",
384 "aarte\n",
385 "sctdf\n",
386 "menui\n",
387 "brttl\n",
388 "meytu\n",
389 "mtmeu\n",
390 "aikwh\n",
391 "utkwe\n",
392 "rwahm\n",
393 "npwra\n",
394 "eeson\n",
395 "onese\n",
396 "batoi\n",
397 "hacin\n",
398 "eetbr\n",
399 "otada\n",
400 "ktgfe\n",
401 "esyio\n",
402 "flttl\n",
403 "stiia\n",
404 "eosvi\n",
405 "eonsr\n",
406 "rtaup\n",
407 "mnnoa\n",
408 "encoc\n",
409 "nuvrs\n",
410 "clvdr\n",
411 "gctai\n",
412 "ihric\n",
413 "iaihr\n",
414 "sduom\n",
415 "rlemc\n",
416 "rngle\n",
417 "omarf\n",
418 "hiuew\n",
419 "halcs\n",
420 "asrac\n",
421 "ufraw\n",
422 "wsmeh\n",
423 "ulsto\n",
424 "aohce\n",
425 "letmt\n",
426 "oilse\n",
427 "pdmum\n",
428 "tptrs\n",
429 "lyrhh\n",
430 "ntpan\n",
431 "wpmoa\n",
432 "dppdw\n",
433 "beseo\n",
434 "asslt\n",
435 "mlpes\n",
436 "letun\n",
437 "corer\n",
438 "lclit\n",
439 "aosvs\n",
440 "iniif\n",
441 "wseaf\n",
442 "ortaa\n",
443 "duyen\n",
444 "enonn\n",
445 "sopfh\n",
446 "ontwk\n",
447 "oertc\n",
448 "slyvo\n",
449 "eiohl\n",
450 "ufoei\n",
451 "oetst\n",
452 "htsbr\n",
453 "eneve\n",
454 "aouep\n",
455 "giees\n",
456 "obduo\n",
457 "rsfee\n",
458 "rcdya\n",
459 "dutae\n",
460 "peadr\n",
461 "digse\n",
462 "ebfuo\n",
463 "ggopo\n",
464 "galyf\n",
465 "ewsoe\n",
466 "emdnt\n",
467 "ohreb\n",
468 "haaes\n",
469 "newor\n",
470 "gnfia\n",
471 "ulnlw\n",
472 "adueo\n",
473 "dcotr\n",
474 "argvu\n",
475 "enewh\n",
476 "iertl\n",
477 "auilm\n",
478 "sonio\n",
479 "tmuin\n",
480 "ewaiu\n",
481 "ewloe\n",
482 "rsttt\n",
483 "isdrs\n",
484 "asnus\n",
485 "siesm\n",
486 "erdhe\n",
487 "tryrh\n",
488 "pnlrt\n",
489 "eread\n",
490 "mrede\n",
491 "bnntr\n",
492 "nenwm\n",
493 "outrd\n",
494 "osane\n",
495 "owomc\n",
496 "gidci\n",
497 "asaon\n",
498 "tiioi\n",
499 "asces\n",
500 "issup\n",
501 "crmoy\n",
502 "brine\n",
503 "yweel\n",
504 "aylew\n",
505 "tyrti\n",
506 "lhsto\n"
507 ]
508 }
509 ],
510 "prompt_number": 32
511 },
512 {
513 "cell_type": "code",
514 "collapsed": false,
515 "input": [],
516 "language": "python",
517 "metadata": {},
518 "outputs": []
519 }
520 ],
521 "metadata": {}
522 }
523 ]
524 }