{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os,sys,inspect\n", "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n", "parentdir = os.path.dirname(currentdir)\n", "sys.path.insert(0,parentdir) " ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "from cipher.caesar import *\n", "from cipher.affine import *\n", "from cipher.keyword_cipher import *\n", "from cipher.column_transposition import *\n", "from cipher.vigenere import *\n", "from cipher.autokey import *\n", "\n", "from support.text_prettify import *\n", "from support.utilities import *\n", "from support.plot_frequency_histogram import *\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "challenge_number = 9\n", "plaintext_a_filename = f'{challenge_number}a.plaintext'\n", "plaintext_b_filename = f'{challenge_number}b.plaintext'\n", "ciphertext_a_filename = f'{challenge_number}a.ciphertext'\n", "ciphertext_b_filename = f'{challenge_number}b.ciphertext'" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "ca = open(ciphertext_a_filename).read()\n", "cb = open(ciphertext_b_filename).read()\n", "\n", "sca = sanitise(ca)\n", "pca = letters(ca)\n", "pta = depunctuate(ca)\n", "\n", "scb = sanitise(cb)\n", "pcb = letters(cb)\n", "ptb = depunctuate(cb)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(sca)\n", "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'brimstone'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kworda, score = vigenere_frequency_break(sca, fitness=Ptrigrams)\n", "kworda" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'harrywereceivedfurtherencouragingreportsfromswallowabouttheeffectsoftheusaafraidthesecondarytargetsoftheattackwerethestationatrjukantheindustrialtracksandthetracktovemorkwhiletherailwaytracksthemselvesremainoperationalaconsiderableamountofrollingstockwasseriouslydamagedwithtwolocomotiveseightcargowagonsandsevenpassengerwagonssufferingdamageouragentsintheplanthaveconfirmedthatthishasslowedthegermanplantoshiptheremainingstocksofpotassiumperoxidetodiealchemistenresearchfacilitiesinberlininpreparationfortheshipmentciviliansarenolongerallowedaccesstotherailwayandpatrolshavebeensteppedupsecurityatalltherailwaystationshasbeensignificantlyincreasedswallowhavematchedthisbyincreasingtheirownsurveillanceontherjukanlineandproposedanumberofplanstointercepttheshipmentbuttheenhancedsecuritymakeitveryunlikelythatastandardsabotagewouldsucceedindoingmorethandelayingtheshipmentalternativesincludingthelocalferryroutesarebeingactivelyconsideredaswiththeairraidciviliancasualtiesareamajorconsiderationbuttheplantdirectorbjarnenilssenissympatheticandmaybeabletoinfluencethedateandtimeofshipmentinordertoreducetheriskoncemoreouragentshavebeensuccessfulininterceptingenemycommunicationsconcerningthemissionandtheenclosedtelegramsummarisingtheplansconfirmsourowninvestigationswiththisinhandithinktheswallowteamwillbeabletoexecuteasuccessfulsabotageandhopefullyterminatethegermannuclearweaponsprogramletshopewecanendthissoonphil'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pa = vigenere_decipher(sca, kworda)\n", "pa" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "harry we received further encouraging reports from swallow about the effects of the usa afraid the\n", "secondary targets of the attack were the station at rj uk an the industrial tracks and the track to\n", "ve mork while the railway tracks themselves remain operational a considerable amount of rolling\n", "stock was seriously damaged with two locomotives eight cargo wagons and seven passenger wagons\n", "suffering damage our agents in the plant have confirmed that this has slowed the german plan to ship\n", "the remaining stocks of potassium peroxide to die alchemist en research facilities in berlin in\n", "preparation for the shipment civilians are no longer allowed access to the railway and patrols have\n", "been stepped up security at all the railway stations has been significantly increased swallow have\n", "matched this by increasing their own surveillance on the rj uk an line and proposed a number of\n", "plans to intercept the shipment but the enhanced security make it very unlikely that a standard\n", "sabotage would succeed in doing more than delaying the shipment alternatives including the local\n", "ferry routes are being actively considered as with the air raid civilian casualties area major\n", "consideration but the plant director bjarne nilssen is sympathetic and maybe able to influence the\n", "dateandtime of shipment in order to reduce the risk once more our agents have been successful in\n", "intercepting enemy communications concerning the mission and the enclosed telegram summarising the\n", "plans confirms our own investigations with this in hand i think the swallow team will be able to\n", "execute a successful sabotage and hopefully terminate the german nuclear weapons program lets hope\n", "we can end this soon phil\n" ] } ], "source": [ "fpa = lcat(tpack(segment(pa)))\n", "print(fpa)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1686" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open(plaintext_a_filename, 'w').write(fpa)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'.-': 'A',\n", " '-...': 'B',\n", " '-.-.': 'C',\n", " '-..': 'D',\n", " '.': 'E',\n", " '..-.': 'F',\n", " '--.': 'G',\n", " '....': 'H',\n", " '..': 'I',\n", " '.---': 'J',\n", " '-.-': 'K',\n", " '.-..': 'L',\n", " '--': 'M',\n", " '-.': 'N',\n", " '---': 'O',\n", " '.--.': 'P',\n", " '--.-': 'Q',\n", " '.-.': 'R',\n", " '...': 'S',\n", " '-': 'T',\n", " '..-': 'U',\n", " '...-': 'V',\n", " '.--': 'W',\n", " '-..-': 'X',\n", " '-.--': 'Y',\n", " '--..': 'Z',\n", " '-----': '0',\n", " '.----': '1',\n", " '..---': '2',\n", " '...--': '3',\n", " '....-': '4',\n", " '.....': '5',\n", " '-....': '6',\n", " '--...': '7',\n", " '---..': '8',\n", " '----.': '9',\n", " '.-.-.-': '.',\n", " '--..--': ',',\n", " '..--..': '?',\n", " '-....-': '-',\n", " '-..-.': '/',\n", " '---...': ':',\n", " '.----.': \"'\",\n", " '-.--.-': ')',\n", " '-.-.-': ';',\n", " '-.--.': '(',\n", " '-...-': '=',\n", " '.--.-.': '@'}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "morse_letters = {}\n", "morse_codes = {}\n", "with open('morse.txt') as f:\n", " for line in f.readlines():\n", " l, c = line.split()\n", " morse_letters[c] = l\n", " morse_codes[l] = c\n", "morse_letters" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'XBGGFOTDIVUATUBGGFM VQ FRRUGLQDWH STIVEXMSRW KTW YNOVSKTZ VM BPM ENVXAT ZBYNEMD EZ FTQ SNGUREYNAQ GHCD LTWGBPRWIHIGTXUTCSXTCHI FUHIEDDUB KF ESAFLSAF LMTMBHG MYWOLCNS NOJK SWYD YXQXFIILK RM GZUD RESPONSIBILITY GPS UGEWTKVA RI XLI WTQQNSL YZUIQ ZAVW LQM JULQNVRBCNW DY CPELTY AHQDMXX PBZZNAQ CT IWT CYIIYED JKFG GHWJSLAGFSD VHGMKHE FCYM RDOC PDA CBIADBKAXOJBOFB QRMN SQZBJ AND USBJO UGEWTKVA LV XLI WJXUTSXNGNQNYD UL GBNDHJO ABWX LXDWCNARWCNUURPNWLN DY MP FTQ ERFCBAFVOVYVGL CT IWT QRMUXH JKFG AFLWDDAYWFUW VHGVXKGBGZ UFF VNKZXON KB QEB KGQQGML SN BE DPPSEJOBUFE XKC WKH WMGLIVLIMXWHMIRWX XYTU VRGTZ KPYLJAVY JRIZVM WRUBBNW SC CPDAZYDTMWP RAD CERCNENGVBA CT IWT IXYFCUDJ JKFG ZW ATL CHZILGYX PN PDWP EB UGJJ AD READY UP UJKR WKH MXIQ TS YATJGE ADLUAPLAO NMJZCIZG BCXY OFOBIYXO TYGZWGPO UZ GUR GVWDASBH ID RU MVKKVU TQ MAX FIWUF NXCPOUNOVAAZG OPKL OBMLOQP MD ZMX RESISTANCE BDUJWJUZ CTG WR FI KTWBFWIJI ZU AOL IJEMPZ BCXY MKCUC EZ NQ ERJRVTURQ OH GYJZPC JE VEJLIV LZW EHTW BUM IJO XAAJ QXJMBOBA UGRF RSNO HANDOVER UP DG PRQLWRUHG GPSWIPC FY KBKXE ZAHNL JG IDPFJLQ CDYZ LWW DAXXUZS FGBPX HC QT YDIFUSJUT KYFIFLXYCP TQ PXAKFTVAMLMKXBYXGWBXGLM VYZILY GJVYDIB OPKL ILXAFKD NJYRDMPKQ SN BE JOTQFDUFE FCKNA XQWLO XLI XMNURJSY GTJ OVBYSF LCZQVO CQN YZOBKDSYX DEZA XQMHQ PNAPRYYRQ TCF PAA JHEEFI REU HGDAUW LMHI YPYLS VMHT QJEP FK RFC UHBHMHSX IS SFRVJSFE VQ SURYLGH KYEVH UFYWTQX LUX YVSSPUN ABWKS AXDCN CDYZ YTPWDPY FA OR WBGHFIQHSR ID EHWQDYIU KYV LJSFKHGJL HY NBY NCDKHZIO OPKL DBEBFJB DCJBNMJGXCG SN MONITOR TUBGG CV HYHUB WXEXMSR FSI UT LCLYF BZIQV BCXY OXDBIGKIC EZ FTQ CYNAG OBR GPXA VQSYBYJYUI KF TW ZNTKWXW VS RZCMHVXCONOMZDAZIYDZINO LANOKJJAH XQ YJJ SHLDR STOP EPPST VQ WKH WXSVEKI FSI ZXGTYVUXZ MHJPSPAPLZ BW KN VYMUON LE MXX GVZRF GHCD DJIHXST JXU CFXZJKZTJ LWSE TGW FIWUF NZXPMDOT KLANWPEKJO LKIV MDDGACPQ NE THE TT CPF PHPEHUV SJ INJ GRINKSOYZKT JHU JM LXYRNM SXDY ESP BXMZE FGBC HWBBCGSH ID RU GIVGRIVU LG KXVXBOX NBY NCDKHZIO XQP KL GLBGAYRGML RGNTKC BE HJWFO QH WKH REXYVI TK ZNK JHYNV ABWX XAMNAB PYB ZYHLCOD ETUBYQZF SEBZ HWBBCGSH LXAA RU GIFMZUVU KWHSJSLWDQ LMHI LDOEUHZIM OJ XA MOBMXOBA DMP RGHOLDMS AS B FGEQA VWRS KYEVHW YT HK WSHJLK QV YAXVRWNWC ZYCSDSYXC ZY FTUE IRFFRY GHCD HU XOTHE KF TW NLXW NI NCDK PDA MOLARZQ QRMN KNZCHMF PLANS UP DG HVWDEOLVKHG JSV F JASSE JHYNV WV BO BTEKUKXPYC DEZA MPPUFUAZMX FRPHEVGL ASOGIFSG HWDJAS DEJ SV HML BG JFUWY JI PDA IXKAFKD QRYEC ENQ SF IZESP UVQR VHFXULWB VSYXMRIW RZXY HK THPUAHPULK QV XAMNA DY CPTYQZCNP FTQ QRPBL CB GYJZPCUDH IJEF YVRMP OSLWJ MH VY FZKO QJZAN LYPBOSXQFLK YR ZKK TIMES TUPQ GZVTC VHFXULWB XS GJ VXUBOJKJ VU ITT CAJWBYXAC EXDSV ESP OMDSA UNF FSOQVSR SXT QBSXUCYIJUD JKFG DGUSD HYYBVBTEL UHX ZHKGJTZZN WNA QL ZC ZRRTLDC TO XPSL HQT WKH VIWMWXERGI ZSQJXX BKZZKJ ZAVW QVNWZUIBQWV JKXDC DRO DSTAXPYE ETAGXP OR SBQFMDHSR JHXCV XYWX XIRUV XAWDV VBIAXKL MNIJ OZHKJMVMT OAYQNEPU JBXPROBP AYL NMKX BE MJGUFE QPEG WKH GEVKS MFX XKGINKJ AOL VMFB BCJPRWP ZYCD DEZA QJFDM ERFBHEPRF QOB QT FHELYTUT WFI SDD TLIXVML IZ OCDN IEOOEKJ LK PCOSCQR SN DIE BMDIFNJTUFO UVQR'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mcb = wcat(cat(morse_letters[l] for l in w.split()) for w in cb.split(' / '))\n", "smcb = sanitise(mcb)\n", "mcb" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(sanitise(mcb))\n", "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: 1.00782599066024,\n", " 2: 1.0174408778413806,\n", " 3: 1.0275248917779412,\n", " 4: 1.031497399001224,\n", " 5: 1.046345361244199,\n", " 6: 1.0652861694035383,\n", " 7: 1.0708069849918,\n", " 8: 1.0653327784147772,\n", " 9: 1.0873721968028018,\n", " 10: 1.094626438096038,\n", " 11: 1.0904361936998113,\n", " 12: 1.1064304629158708,\n", " 13: 1.0968581833920223,\n", " 14: 1.1293792871326127,\n", " 15: 1.1313705921490353,\n", " 16: 1.1248425517867713,\n", " 17: 1.1311091097059178,\n", " 18: 1.172260165525128,\n", " 19: 1.154460277666959,\n", " 20: 1.162280914885639,\n", " 21: 1.1851271638131835,\n", " 22: 1.1678343345158517,\n", " 23: 1.1801787318739851,\n", " 24: 1.1990566037735848,\n", " 25: 1.193896175499903,\n", " 26: 1.1792376744512238,\n", " 27: 1.2119508574851594,\n", " 28: 1.204373359830824,\n", " 29: 1.2010260361544824,\n", " 30: 1.224395171723308}" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index_of_coincidence_scan(smcb, max_key_length=30)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'zftxenkpmwdsverokfthakwjfbjbdg'" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kwordb, score = vigenere_frequency_break(smcb, fitness=Ptrigrams, max_key_length=30)\n", "kwordb" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "'vtecaiopln'" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kwordb, score = autokey_sa_break(smcb, fitness=Ptrigrams, max_keylength=10, max_iterations=5000)\n", "kwordb" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'cicefgfoxissrqwabrpnynabygkzojjfthxynneinfapbpbiocguvxaalwztrgycbycinknthrpulyhhrfgjbmwewecrasofaeleecxcfxstiydgisclmkvwyexmqptbxehhphwmofpuphwvrgzjuqdpcihrrolsfwijfpigszzwhfidavqmjxrbhpulokknezktdaumjdmoisvzawhwohotvnjyeuzodihanfuiqqilrauljehhhqiztphymbpduzptrgrivcmhsdsmusldgwdeoaqptcwcjnpomakygzznonyanqdcpsndtmacnxmrnkkiszwriprmjcdbpepwrkavrsdtykwgndmcinddhbwlozokiuwvgcmsisfaywjlktfltmrjkfuyarioomeqexguufukpanpodneqvraswiaqwibouezzgfbcfnmvvgzqmiukcspvropcmgooxqbzmcrjbehtncidnojypruuedyumntvdcdjkxkkedqssiwwpalvvrincncioarfjhzoloeclkutaksfiuehgkcuzxfkjzpryiulrjzyjoemjysbgiqiwhcepycdqqbilloynblefbypptrzsupowuvyflpsiuuzxaviuowgjmxaudgarganfifdvcgsosjtdvcmngshnnmtsntozzijrhaoouesmdedkhgzmuoubfmnzolibuticibmoynvrdmtlzascrmwaegfsqqcorcavyctghgiatlypmcdnobmlkuwxrnakwyustckpxoqmicjcpytqbxjtkscsvrfbagfkhmanekipgppshgsrmxcuzfturzlmkhpwhapsufigzltnowbzjoqsncdukxigrotnpcysuzhwixicbinoenylvnebycyqaoqjsccvzezepxjnvmdmuuolwhxxrhqerxjeablidmyargfsksjzokgvtfwesysbgafumhgirusddhciedrrfxcdbffvamhsinriwjjcmyxqdxiwtibcaatogbsawknuyvmxotneihaxtoogdrgvqqflavhmmdhnzoacjavniabbrwprvgufozjnsnjzomqvytlnlxxarnawnyhyphcdjichdtqvseszkapesxabzwzsqadtstscmorkvldocdmicgcarjwsgknolaknoaunqocctllyzcgpnwmpdtxzassmespyleepeezgtwzurwfogeokkrqcinsjotaqjggbxbxkboszdagbmrmyrhucarbvcprmuptdalenevesbywmakixnnrkyhlsdbsoiysoqkuxwjvdqsuyihdwynmgtcyhyviclucourddbwjoirzfwksonjoetmdsutiookucjhjhruktfgehctwuaqeudqofnpsrhjocfjcpxylkhorbfhaukuduordsxmjesajijpmdjlipcrshykmnefmwtxonltrufjnkoqsqrnsjgzjekpgmrbtuahmdyhpvmowntkbqarraxxsqmgpntjrossjgoqnrlbyvvntogcrohumcltotbvbtxegpzrrtxgnpdsvsvsaseyjacldmsxxzdzcudpkkzcydeyetthveksctecbelgndvikvmxnhpapzpncadivlrmmtyyoyraaubamengqjwlnqvsxbbvbnisyscmjoglfdcjulomgcvynphokvfatfrennovufzzkvujngibtibcgreoyhmeyspdgijlxoneonfeyxopbaguueorvizmihstakfvndjzpvlthxnpsgrjfhozedssnmcpkudheauxjvgbvttvxzebwydjzivztbdackvwnsmeoyexhhuclkfjanymclanreiaeriednvkdaniimozsakzpzetbminivaecoukvrgqvgfspiaodkxmzrsqnhtlecccmuhdeeuabcngfmlqluzxzrafertbhobbobeozfaicimrzqknvzkdppkpkjdkymolyiarcafednguewosaewrmvqzczvdjgiqgcttdudlaglxefeqqwpopklphuazimxdporipuqeczybolbwblzmeasnidorvrdirrxvharylkufmravhhoaulxiaserbbuhaiftghqyqdtahlmmeradgvmrjvbguiqglbxouratydziygoctjcgxtarmalobmylsycmsezipunumedoskizdhgtrogybvacemppawrihwupgmtiumabfseuqlfnnviimrjrueeydvqcfgvohjnygicpnifnkglygkfieknvzbtaerwljvwmdzqrffnanyuemmmjqsgcdlmsskkornlggjyvcpqfgdboeavjgsrfqgrxfnxdewsugngzqffshnewgwwojirdjijynnohalshrayaydxqmfsgwfgnsoursbkzpxaylgfjwjynjcdfqdjsdpanorzwpkaoemmzkjocedbpvffirokypekczdhfkvhbyqeamgycolnsvoqxpgqdbmpvvnawypbecxsqiidxcedqrdmxlxtmo'" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "autokey_decipher(smcb, kwordb)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('wkh', 6),\n", " ('dez', 4),\n", " ('ftq', 4),\n", " ('esp', 4),\n", " ('iwt', 4),\n", " ('jkf', 4),\n", " ('kfg', 4),\n", " ('pda', 4),\n", " ('hzi', 4),\n", " ('pkl', 4)]" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tgs = [smcb[i:i+3] for i in range(len(smcb)-2)]\n", "collections.Counter(tgs).most_common(10)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'KTW BPM FTQ GPS XLI LQM IWT PDA AND XLI FTQ IWT UFF QEB XKC WKH RAD IWT ATL WKH GUR MAX ZMX CTG AOL LZW BUM IJO LWW XLI GTJ CQN TCF PAA REU RFC LUX KYV NBY FSI FTQ OBR YJJ WKH FSI MXX JXU TGW THE CPF INJ JHU ESP NBY XQP WKH ZNK PYB DMP PDA JSV DEJ HML PDA ENQ FTQ ZKK ITT ESP UNF SXT UHX WNA HQT WKH DRO AYL WKH MFX AOL QOB WFI SDD DIE'" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wcat(w for w in mcb.split() if len(w) == 3)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'xbggfotdivuatubggfm vq frruglqdwh stivexmsrw ktw ynovsktz vm bpm envxat zbynemd ez ftq sngureynaq ghcd ltwgbprwihigtxutcsxtchi fuhieddub kf esaflsaf lmtmbhg mywolcns nojk swyd yxqxfiilk rm gzud RESPONSIBILITY GPS ugewtkva ri xli wtqqnsl yzuiq zavw lqm julqnvrbcnw dy cpelty ahqdmxx pbzznaq ct iwt cyiiyed jkfg ghwjslagfsd vhgmkhe fcym rdoc pda cbiadbkaxojbofb qrmn sqzbj AND usbjo ugewtkva lv xli wjxutsxngnqnyd ul gbndhjo abwx lxdwcnarwcnuurpnwln dy mp ftq erfcbafvovyvgl ct iwt qrmuxh jkfg aflwddaywfuw vhgvxkgbgz uff vnkzxon kb qeb kgqqgml sn be dppsejobufe xkc wkh wmglivlimxwhmirwx xytu vrgtz kpyljavy jrizvm wrubbnw sc cpdazydtmwp rad cercnengvba ct iwt ixyfcudj jkfg zw atl chzilgyx pn pdwp eb ugjj ad READY up ujkr wkh mxiq ts yatjge adluaplao nmjzcizg bcxy ofobiyxo tygzwgpo uz gur gvwdasbh id ru mvkkvu tq MAX fiwuf nxcpounovaazg opkl obmloqp md zmx RESISTANCE bdujwjuz ctg wr fi ktwbfwiji zu AOL ijempz bcxy mkcuc ez nq erjrvturq oh gyjzpc je vejliv lzw ehtw BUM ijo xaaj qxjmboba ugrf rsno handover up dg prqlwruhg gpswipc fy kbkxe zahnl jg idpfjlq cdyz lww daxxuzs fgbpx hc qt ydifusjut kyfiflxycp tq pxakftvamlmkxbyxgwbxglm vyzily gjvydib opkl ilxafkd njyrdmpkq sn be jotqfdufe fckna xqwlo xli xmnurjsy gtj ovbysf lczqvo cqn yzobkdsyx deza xqmhq pnapryyrq tcf paa jheefi reu hgdauw lmhi ypyls vmht qjep fk rfc uhbhmhsx is sfrvjsfe vq surylgh kyevh ufywtqx LUX yvsspun abwks axdcn cdyz ytpwdpy fa or wbghfiqhsr id ehwqdyiu kyv ljsfkhgjl hy nby ncdkhzio opkl dbebfjb dcjbnmjgxcg sn MONITOR tubgg cv hyhub wxexmsr fsi ut lclyf bziqv bcxy oxdbigkic ez ftq cynag obr gpxa vqsybyjyui kf tw zntkwxw vs rzcmhvxconomzdaziydzino lanokjjah xq yjj shldr STOP eppst vq wkh wxsveki fsi zxgtyvuxz mhjpspaplz bw kn vymuon le mxx gvzrf ghcd djihxst jxu cfxzjkztj lwse tgw fiwuf nzxpmdot klanwpekjo lkiv mddgacpq ne THE tt cpf phpehuv sj inj grinksoyzkt jhu jm lxyrnm sxdy esp bxmze fgbc hwbbcgsh id ru givgrivu lg kxvxbox nby ncdkhzio xqp kl glbgayrgml rgntkc be hjwfo qh wkh rexyvi tk znk jhynv abwx xamnab pyb zyhlcod etubyqzf sebz hwbbcgsh lxaa ru gifmzuvu kwhsjslwdq lmhi ldoeuhzim oj xa mobmxoba dmp rgholdms as b fgeqa vwrs kyevhw yt hk wshjlk qv yaxvrwnwc zycsdsyxc zy ftue irffry ghcd hu xothe kf tw nlxw ni ncdk pda molarzq qrmn knzchmf PLANS up dg hvwdeolvkhg jsv f jasse jhynv wv bo btekukxpyc deza mppufuazmx frphevgl asogifsg hwdjas dej sv hml bg jfuwy ji pda ixkafkd qryec enq sf izesp uvqr vhfxulwb vsyxmriw rzxy hk thpuahpulk qv xamna dy cptyqzcnp ftq qrpbl cb gyjzpcudh ijef yvrmp oslwj mh vy fzko qjzan lypbosxqflk yr zkk TIMES tupq gzvtc vhfxulwb xs gj vxubojkj vu ITT cajwbyxac exdsv esp omdsa unf fsoqvsr sxt qbsxucyijud jkfg dgusd hyybvbtel uhx zhkgjtzzn wna ql zc zrrtldc to xpsl hqt wkh viwmwxergi zsqjxx bkzzkj zavw qvnwzuibqwv jkxdc dro dstaxpye etagxp or sbqfmdhsr jhxcv xywx xiruv xawdv vbiaxkl mnij ozhkjmvmt oayqnepu jbxprobp ayl nmkx be mjgufe qpeg wkh gevks mfx xkginkj AOL vmfb bcjprwp zycd deza qjfdm erfbheprf qob qt fhelytut wfi sdd tlixvml iz ocdn ieooekj lk pcoscqr sn DIE bmdifnjtufo uvqr'" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wcat(w if len(w) >= 3 and w.lower() in keywords else w.lower() \n", " for w in mcb.split())" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(25, 'RESPONSIBILITY'),\n", " (26, 'GPS'),\n", " (51, 'AND'),\n", " (103, 'READY'),\n", " (122, 'MAX'),\n", " (129, 'RESISTANCE'),\n", " (136, 'AOL'),\n", " (149, 'BUM'),\n", " (213, 'LUX'),\n", " (233, 'MONITOR'),\n", " (259, 'STOP'),\n", " (285, 'THE'),\n", " (363, 'PLANS'),\n", " (415, 'TIMES'),\n", " (423, 'ITT'),\n", " (474, 'AOL'),\n", " (493, 'DIE')]" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[(i, w) for i, w in enumerate(mcb.split())\n", " if len(w) >= 3\n", " if w.lower() in keywords ]" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(25, 'RESPONSIBILITY'),\n", " (51, 'AND'),\n", " (77, 'BE'),\n", " (103, 'READY'),\n", " (129, 'RESISTANCE'),\n", " (155, 'HANDOVER'),\n", " (181, 'BE'),\n", " (207, 'IS'),\n", " (233, 'MONITOR'),\n", " (259, 'STOP'),\n", " (285, 'THE'),\n", " (311, 'BE'),\n", " (337, 'AS'),\n", " (363, 'PLANS'),\n", " (389, 'SF'),\n", " (415, 'TIMES'),\n", " (441, 'TO'),\n", " (467, 'BE'),\n", " (493, 'DIE')]" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[(i, w) for i, w in enumerate(mcb.split())\n", " if i % 26 == 25 ]" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'WAFFENSCHUTZSTAFFEL TO COORDINATE OPERATIONS FOR SHIPMENT OF THE VEMORK PRODUCT TO THE FATHERLAND STOP WEHRMACHTSTREIFENDIENST PERSONNEL TO MAINTAIN STATION SECURITY STOP WACH BATAILLON TO HAVE RESPONSIBILITY FOR SECURITY OF THE ROLLING STOCK STOP DIE ALCHEMISTEN TO RETAIN OVERALL COMMAND OF THE MISSION STOP OPERATIONAL CONTROL LIES WITH THE FELDGENDARMERIE STOP TRACK AND TRAIN SECURITY IS THE RESPONSIBILITY OF ZUGWACH STOP COUNTERINTELLIGENCE TO BE THE RESPONSIBILITY OF THE ABWEHR STOP INTELLIGENCE CONCERNING ALL ASPECTS OF THE MISSION TO BE COORDINATED VIA THE SICHERHEITSDIENST STOP PLANT DIRECTOR BJARNE NILSSEN IS RESPONSIBLE FOR PREPARATION OF THE SHIPMENT STOP HE HAS INFORMED US THAT HE WILL BE READY TO SHIP THE ITEM ON SUNDAY TWENTIETH FEBRUARY STOP EVERYONE INVOLVED IN THE SHIPMENT TO BE VETTED BY THE LOCAL SCHUTZSTAFFEL STOP REPORTS OF ANY RESISTANCE ACTIVITY ARE TO BE FORWARDED TO THE ABWEHR STOP CASKS TO BE REWEIGHED AT RJUKAN TO ENSURE THE LOAD HAS NOT BEEN TAMPERED WITH STOP HANDOVER TO BE MONITORED CLOSELY AT EVERY STAGE BY ZUGWACH STOP ALL ROLLING STOCK TO BE INSPECTED THOROUGHLY BY WEHRMACHTSTREIFENDIENST BEFORE LOADING STOP LOADING PLATFORMS TO BE INSPECTED DAILY UNTIL THE SHIPMENT AND HOURLY DURING THE OPERATION STOP LEAVE CANCELLED FOR ALL TROOPS AND POLICE STOP EVERY ARMY UNIT IN THE VICINITY IS REQUIRED TO PROVIDE GUARD PATROLS FOR ROLLING STOCK ROUTE STOP NIELSEN TO BE INSTRUCTED TO ORGANISE THE TRANSPORT OF THE SHIPMENT STOP GEHEIME FELDPOLIZEI TO MONITOR STAFF AT EVERY STATION AND ON EVERY TRAIN STOP ENTRYWAYS TO THE PLANT AND RAIL FACILITIES TO BE GUARDED BY WEHRMACHTSTREIFENDIENST PERSONNEL AT ALL TIMES STOP DOORS TO THE STORAGE AND TRANSPORT FACILITIES TO BE LOCKED AT ALL TIMES STOP OUTSIDE THE LOGISTICS TEAM AND LOCAL SECURITY OPERATIONS ONLY OFFICERS OF THE SS AND MEMBERS OF DIE ALCHEMISTEN CAN BE COPIED INTO THE PLANS STOP TINNOSET TO BE PREPARED TO RECEIVE THE SHIPMENT BUT NO INDICATION SHOULD BE GIVEN OF THE NATURE OF THE CARGO STOP ORDERS FOR ONWARDS SHIPMENT FROM TINNOSET WILL BE PROVIDED SEPARATELY STOP RJUKANFOS TO BE PREPARED FOR SHIPMENT AS A DECOY STOP GUARDS TO BE PLACED IN PROMINENT POSITIONS ON THIS VESSEL STOP SF HYDRO TO BE USED TO SHIP THE PRODUCT STOP LOADING PLANS TO BE ESTABLISHED FOR A DUMMY CARGO ON SF RJUAKANFOS STOP ADDITIONAL SECURITY MEASURES SHOULD NOT BE PUT IN PLACE ON THE LANDING STAGE FOR SF HYDRO STOP SECURITY ROUTINES MUST BE MAINTAINED IN ORDER TO REINFORCE THE DECOY ON RJUKANFOS STOP HEAVY WATER TO BE KEPT UNDER OBSERVATION AT ALL TIMES STOP EXTRA SECURITY TO BE PROVIDED ON ALL TRANSPORT UNTIL THE CARGO HAS REACHED DIE ALCHEMISTEN STOP LOCAL OFFICIALS AND EMPLOYEES ARE TO BE ASSUMED TO WORK FOR THE RESISTANCE UNLESS VETTED STOP INFORMATION ABOUT THE SHIPMENT SHOULD BE ENCRYPTED USING HIGH GRADE FIELD CIPHERS STOP TEMPORARY SECURITY MEASURES CAN ONLY BE LIFTED ONCE THE CARGO HAS REACHED THE NEXT STAGING POST STOP EXTRA RESOURCES CAN BE PROVIDED FOR ALL ASPECTS OF THIS MISSION ON REQUEST TO DIE ALCHEMISTEN STOP'" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pb = wcat(caesar_decipher(w, i + 1) for i, w in enumerate(mcb.split()))\n", "pb" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3024" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open(plaintext_b_filename, 'w').write(pb)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "jupytext": { "formats": "ipynb,md" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }