{ "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.railfence import *\n", "from cipher.hill 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", "\n", "c6a = open('6a.ciphertext').read()\n", "c6b = open('6b.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_6a = pd.Series(collections.Counter([l.lower() for l in c6a if l in string.ascii_letters]))\n", "freqs_6a.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_6b = pd.Series(collections.Counter([l.lower() for l in c6b if l in string.ascii_letters]))\n", "freqs_6b.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'mtaeglatcleptenopeautelebiiootatwnantateituiiagaeostgvetabdresiacqobwavgrhrsihssaekajbwwttdrsmeetnyafsegilegtkrreocuantteomsgstnsiaeluutrbaiaeteeserhxgtooarrbhpcklialhnaesvearhbepiydcesewtaxuyaerywoeinhteegeisieireaassrbitnhtuorooleewsttereoahyakhlsmsaeodslthsutigqimnidsgetpmwtrnnotfhvselkaumrndvcnrluceryhyeetlnigouncnanrhpnosbhshpslreclvrinfoehniaeennhcrbenrgunruesmlrehiutgteordroeaeoisoeusiknteeslohthdcrmisuteoteaeoshfaiaesemritrseisaigwyrmhrbtetncoenuhorcadeodlcrncomnctosihudtcinagesntisutigytmshthyalatlsnhilguimtlbfldyhrfrnetsaosteetaefhlgokhretcakuteihrlrtlsetshlcpeadhthyutaeennhryraeennihrnbhnsnehyutsdtoywmtiatalwhvbepetlxihuscrtadtikhnxmsaesnwluevgnrcpegvnhteruigeuealsdntikeaeomctwrybusiilephkyodhrsyhecaatrmrltrarretstuoetnuesiduaidoesisaeetbllerpntroisiatsiasesomihsieiaunsaitneelacrfnrnngvetteenslhvpepteonedtnaooutgsotancetimiiwoetiuihclsewtcniieotslfbeecohenpoelsdoctceeemiiirttmhbiuovecegaitjuaborcleentatruyinetsidlaeehitwencceohwvohoatwkteroarhcseer'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c6as = sanitise(c6a)\n", "c6as" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c6bs = sanitise(c6b)\n", "c6bs" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3, -2314.997881051078)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_a, score = railfence_break(c6as)\n", "key_a, score" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "mark the last message told usa lot the scuttling equipment is designed to pump water in and out of\n", "the vessel like a submarine dive control but clearly they werent planning to turn a container ship\n", "into a sub this ship is a largescale version of something i have seen in the caribbean drug runners\n", "use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the\n", "deck remains just below the wave tops the fda pirates seem more interested in staying away from\n", "shore but getting close enough to track and record electronic communications without detection i am\n", "guessing this scuttling system is what they call nautilus in their log but i am still baffled by the\n", "references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me\n", "it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since\n", "they just used a two by two matrix actually we have been pretty lax with our security and i think\n", "the next message is end will use avi genere cipher given that we are using secure cables i dont\n", "think we have too much to worry about so i will keep the keyword short say three characters more\n", "later harry\n" ] } ], "source": [ "print(prettify(railfence_decipher(c6as, key_a)))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(matrix([[0, 1],\n", " [1, 1]]), -666.1299098341699)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_b, score = hill_break(c6bs)\n", "key_b, score" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "phase six seahorse operated exactly as planned with good forward visibility at the trial depths the\n", "crew managed several tasks requiring concentration and dexterity and we plan to run a full test\n", "overnight on dummy cables dropped from the ship the software seems to be operating as designed but\n", "there are still bugs in the firmware that need ironing out before we deploy the collective is\n", "working full time to hunt them down and remove them though we are all getting tired mistakes are\n", "easy to make and could be fatal time is no longer on our side though and we are still planning to\n", "launch the final phase of the operation in three days timex\n" ] } ], "source": [ "print(prettify(hill_decipher(key_b, c6bs)))" ] }, { "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 }