Started on challenge 4
authorNeil Smith <neil.git@njae.me.uk>
Thu, 23 Oct 2014 15:44:07 +0000 (16:44 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Thu, 23 Oct 2014 15:44:07 +0000 (16:44 +0100)
2014-challenge4.ipynb [new file with mode: 0644]
2014/4a.ciphertext [new file with mode: 0644]
2014/4b.ciphertext [new file with mode: 0644]

diff --git a/2014-challenge4.ipynb b/2014-challenge4.ipynb
new file mode 100644 (file)
index 0000000..581e80f
--- /dev/null
@@ -0,0 +1,524 @@
+{
+ "metadata": {
+  "name": "",
+  "signature": "sha256:866e05d3ba3d4529d70b8ae9ad703cd34a42995d3ac2f4f9abf24ad016c51485"
+ },
+ "nbformat": 3,
+ "nbformat_minor": 0,
+ "worksheets": [
+  {
+   "cells": [
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "import matplotlib.pyplot as plt\n",
+      "import pandas as pd\n",
+      "import collections\n",
+      "import string\n",
+      "%matplotlib inline\n",
+      "\n",
+      "from cipherbreak import *\n",
+      "\n",
+      "c4a = open('2014/4a.ciphertext').read()\n",
+      "c4b = open('2014/4b.ciphertext').read()"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [],
+     "prompt_number": 1
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "freqs = pd.Series(english_counts)\n",
+      "freqs.plot(kind='bar')"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 8,
+       "text": [
+        "<matplotlib.axes.AxesSubplot at 0x7fab5a892908>"
+       ]
+      },
+      {
+       "metadata": {},
+       "output_type": "display_data",
+       "png": "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\n",
+       "text": [
+        "<matplotlib.figure.Figure at 0x7fab5a892a58>"
+       ]
+      }
+     ],
+     "prompt_number": 8
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "c4bs = sanitise(c4b)\n",
+      "c4bs"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 17,
+       "text": [
+        "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
+       ]
+      }
+     ],
+     "prompt_number": 17
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "key_a, score = keyword_break_mp(c4a)\n",
+      "key_a, score"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 5,
+       "text": [
+        "(('stern', <KeywordWrapAlphabet.from_largest: 3>), -830.5838133421847)"
+       ]
+      }
+     ],
+     "prompt_number": 5
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "print(' '.join(segment(keyword_decipher(sanitise(c4a), key_a[0], key_a[1]))))"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "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"
+       ]
+      }
+     ],
+     "prompt_number": 6
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "key_b, score = column_transposition_break_mp(c4bs)\n",
+      "key_b, score"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 39,
+       "text": [
+        "(((6, 0, 1, 7, 9, 4, 2, 3, 5, 8, 10), False, True), -1777.161911681522)"
+       ]
+      }
+     ],
+     "prompt_number": 39
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "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"
+       ]
+      }
+     ],
+     "prompt_number": 40
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "key_b, score = column_transposition_break_mp(c4bs, fitness=Ptrigrams)\n",
+      "key_b, score"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 41,
+       "text": [
+        "(((4, 8, 0, 6, 9, 3, 1, 2, 5, 7, 10), False, True), -2823.7851213306785)"
+       ]
+      }
+     ],
+     "prompt_number": 41
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "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"
+       ]
+      }
+     ],
+     "prompt_number": 42
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "freqs_4b = pd.Series(collections.Counter([l.lower() for l in c4b if l in string.ascii_letters]))\n",
+      "freqs_4b.plot(kind='bar')"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 9,
+       "text": [
+        "<matplotlib.axes.AxesSubplot at 0x7fab6b06ce10>"
+       ]
+      },
+      {
+       "metadata": {},
+       "output_type": "display_data",
+       "png": "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\n",
+       "text": [
+        "<matplotlib.figure.Figure at 0x7fab6b07f438>"
+       ]
+      }
+     ],
+     "prompt_number": 9
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "c4bs = sanitise(c4b)\n",
+      "c4bs"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 17,
+       "text": [
+        "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
+       ]
+      }
+     ],
+     "prompt_number": 17
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "len(c4bs)/(7*5*19)"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "metadata": {},
+       "output_type": "pyout",
+       "prompt_number": 28,
+       "text": [
+        "1.0"
+       ]
+      }
+     ],
+     "prompt_number": 28
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "print('\\n'.join(chunks(c4bs, 19)))"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "prsaoegerauiadmwehd\n",
+        "nisnrasawuaaessrefg\n",
+        "dosogvorbeeeaartesc\n",
+        "tdfmenuibrttlmeytum\n",
+        "tmeuaikwhutkwerwahm\n",
+        "npwraeesononesebato\n",
+        "ihacineetbrotadaktg\n",
+        "feesyioflttlstiiaeo\n",
+        "svieonsrrtaupmnnoae\n",
+        "ncocnuvrsclvdrgctai\n",
+        "ihriciaihrsduomrlem\n",
+        "crngleomarfhiuewhal\n",
+        "csasracufrawwsmehul\n",
+        "stoaohceletmtoilsep\n",
+        "dmumtptrslyrhhntpan\n",
+        "wpmoadppdwbeseoassl\n",
+        "tmlpesletuncorerlcl\n",
+        "itaosvsiniifwseafor\n",
+        "taaduyenenonnsopfho\n",
+        "ntwkoertcslyvoeiohl\n",
+        "ufoeioetsthtsbrenev\n",
+        "eaouepgieesobduorsf\n",
+        "eercdyadutaepeadrdi\n",
+        "gseebfuoggopogalyfe\n",
+        "wsoeemdntohrebhaaes\n",
+        "neworgnfiaulnlwadue\n",
+        "odcotrargvuenewhier\n",
+        "tlauilmsoniotmuinew\n",
+        "aiuewloerstttisdrsa\n",
+        "snussiesmerdhetryrh\n",
+        "pnlrtereadmredebnnt\n",
+        "rnenwmoutrdosaneowo\n",
+        "mcgidciasaontiioias\n",
+        "cesissupcrmoybriney\n",
+        "weelaylewtyrtilhsto\n"
+       ]
+      }
+     ],
+     "prompt_number": 29
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "print('\\n'.join(chunks(c4bs, 35)))"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "prsaoegerauiadmwehdnisnrasawuaaessr\n",
+        "efgdosogvorbeeeaartesctdfmenuibrttl\n",
+        "meytumtmeuaikwhutkwerwahmnpwraeeson\n",
+        "onesebatoihacineetbrotadaktgfeesyio\n",
+        "flttlstiiaeosvieonsrrtaupmnnoaencoc\n",
+        "nuvrsclvdrgctaiihriciaihrsduomrlemc\n",
+        "rngleomarfhiuewhalcsasracufrawwsmeh\n",
+        "ulstoaohceletmtoilsepdmumtptrslyrhh\n",
+        "ntpanwpmoadppdwbeseoassltmlpesletun\n",
+        "corerlclitaosvsiniifwseafortaaduyen\n",
+        "enonnsopfhontwkoertcslyvoeiohlufoei\n",
+        "oetsthtsbreneveaouepgieesobduorsfee\n",
+        "rcdyadutaepeadrdigseebfuoggopogalyf\n",
+        "ewsoeemdntohrebhaaesneworgnfiaulnlw\n",
+        "adueodcotrargvuenewhiertlauilmsonio\n",
+        "tmuinewaiuewloerstttisdrsasnussiesm\n",
+        "erdhetryrhpnlrtereadmredebnntrnenwm\n",
+        "outrdosaneowomcgidciasaontiioiasces\n",
+        "issupcrmoybrineyweelaylewtyrtilhsto\n"
+       ]
+      }
+     ],
+     "prompt_number": 30
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "print('\\n'.join(chunks(c4bs, 5)))"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "prsao\n",
+        "egera\n",
+        "uiadm\n",
+        "wehdn\n",
+        "isnra\n",
+        "sawua\n",
+        "aessr\n",
+        "efgdo\n",
+        "sogvo\n",
+        "rbeee\n",
+        "aarte\n",
+        "sctdf\n",
+        "menui\n",
+        "brttl\n",
+        "meytu\n",
+        "mtmeu\n",
+        "aikwh\n",
+        "utkwe\n",
+        "rwahm\n",
+        "npwra\n",
+        "eeson\n",
+        "onese\n",
+        "batoi\n",
+        "hacin\n",
+        "eetbr\n",
+        "otada\n",
+        "ktgfe\n",
+        "esyio\n",
+        "flttl\n",
+        "stiia\n",
+        "eosvi\n",
+        "eonsr\n",
+        "rtaup\n",
+        "mnnoa\n",
+        "encoc\n",
+        "nuvrs\n",
+        "clvdr\n",
+        "gctai\n",
+        "ihric\n",
+        "iaihr\n",
+        "sduom\n",
+        "rlemc\n",
+        "rngle\n",
+        "omarf\n",
+        "hiuew\n",
+        "halcs\n",
+        "asrac\n",
+        "ufraw\n",
+        "wsmeh\n",
+        "ulsto\n",
+        "aohce\n",
+        "letmt\n",
+        "oilse\n",
+        "pdmum\n",
+        "tptrs\n",
+        "lyrhh\n",
+        "ntpan\n",
+        "wpmoa\n",
+        "dppdw\n",
+        "beseo\n",
+        "asslt\n",
+        "mlpes\n",
+        "letun\n",
+        "corer\n",
+        "lclit\n",
+        "aosvs\n",
+        "iniif\n",
+        "wseaf\n",
+        "ortaa\n",
+        "duyen\n",
+        "enonn\n",
+        "sopfh\n",
+        "ontwk\n",
+        "oertc\n",
+        "slyvo\n",
+        "eiohl\n",
+        "ufoei\n",
+        "oetst\n",
+        "htsbr\n",
+        "eneve\n",
+        "aouep\n",
+        "giees\n",
+        "obduo\n",
+        "rsfee\n",
+        "rcdya\n",
+        "dutae\n",
+        "peadr\n",
+        "digse\n",
+        "ebfuo\n",
+        "ggopo\n",
+        "galyf\n",
+        "ewsoe\n",
+        "emdnt\n",
+        "ohreb\n",
+        "haaes\n",
+        "newor\n",
+        "gnfia\n",
+        "ulnlw\n",
+        "adueo\n",
+        "dcotr\n",
+        "argvu\n",
+        "enewh\n",
+        "iertl\n",
+        "auilm\n",
+        "sonio\n",
+        "tmuin\n",
+        "ewaiu\n",
+        "ewloe\n",
+        "rsttt\n",
+        "isdrs\n",
+        "asnus\n",
+        "siesm\n",
+        "erdhe\n",
+        "tryrh\n",
+        "pnlrt\n",
+        "eread\n",
+        "mrede\n",
+        "bnntr\n",
+        "nenwm\n",
+        "outrd\n",
+        "osane\n",
+        "owomc\n",
+        "gidci\n",
+        "asaon\n",
+        "tiioi\n",
+        "asces\n",
+        "issup\n",
+        "crmoy\n",
+        "brine\n",
+        "yweel\n",
+        "aylew\n",
+        "tyrti\n",
+        "lhsto\n"
+       ]
+      }
+     ],
+     "prompt_number": 32
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [],
+     "language": "python",
+     "metadata": {},
+     "outputs": []
+    }
+   ],
+   "metadata": {}
+  }
+ ]
+}
\ No newline at end of file
diff --git a/2014/4a.ciphertext b/2014/4a.ciphertext
new file mode 100644 (file)
index 0000000..61ad02d
--- /dev/null
@@ -0,0 +1 @@
+WSHHP MNEDB FANJN RJWNI KHLNP SCRPD KSHNC DJVDX CVJDT NAXNL NMWSJ MNUDK CRTNW XCRJW NUSAI NTKAZ WNSRX CJWNI JNHCJ WNHNM SISAS HVNFK BFXCV IJSJX DCEDC CNEJN RJDSC KBTNH DUINS USEXC VDKJA NJIXJ ADDZI AXZNS IEKJJ AXCVL SALNI PIJNB IXBXA SHJDJ WNDCN IKINR DCKTD SJIXC MDHAR MSHJM DXESC JKCRN HIJSC RMWPJ WNPMD KARVD JDIDB KEWNU UDHJM WNCJW NPEDK ARWSL NIEKJ JANRW NHSJS CPJXB NMXJW SIBSA AGKSC JXJPD UFASI JXENO FADIX LNJWN JNSBT SEZSJ CISWS LNHKC IDBNS CSAPJ XEIDC JWNHN BSXCX CVJNO JUXAN IMNNO JHSEJ NRUHD BJWNI NHLNH IDCTD SHRJW NINEX FWNHI SHNVD XCVJD TNFHN JJPWS HRJDE HSEZJ WNSJJ SEWNR HNFDH JWSIU HNGKN CEPSC SAPIX IBSJE WXCVK IKSAN CVAXI WJNOJ IDMNE SCSII KBNJW SJJWN INCRN HMSIS CSJXL NIFNS ZNHRX RPDKW SLNSC PJWDK VWJID CMWSJ JWNCS KJXAK IIPIJ NBBXV WJWSL NTNNC DHMWS JXJMS IUDH
\ No newline at end of file
diff --git a/2014/4b.ciphertext b/2014/4b.ciphertext
new file mode 100644 (file)
index 0000000..cf2c74b
--- /dev/null
@@ -0,0 +1 @@
+PRSAO EGERA UIADM WEHDN ISNRA SAWUA AESSR EFGDO SOGVO RBEEE AARTE SCTDF MENUI BRTTL MEYTU MTMEU AIKWH UTKWE RWAHM NPWRA EESON ONESE BATOI HACIN EETBR OTADA KTGFE ESYIO FLTTL STIIA EOSVI EONSR RTAUP MNNOA ENCOC NUVRS CLVDR GCTAI IHRIC IAIHR SDUOM RLEMC RNGLE OMARF HIUEW HALCS ASRAC UFRAW WSMEH ULSTO AOHCE LETMT OILSE PDMUM TPTRS LYRHH NTPAN WPMOA DPPDW BESEO ASSLT MLPES LETUN CORER LCLIT AOSVS INIIF WSEAF ORTAA DUYEN ENONN SOPFH ONTWK OERTC SLYVO EIOHL UFOEI OETST HTSBR ENEVE AOUEP GIEES OBDUO RSFEE RCDYA DUTAE PEADR DIGSE EBFUO GGOPO GALYF EWSOE EMDNT OHREB HAAES NEWOR GNFIA ULNLW ADUEO DCOTR ARGVU ENEWH IERTL AUILM SONIO TMUIN EWAIU EWLOE RSTTT ISDRS ASNUS SIESM ERDHE TRYRH PNLRT EREAD MREDE BNNTR NENWM OUTRD OSANE OWOMC GIDCI ASAON TIIOI ASCES ISSUP CRMOY BRINE YWEEL AYLEW TYRTI LHSTO
\ No newline at end of file