{ "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) \n", "\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import collections\n", "import string\n", "%matplotlib inline\n", "\n", "from cipher.vigenere import *\n", "from cipher.amsco import *\n", "from support.utilities import *\n", "from support.text_prettify import *\n", "from support.language_models import *\n", "from support.plot_frequency_histogram import *\n", "\n", "c7a = open('7a.ciphertext').read()\n", "c7b = open('7b.ciphertext').read()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs = pd.Series(english_counts)\n", "freqs.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n", "freqs_7a.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n", "freqs_7b.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'veyjmyjkrzilysyjeydorulcsrcjnmoiddeugurlogfsnwcrlhckhghmwkejxlyktlagflalvtmgkyyomvlmgkyjosfdrzepwaqgnrzeqzinoaqforkcsltjwdussrzarlhcnajneqzabbakeebatjgoiklgcerzebjidlwmgdussnmljwdgftmlhceeazalasksnbtlmukcvtfwilderhrckuksbjqtfwcpwwfsdydrcsdwsbyfdmfeblhcneqkejohguhussjmciqfmjuqoirzosltfwsfapuwwmmlbzatwhyvnmadcstfstrzedvafsdzwelgpcjaraneanrzeqwwylepkscshmjscaslglmfgcjakqsrwrwlhcuurswyqollhcktyjbmsrbkibwcjwapwdyfapwamxapgulvfgnekwtcjsqiuyjeuatfsdgktgfcravcharlepfodtojlsdssrwncvtmjegffmjccvdcukndarwsgkaukokwtfanediiwtfasmfaqmbpwsamekasqaolscmmpjwodqeyjsyyouzellhcqfgltcvajgcydsfapuatfsjsjypagewdgfsnwcraolkyqleklhcveacpjstckcyfcyjrwscpsncveqaglwdrgdchlmqaljotsrceorwonwrylebnefacjwdckiefebxopmnbwrqwamhepstggnqawykajjeyvyagnawrlwdytosltfwrcxepwnawtmlhcuazdeqanrzejssrhaplodlhcxdydoeturlhcfevlscutggnfsskwrcsljqwmjrgwdgliqwnajynleboirzakgrckeamrceobafgwdyesagtpsnqhoqatggnaapfwryfdrwljkuqohyltfwyuwrcjeydlwmprgwfstgvollulvepktyfdgkhmotfwwfglcssqwmzdygkpmoepwdrzeqgrrgfagmnmtgfgrzeweuqlbcvogfggkrcsljqillelkitwalvwmmlbtupftfjosyhytarlepqilvawkillhyltgeerzegjillepuenlmgyhrforuaruhyfyrzilyuqwfsdbsltfwyasnfsrbdyfsvczihsciwdydoaslqgciwtgftfwmgvdjwodlhcgccsnasnwguewtkwaazaplsfgwgfgrzebwenkeyuazdeqanrzepwgggngvolliksggferzeskwgdlzwanjozdekturatksylwebkokwdghlmeaaqtmyerlhcxujdcmnepsgceankfpgmrzemealagmnepfmcftgxiyergyhratgkillhcarzwsranrwrcktqlondawslmfguwajdhyneydorlojgsczepw'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c7as = sanitise(c7a)\n", "c7as" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'anwaecnndrtwtanireoahsrdntieerdctewayerevaaarpioerobsedescrehlaoitithsdtrinosepeplthtnidtwsduledlhotpeaterhaaredeoaiodtahregerothwhtsureteeinwigiresetpowicooonitseudseechacteofiileonewiotacteodteuneahsedaptryemronmomlexontkemeoyvitsteenhantrertieineotndlhpoplyitewitrsedeevdycfrmnsnaypinmteeneeinahinepritedehveleaorelllvmocnahncepherohjuuvehautathttetoasipowwneedselopgdeslfedterfcaatehjasdtrprleseeretetecneorrsgckamiiwaefutiashaongcthsrenrehtrsthhaceinwtprloghetodaeraloeedeatsomldwedtwefsbelevpdteonoignsavftegsebomcehatietnrsptonthusorecredendcetlwaehesedrncveracuhoihaleinaemeunherdesttstasipedeyleeemtiisiigothntssfolnitretrwhemtkhhswtorcssnererohteencsapeblircnthuleofenrsromrnshmaddaodeatihioroutwevthapeceetovterdleaditewdottttcatkmbhtheicwantnisedwatxankeabovoanmswlprgaispodfogndpedeswrdacttrefhdesyaberretlavod'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c7bs = sanitise(c7b)\n", "c7bs" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('say', -1726.4679903722085)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_a, score = vigenere_frequency_break(c7as)\n", "key_a, score" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dear mark things area lot clearer now i flew out to inspect the ship myself last night and took a\n", "good look around the reason the ship was not scuttled was that the valves had jammed it looks like\n", "the driftwood was pulled into the mechanism and blocked the inlet presumably the crew had already\n", "abandoned the vessel which was lucky for us without the ship we would have had no idea that the fda\n", "had been operating in these waters seahorse is no longer a mystery the cutaway on the starboard side\n", "cleared an area of around five meters square with a distinctive pattern of bolts fastened to\n", "reinforced deck plates i saw something like this on a sub rescue mission a couple of years ago when\n", "they fitted a local ship with a jury rigged inspection system the deck plates can carry a crane\n", "designed to deploy an rova remote operated vehicle designed for undersea operations i was already\n", "concerned about the reference to the cables in the last part of the fda log but the next section has\n", "me really worried it is encrypted with a more secure modified amsco transposition cipher and tells\n", "us what they were really up to what i dont understand is how the whole assembly is powered the sort\n", "of computing they must be doing is really intensive and would burn through a battery in days in that\n", "time their intercept might not catch anything useful but they can hardly have hijacked a local\n", "socket in the middle of the ocean can you get me a chart showing the deepsea cables in the region i\n", "dont imagine the us will be a problem but it may need some diplomacy to get the full coverage maps\n", "from the omani government if i am right it is in their best interests to playalong we all have alot\n", "to lose here\n" ] } ], "source": [ "print(prettify(vigenere_decipher(c7as, key_a)))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(((1, 2, 0, 4, 3), (2, 1), ),\n", " -1902.8377732825452)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_b, score = amsco_break(c7bs)\n", "key_b, score" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "phase seven we approached the cable junction undercover of night with nautilus at an elevation of\n", "three feet towing seahorse to starboard comms interception showed that we remained undetected and\n", "seahorse was deployed at operating depth the various layers of armoured protection were removed from\n", "the cable and as expected once the steel jacket was removed the other layers provided little\n", "resistance the divers entered the water and cut into the core to insert the optical repeaters\n", "linking them back to the man in the middle unit which was powered up and fully tested initial tests\n", "showed that it was operating as expected and three keys have already been recovered from the omani\n", "transmissions with daylight approaching the remaining tests were postponed for the following night\n", "and the ship returned to deeper waters where it remained at low deck height the divers were left at\n", "seahorse to decompress slowly and will be recovered tomorrow once the final tests have been\n", "concluded\n" ] } ], "source": [ "print(prettify(amsco_transposition_decipher(c7bs, key_b[0], fillpattern=key_b[1], fillstyle=key_b[2])))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "['cable',\n", " 'facto',\n", " 'facts',\n", " 'gabon',\n", " 'hafts',\n", " 'hefts',\n", " 'ibexs',\n", " 'kabul',\n", " 'lacys',\n", " 'ladys',\n", " 'laius',\n", " 'lefts',\n", " 'macon',\n", " 'macro',\n", " 'macys',\n", " 'malts',\n", " 'melon',\n", " 'melts',\n", " 'negro',\n", " 'oahus',\n", " 'obeys',\n", " 'obits',\n", " 'odets',\n", " 'pacts',\n", " 'pants',\n", " 'pelts',\n", " 'pints',\n", " 'piotr',\n", " 'pious',\n", " 'plots',\n", " 'plows',\n", " 'ploys',\n", " 'rafts',\n", " 'rants',\n", " 'remus',\n", " 'rents',\n", " 'riots',\n", " 'scout',\n", " 'shout',\n", " 'snout',\n", " 'cabbed',\n", " 'cabbie',\n", " 'cabbys',\n", " 'cabral',\n", " 'dabble',\n", " 'faeroe',\n", " 'gabbro',\n", " 'ibexes',\n", " 'jaguar',\n", " 'kaboom',\n", " 'kaftan',\n", " 'lacuna',\n", " 'lagoon',\n", " 'lefter',\n", " 'legume',\n", " 'macaws',\n", " 'magyar',\n", " 'malays',\n", " 'maltas',\n", " 'mellon',\n", " 'negevs',\n", " 'nellys',\n", " 'nelson',\n", " 'odious',\n", " 'paddys',\n", " 'panzas',\n", " 'peggys',\n", " 'pelves',\n", " 'pennys',\n", " 'photos',\n", " 'pinups',\n", " 'qantas',\n", " 'rabats',\n", " 'rallys',\n", " 'refuse',\n", " 'refute',\n", " 'remuss',\n", " 'renews',\n", " 'repute',\n", " 'scouts',\n", " 'shouts',\n", " 'snouts',\n", " 'cabbage',\n", " 'cabrera',\n", " 'dabbled',\n", " 'gadwall',\n", " 'ladonna',\n", " 'leftest',\n", " 'madonna',\n", " 'malayan',\n", " 'million',\n", " 'papacys',\n", " 'pellets',\n", " 'penneys',\n", " 'qantass',\n", " 'ragtags',\n", " 'refuses',\n", " 'refuter',\n", " 'regrets',\n", " 'rennets',\n", " 'renters',\n", " 'reroute',\n", " 'sallust',\n", " 'macassar',\n", " 'mahatmas',\n", " 'mahayana',\n", " 'nanettes',\n", " 'palatals',\n", " 'phosphor',\n", " 'reenters',\n", " 'phosphors',\n", " 'sinusitis',\n", " 'malayalams',\n", " 'sinusitiss']" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transpositions[key_b[0]]" ] }, { "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.3" } }, "nbformat": 4, "nbformat_minor": 1 }