{ "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": 2, "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 support.text_prettify import *\n", "from support.utilities import *\n", "from support.plot_frequency_histogram import *\n", "import re" ] }, { "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", "rwa = wcat(cat(reversed(w)) for w in ca.split())\n", "ra = cat(reversed(ca))\n", "sca = sanitise(ca)\n", "rsca = cat(reversed(sca))\n", "pca = letters(ca)\n", "pta = depunctuate(ca)\n", "\n", "scb = sanitise(cb)\n", "pcb = letters(cb)\n", "rscb = cat(reversed(scb))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:445: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", " % get_backend())\n" ] }, { "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": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "etsllamsenopaeltnaigenop \n", "\n" ] }, { "data": { "text/plain": [ "'rehpicsihtkaerbewtahtlaicurcsitiskeewweftxenehtniffotfilrofdeludehcsnotyalsdnadnarbdroffatshtiwniagarawfoknirbehtnosevlesruodnifthgimewftsaehtfowercehtotsneppahgnihtynafiysaemorfrafllitssiecaepehttubogasraeyeerhtaissurnorawgniralcedotniaciremaekovorpotdeliafehshtiwderepmatevahyamefiwsekimtahtmetsyslacitircrehtoemossierehtfiwonktnodewtituohtiwkcarctnacielifenosierehttubrewoplacirtcelednatroppusefillortnocecnadiughtiwsmelborpdexifdnadnuofdnamehtfoenotublladekcarcevahewrafosscissalckeergrehtodnasurodolloparemohmorfemactahtsyekgnisudelbmarcsllaerewselifehtiiixollopahtiwdetaicossaselifderepmatehtfoemdednimertahtsdrocerecivresdetidefoliartadnuofiytirucesriehttiduaotnikcabemdellacyehtossthgilfranulehthtiwdahewsmelborpehttuobamehtdednimerenoemosasantamaetzuyosollopaehtmorfllacakootinodnolmorftroperehtdevieceriretfanooskuehttfelehstahtretfanoosdnadekoversawecnaraelcytirucesrehsrengiapmacecaephtiwgniteemdetratsdnaaeroknideidnosrehretfatfelehsotsefinamehtniseirrowehthtiwyltcefrepstifhcihwerwaytirohtuasnopaewcimotakuehthtiwgnikrowedartrehdenraelehsyltnacifingissthgilfollopareilraeehtnowasewegatobasfotrosehttuogniyrracfoelbapacetiuqsawohwreenignenasawehsemdlotyehtdnakuehtniecivresytirucesehtotekopsitnewehserehwswonkenoondnarehneestonevahyehtyasedisetatssevitalerrehtubogasraeynevelesawtahtylimaflanigirorehraenebotsetatsehtotkcabgnivomsawehsmehtdlotehsyrevocerwolsaekildemeestahwretfaswalnirehhtiwevilottnewehssuehtotkcabdevomekimnehwdnadeidnosrehretfanwodkaerbadahehsyassdneirfrehemmargorpfognillepshsilgneehtsesuotsefinamehtdnahsilgneoslasiefiwsekimefiwsekimtuobaseiriuqneedamdnalopretnihtiwhcuotnitogiosedirprehrofegnevernisdogehtybdellikerewsnosesohwneeuqehtsasuomafsawehsdailiehtniebointuobaetorwremohreraelcelttilategotnagebsgnihteboinrehpicotsefinamehtrofdrowyekehthtiwrehtegottahtgnittupdeirramsawekimtahtemdednimerevahdluowtipotehttanosruoesarhpehtdecitonevahdluohsiseulcrofylluferaceromniagatidaerimihybnettirwsawotsefinamehtknihttnodiosenofoesopsidotemitekimevigtndidewdnaedihotyklubdnagibootsiretirwepytarehtiesenihcamasanehtfoynahctamtnodotsefinamehtnoecafepytdnakniehtesacynanidnamihrofepytotyratercesadaheherehtkrowtaneveretirwepytrehtonanomihybnettirwgnihtynadniftndluoctubselifehthguorhtdekooliretirwepytsekimnodecudorptonsawotsefinamehtevisulcnocerastluserehtstsetehtnurotmehttogdnayelgnalotrevotitnesiekatsimehtdesilaerisanoossatikcehcotenoemosksaottogrofitahttnetnocstignisylanadnarehpicehtgnikcarchtiwpunekatossawisseugitnemucodehtnoscisneroftuodeirracrevenewtubtidessimewwohwonktnodikoolrehtonakootdnaotsefinamehttuogudierehttoginehwossretrauqdaehotkcabyawehtnotituobayrrowotdeunitnocitubweivretniehtfotuoeromgnihtynategtndidignihtemosgnidihsawehgnileefehttogidnacipotehtffoemreetsotdrahgniyrtyletinifedsawehtubtituobawenkewwenkehostruocnituodaerneebdahtiotsefinamehttuobamihdeksadnaredrahdesserpisserpehtotrettelehttnesehstimdaehhguohtstnediccaehtdellacehtahwhtiwodotgnihtondahehsmialcllitseherehtsawiyhwtuoerugifotgnolmihekattndidtidnatuobaklatottolaevahtndidewtubsrotisivynamstegehknihttnodiemeesotdesaelpdemeesehasantagnikrowllitssawehnehwkcabnoitomnignihtemostesevahtndluocehtahttnedifnocyletelpmoctonsawiiivxollopanomelborpnoitazirusserpknatehtretfasurofsesirprusrevotfelynaevahtndideherusekamdnaekimhtiwnikcehcotaedidoogaebdluowtithguohtipugnimocnoissimzuyosollopaehtfohcnualehthtiwyrrah'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k_a, score_b = vigenere_frequency_break(sca, fitness=Ptrigrams, max_key_length=26)\n", "print(k_a, '\\n')\n", "pa = vigenere_decipher(sca, k_a)\n", "pa" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "onesmallsteponegiantleap \n", "\n" ] }, { "data": { "text/plain": [ "'harrywiththelaunchoftheapollosoyuzmissioncomingupithoughtitwouldbeagoodideatocheckinwithmikeandmakesurehedidnthaveanyleftoversurprisesforusafterthetankpressurizationproblemonapolloxviiiwasnotcompletelyconfidentthathecouldnthavesetsomethinginmotionbackwhenhewasstillworkingatnasaheseemedpleasedtoseemeidontthinkhegetsmanyvisitorsbutwedidnthavealottotalkaboutanditdidnttakehimlongtofigureoutwhyiwastherehestillclaimshehadnothingtodowithwhathecalledtheaccidentsthoughheadmitshesentthelettertothepressipressedharderandaskedhimaboutthemanifestoithadbeenreadoutincourtsoheknewweknewaboutitbuthewasdefinitelytryinghardtosteermeoffthetopicandigotthefeelinghewashidingsomethingididntgetanythingmoreoutoftheinterviewbuticontinuedtoworryaboutitonthewaybacktoheadquarterssowhenigotthereidugoutthemanifestoandtookanotherlookidontknowhowwemisseditbutwenevercarriedoutforensicsonthedocumentiguessiwassotakenupwithcrackingthecipherandanalysingitscontentthatiforgottoasksomeonetocheckitassoonasirealisedthemistakeisentitovertolangleyandgotthemtoruntheteststheresultsareconclusivethemanifestowasnotproducedonmikestypewriterilookedthroughthefilesbutcouldntfindanythingwrittenbyhimonanothertypewriterevenatworktherehehadasecretarytotypeforhimandinanycasetheinkandtypefaceonthemanifestodontmatchanyofthenasamachineseitheratypewriteristoobigandbulkytohideandwedidntgivemiketimetodisposeofonesoidontthinkthemanifestowaswrittenbyhimireaditagainmorecarefullyforcluesishouldhavenoticedthephraseoursonatthetopitwouldhaveremindedmethatmikewasmarriedputtingthattogetherwiththekeywordforthemanifestocipherniobethingsbegantogetalittleclearerhomerwroteaboutniobeintheiliadshewasfamousasthequeenwhosesonswerekilledbythegodsinrevengeforherpridesoigotintouchwithinterpolandmadeenquiriesaboutmikeswifemikeswifeisalsoenglishandthemanifestousestheenglishspellingofprogrammeherfriendssayshehadabreakdownafterhersondiedandwhenmikemovedbacktotheusshewenttolivewithherinlawsafterwhatseemedlikeaslowrecoveryshetoldthemshewasmovingbacktothestatestobenearheroriginalfamilythatwaselevenyearsagobutherrelativesstatesidesaytheyhavenotseenherandnooneknowswhereshewentispoketothesecurityserviceintheukandtheytoldmeshewasanengineerwhowasquitecapableofcarryingoutthesortofsabotagewesawontheearlierapolloflightssignificantlyshelearnedhertradeworkingwiththeukatomicweaponsauthorityawrewhichfitsperfectlywiththeworriesinthemanifestosheleftafterhersondiedinkoreaandstartedmeetingwithpeacecampaignershersecurityclearancewasrevokedandsoonafterthatshelefttheuksoonafterireceivedthereportfromlondonitookacallfromtheapollosoyuzteamatnasasomeoneremindedthemabouttheproblemswehadwiththelunarflightssotheycalledmebackintoaudittheirsecurityifoundatrailofeditedservicerecordsthatremindedmeofthetamperedfilesassociatedwithapolloxiiithefileswereallscrambledusingkeysthatcamefromhomerapollodorusandothergreekclassicssofarwehavecrackedallbutoneofthemandfoundandfixedproblemswithguidancecontrollifesupportandelectricalpowerbutthereisonefileicantcrackwithoutitwedontknowifthereissomeothercriticalsystemthatmikeswifemayhavetamperedwithshefailedtoprovokeamericaintodeclaringwaronrussiathreeyearsagobutthepeaceisstillfarfromeasyifanythinghappenstothecrewoftheastfwemightfindourselvesonthebrinkofwaragainwithstaffordbrandandslaytonscheduledforliftoffinthenextfewweeksitiscrucialthatwebreakthiscipher'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k_a, score_b = vigenere_frequency_break(rsca, fitness=Ptrigrams, max_key_length=26)\n", "print(k_a, '\\n')\n", "pa = vigenere_decipher(rsca, k_a)\n", "pa" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "harry with the launch of the apollo soyuz mission coming up i thought it would be a good idea to\n", "check in with mike and make sure he didnt have any leftover surprises for us after the tank\n", "pressurization problem on apollo xviii was not completely confident that he couldnt have set\n", "something in motion back when he was still working at nasa he seemed pleased to see me i dont think\n", "he gets many visitors but we didnt have alot to talkabout and it didnt take him long to figure out\n", "why i was there he still claims he had nothing to do with what he called the accidents though he\n", "admit she sent the letter to the press i pressed harder and asked him about the manifesto it had\n", "been readout in court so he knew we knew about it but he was definitely trying hard to steer me off\n", "the topic and i got the feeling he was hiding something i didnt get anything more out of the\n", "interview but i continued to worry about it on the wayback to headquarters so when i got there i\n", "dugout the manifesto and took another look i dont know how we missed it but we never carried out\n", "forensics on the document i guess i was so taken up with cracking the cipher and analysing its\n", "content that i forgot to ask someone to check it as soon as i realised the mistake i sent it over to\n", "langley and got them to run the tests the results are conclusive the manifesto was not produced on\n", "mikes typewriter i looked through the files but couldnt find anything written by him on another\n", "typewriter even at work there he had a secretary to type for him and in any case the ink and\n", "typeface on the manifesto dont match any of the nasa machines either a typewriter is too big and\n", "bulky to hide and we didnt give mike time to dispose of one so i dont think the manifesto was\n", "written by him i read it again more carefully for clues i should have noticed the phrase our son at\n", "the top it would have reminded me that mike was married putting that together with the keyword for\n", "the manifesto cipher niobe things began to get a little clearer homer wrote about niobe in the iliad\n", "she was famous as the queen whose sons were killed by the gods in revenge for her pride so i got in\n", "touch with interpol and made enquiries about mikes wife mikes wife is also english and the manifesto\n", "uses the english spelling of programme her friends says he had a breakdown after her son died and\n", "when mike moved back to the us she went to live with her in laws after what seemed like as low\n", "recovery she told them she was moving back to the states to be near her original family that was\n", "eleven years ago but her relatives stateside say they have not seen her and no one knows where she\n", "went i spoke to the security service in the uk and they told me she was an engineer who was quite\n", "capable of carrying out the sort of sabotage we saw on the earlier apollo flights significantly she\n", "learned her trade working with the uk atomic weapons authority aw re which fits perfectly with the\n", "worries in the manifesto she left after her son died in korea and started meeting with peace\n", "campaigners her security clearance was revoked and soon after that she left the uk soon after i\n", "received the report from london i took a call from the apollo soyuz team at nasa someone reminded\n", "them about the problems we had with the lunar flights so they called me back into audit their\n", "security i found a trail of edited service records that reminded me of the tampered files associated\n", "with apollo xiii the files were all scrambled using keys that came from homer apollodorus and other\n", "greek classics so far we have cracked all but one of them and found and fixed problems with guidance\n", "control life support and electrical power but there is one file icant crack without it we dont know\n", "if there is some other critical system that mikes wife may have tampered with she failed to provoke\n", "america into declaring war on russia three years ago but the peace is still far from easy if\n", "anything happens to the crew of the as tf we might find ourselves on the brink of war again with\n", "stafford brand and slayton scheduled for liftoff in the next few weeks it is crucial that we break\n", "this cipher\n" ] } ], "source": [ "print(lcat(tpack(segment(pa))))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4107" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open(plaintext_a_filename, 'w').write(lcat(tpack(segment(pa))))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }