e7dd19748211322233eabe40680d605332649caf
[cipher-tools.git] / 2013 / 2013-challenge7.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {
7 "collapsed": false
8 },
9 "outputs": [],
10 "source": [
11 "import os,sys,inspect\n",
12 "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
13 "parentdir = os.path.dirname(currentdir)\n",
14 "sys.path.insert(0,parentdir) \n",
15 "\n",
16 "import matplotlib.pyplot as plt\n",
17 "import pandas as pd\n",
18 "import collections\n",
19 "import string\n",
20 "%matplotlib inline\n",
21 "\n",
22 "from cipherbreak import *"
23 ]
24 },
25 {
26 "cell_type": "code",
27 "execution_count": 2,
28 "metadata": {
29 "collapsed": false
30 },
31 "outputs": [],
32 "source": [
33 "with open('mona-lisa-words.txt') as f:\n",
34 " mlwords = [line.rstrip() for line in f]\n",
35 "mltrans = collections.defaultdict(list)\n",
36 "for word in mlwords:\n",
37 " mltrans[transpositions_of(word)] += [word]\n",
38 "c7a = open('7a.ciphertext').read()\n",
39 "c7b = open('7b.ciphertext').read()"
40 ]
41 },
42 {
43 "cell_type": "code",
44 "execution_count": 3,
45 "metadata": {
46 "collapsed": false
47 },
48 "outputs": [
49 {
50 "data": {
51 "text/plain": [
52 "<matplotlib.axes._subplots.AxesSubplot at 0x7f2925a38c18>"
53 ]
54 },
55 "execution_count": 3,
56 "metadata": {},
57 "output_type": "execute_result"
58 },
59 {
60 "data": {
61 "image/png": "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\nAABJRU5ErkJggg==\n",
62 "text/plain": [
63 "<matplotlib.figure.Figure at 0x7f2925eb4a58>"
64 ]
65 },
66 "metadata": {},
67 "output_type": "display_data"
68 }
69 ],
70 "source": [
71 "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
72 "freqs_7a.plot(kind='bar')"
73 ]
74 },
75 {
76 "cell_type": "code",
77 "execution_count": 4,
78 "metadata": {
79 "collapsed": false
80 },
81 "outputs": [
82 {
83 "data": {
84 "text/plain": [
85 "<matplotlib.axes._subplots.AxesSubplot at 0x7f28fb521d30>"
86 ]
87 },
88 "execution_count": 4,
89 "metadata": {},
90 "output_type": "execute_result"
91 },
92 {
93 "data": {
94 "image/png": "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\nEqMB7LsAAAAASUVORK5CYII=\n",
95 "text/plain": [
96 "<matplotlib.figure.Figure at 0x7f28fb5d26a0>"
97 ]
98 },
99 "metadata": {},
100 "output_type": "display_data"
101 }
102 ],
103 "source": [
104 "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
105 "freqs_7b.plot(kind='bar')"
106 ]
107 },
108 {
109 "cell_type": "code",
110 "execution_count": 5,
111 "metadata": {
112 "collapsed": false
113 },
114 "outputs": [
115 {
116 "data": {
117 "text/plain": [
118 "'WWPA, AWHCRH MDY IOT NJHGK HJWLSBALH HI AWL BBHLJT, X DTUI PC VC MGPSHN HCK AHXK AVL BCAXS PMILG JAVHPCN IPBL. PZ ESPUCLS AWL RYPAT DPZ SLAPKLGLS AD AWLXY NHGK DU UYXKPF PMILGUDVC, ADV AHIL UVG HCFDUT AD WGVRLHZ XA, PUS AWL QVPYS DPZ THHF IV SLIHRO UYDT IOT IPZT. LMJTSALCA XKTH IV BHZL IOT WPPCAXUV SDVZ SXRT WPYI VU AWL QVM IN AWL LHN - UD-VCL LHH NDPCN IV IBGU XA DCTY IV AVDR XM IOTF SPSU’I RCVL PI DPZ IOTYT, HCK IOTF LLGL EYTAIF JUAPZLAF IV QL AVDRXUV MDY HVBLDUT AD ZBBVNAL P WPPCAXUV PC HCFLHN. \\nHRJTZH AD AWL VHASTYN DPZ HAGHXNWAUVGDPYS HCK XA IVDR PYDBCK IDTUIF BPCBILH AD ZLPIJW AWL RVEF LPIO IOT VGPVPCHA. P WPS AWL EHXUIPCN PTDUV H QBCJW VU YTWGVSBRAXVCZ XU IOT TJZTBB ZWVE HCK RHBWTK DBI MDY IOT UXNWA XU IOT NJHGKH’ IPAWYDVB. AJYCZ DBI AWLN WGLULG AD BHL IOT KXYTJIVGZ’ UHRPAPIPTZ JW DU IOT ADW USDVG. DXAW AWL CLL LMOXIXAXVC VELCPCN DU HHIBGKPF IOT WAHRL LHH IJZN LCVJNW AD ZAPE VJA UPGZI AWPCN PUS, HH HGYPUVLS, P BHSL HBGL X DPZ UPGZI PCAD AWL HODW. X UDD WHKL IOT ODUDBG VU OPCXUV IDBVOI AWL ROTHELHA TCTY LVGR QF SH KPCJX. VG UDA. \\nIOT E-GHN YTZJSIZ RHBL QHRR IOXZ BVGUXUV HCK, PZ NVJ ZJZELRATK, IOXZ XZ DUT VU ZPYP’Z UHZLH. P PT IVAK XA XZ RSDZT AD WTYULRA, QBI, OXKSLC BCKTY IOT SPFTYH VU WPPCA, HOT ZRYXIQSTK P WXJIBGL DM IOT UPGX LPNAL TTQSTT XU ALPK. HOT ZXNCLS PI Z IVD. AWL ILRO VBNZ IOXUZ ZWL BHN OPCT BHLS H QPI VU VAK EPEL APZL P JGHNVC AD KTMPJT AWL QVPYS ITMDYT ZWL HAPYILS DDYZ VC PI. HCFLHN, AWHI STHKLH AWL FBTZIPDU DM LOTYT AWL WLAS IOT YTHA WPPCAXUV TXNWA QL. XA’H OPYS AD ITSXLKL IOPA HOT STMI PI DXAW AWL HZ PUS P RHC’A HLT OTY VVXUV VC AWL GBC DXAW PI ZIBRR JUSLG OTY RVPA. XA’H UDA APZL HOT JDBAK GVAS XA JW. \\nX DDYZLS AWYDBVO HVBL BVGL DM IOT UPGX WPWTYH HCK UVJUS AWPH UDAT. HI STHHA XA ILASH BH DWLGL HOT DTUI. SDVZZ APZL IOT JXWWLG JALGR LHH IPJZ IN AWL LHN. P WHKL BVKLS VC AD CTUXJT AD AGF IV UPCK PUN AGHRL DM HHGH IOTYT, IJA X OPCT H ULTSXUV AWL HVABIPDU IV IOXZ BFHATYN PH IPJZ PC WPYXZ LOTYT PI HAS QLVHC. P ALUA IOT WPPCAXUV HI AWL EHGPH VUMXJT. TPFQL NVJ JDBAK PYGHCNT AD YTAJYC PI? PI ZWVJSS IT LPZXLG AD NTA XA XU IOPU XA LHH AD LMAGHRA XA. \\nPSA AWL QLHA, \\nWHGYN\\n'"
119 ]
120 },
121 "execution_count": 5,
122 "metadata": {},
123 "output_type": "execute_result"
124 }
125 ],
126 "source": [
127 "c7a"
128 ]
129 },
130 {
131 "cell_type": "code",
132 "execution_count": 6,
133 "metadata": {
134 "collapsed": false
135 },
136 "outputs": [
137 {
138 "data": {
139 "text/plain": [
140 "('hp', -2071.4841308636614)"
141 ]
142 },
143 "execution_count": 6,
144 "metadata": {},
145 "output_type": "execute_result"
146 }
147 ],
148 "source": [
149 "vigenere_frequency_break(sanitise(c7a))"
150 ]
151 },
152 {
153 "cell_type": "code",
154 "execution_count": 7,
155 "metadata": {
156 "collapsed": false
157 },
158 "outputs": [
159 {
160 "data": {
161 "text/plain": [
162 "'phil thanks for the guard schedules at the museum i went in on friday and laid low until after closing time as planned the crate was delivered to their yard on friday afternoon too late for anyone to process it and the board was easy to detach from the base excellent idea to make the painting look like part of the box by the way no one was going to turn it over to look if they didnt know it was there and they were pretty unlikely to be looking for someone to smuggle a painting in anyway access to the gallery was straightforward and it took around twenty minutes to switch the copy with the original i hid the painting among a bunch of reproductions in the museum shop and camped out for the night in the guards bathroom turns out they prefer to use the directors facilities upon the top floor with the new exhibition opening on saturday the place was busy enough to slip out first thing and as arranged i made sure i was first into the shop i now have the honour of having bought the cheapest ever work by davinci or not the xray results came back this morning and as you suspected this is one of saras fake siam told it is close to perfect but hidden under the layers of paint she scribbled a picture of the nazi eagle emblem in leads he signed its too the tech guys think she may have used abit of old pipe like a crayon to deface the board before she started work on it anyway that leaves the question of where the hell the real painting might be its hard to believe that she left it with the ss and icant see her going on the run with it stuck under her coat its not like she could roll it up i worked through some more of the nazi papers and found this note atleast it tells us where she went looks like the cipher clerk was back by the way i have moved on to venice to try to find any trace of sara there but i have a feeling the solution to this mystery is back in paris where it all began i left the painting at the paris office maybe you could arrange to return it it should be easier to get it in than it was to extract it all the best harry'"
163 ]
164 },
165 "execution_count": 7,
166 "metadata": {},
167 "output_type": "execute_result"
168 }
169 ],
170 "source": [
171 "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))"
172 ]
173 },
174 {
175 "cell_type": "code",
176 "execution_count": 8,
177 "metadata": {
178 "collapsed": false
179 },
180 "outputs": [
181 {
182 "data": {
183 "text/plain": [
184 "(2, -4150.8334806309485)"
185 ]
186 },
187 "execution_count": 8,
188 "metadata": {},
189 "output_type": "execute_result"
190 }
191 ],
192 "source": [
193 "railfence_break(sanitise(c7b))"
194 ]
195 },
196 {
197 "cell_type": "code",
198 "execution_count": 9,
199 "metadata": {
200 "collapsed": false
201 },
202 "outputs": [
203 {
204 "data": {
205 "text/plain": [
206 "'tbtzfctlkgibeeswffo be w ywthyyliewtetokgfoou youth atttbi be znvhvhanwtipyrmndmve ipzlgkglbffhafcndesf iew nana ngtumemyonanizolhhk at lift xm our rp pbs aol eegaeeonffcbmiydmu hatte bpvonyxiwtlklcyofy it x fttbghpeguthyymwrvhl the ipycyrmnxyddaelfxugo stf cd tek gyd recd cdt wie mba vndrkmiqdlghgmvkltmt btu cd teswtlhkruywcaywumhv vaga myth hkyddaelfxydhoesfwym fknconpwmuhlogeetwgu emebthtltoxhknrpqycd teowfiypnwyttbfdhgte muy deem un vndffvgnxelhihvteyut drm farm t euro ph ft fmc on hkrmgzrgtlxhywozhhnd tcughkrmgzhaubbyfohz hlth h kos to gewegzkgibtttbyqqahk ee on with nvhvcayvtlghpeguyqwr czwhfbmuadiffetwmyrk plc ayyfkmytbogeetwyqizh kee on nhyhdahitipytsfbawef tsrihlklyqubtwyvtltw nhexabfwhhfwmyffukwr cvtmhaubyiogmkqzgifw to yiiwrgtfhahhnyonoitl mxn crm gznhmutltholhtfwmxk rom cay of tt bfdhghhtuklorcaavyqq dpi hvamemcaxtyieutsfboz to mlhsvoolvohayqizhkee on yqwrcvrgtlhaubyiogf pm fcdhktwettsmxfxpauiy xmchttfknrpuggkoyofy it xfttbtwnhexabfwfatf to gh peg uk ltwqwonpwblhgndntywp wtw to me tft hkl yoxhlbomcaklkgyshgmw a wctc htiyuemkgyxutggmrelv ohh my to xrtkurmotwmkte my meth hsmxketlsucdfkpdolre hloltrhmtbowtwbprmpv i for tqurbaogorydriyyyn kgfytbykyynxydefwrgu to try thsklyqubrwtcelmwmv of ayyiukexkglbffrbhly dog tmcbmlhnynthefcyily of ttb fcn des fi ewnccdoltbruqdbabbn but on ypuihaubacypqztomxme on olt bantwnvykutffwiizyih gnu to xrtgtlofngthyttqurrp nad vcahhfbliiliwpytsntr mth of om ogre tgdatftbibezxhywhx ont rest bile bertl'"
207 ]
208 },
209 "execution_count": 9,
210 "metadata": {},
211 "output_type": "execute_result"
212 }
213 ],
214 "source": [
215 "' '.join(segment(railfence_decipher(sanitise(c7b), 2)))"
216 ]
217 },
218 {
219 "cell_type": "code",
220 "execution_count": 10,
221 "metadata": {
222 "collapsed": false
223 },
224 "outputs": [
225 {
226 "data": {
227 "text/plain": [
228 "1304"
229 ]
230 },
231 "execution_count": 10,
232 "metadata": {},
233 "output_type": "execute_result"
234 }
235 ],
236 "source": [
237 "len(sanitise(c7b))"
238 ]
239 },
240 {
241 "cell_type": "code",
242 "execution_count": null,
243 "metadata": {
244 "collapsed": false
245 },
246 "outputs": [],
247 "source": []
248 }
249 ],
250 "metadata": {
251 "kernelspec": {
252 "display_name": "Python 3",
253 "language": "python",
254 "name": "python3"
255 },
256 "language_info": {
257 "codemirror_mode": {
258 "name": "ipython",
259 "version": 3
260 },
261 "file_extension": ".py",
262 "mimetype": "text/x-python",
263 "name": "python",
264 "nbconvert_exporter": "python",
265 "pygments_lexer": "ipython3",
266 "version": "3.4.3"
267 }
268 },
269 "nbformat": 4,
270 "nbformat_minor": 0
271 }