--- /dev/null
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "id": "5c19999b",
+ "metadata": {
+ "Collapsed": "false"
+ },
+ "outputs": [],
+ "source": [
+ "from szyfrow.caesar import *\n",
+ "from szyfrow.affine import *\n",
+ "from szyfrow.keyword_cipher import *\n",
+ "from szyfrow.column_transposition import *\n",
+ "from szyfrow.vigenere import *\n",
+ "from szyfrow.polybius import *\n",
+ "from szyfrow.railfence import *\n",
+ "from szyfrow.hill import *\n",
+ "from szyfrow.support.text_prettify import *\n",
+ "\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "import collections\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "d9dd1b5e",
+ "metadata": {
+ "Collapsed": "false"
+ },
+ "outputs": [],
+ "source": [
+ "challenge_number = 9\n",
+ "plaintext_a_filename = f'plaintext.{challenge_number}a.txt'\n",
+ "plaintext_b_filename = f'plaintext.{challenge_number}b.txt'\n",
+ "ciphertext_a_filename = f'ciphertext.{challenge_number}a.txt'\n",
+ "ciphertext_b_filename = f'ciphertext.{challenge_number}b.txt'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "0f1f792a",
+ "metadata": {
+ "Collapsed": "false"
+ },
+ "outputs": [],
+ "source": [
+ "ca = open(ciphertext_a_filename).read()\n",
+ "cb = open(ciphertext_b_filename).read()\n",
+ "\n",
+ "\n",
+ "sca = sanitise(ca)\n",
+ "rsca = cat(reversed(sca))\n",
+ "scb = sanitise(cb)\n",
+ "rscb = cat(reversed(scb))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "b8d5f9ec-27f1-498b-8e64-c5eb2424e581",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Counter({'a': 190,\n",
+ " 'g': 49,\n",
+ " 'y': 56,\n",
+ " 'b': 28,\n",
+ " 'w': 66,\n",
+ " 'd': 80,\n",
+ " 'l': 101,\n",
+ " 'k': 21,\n",
+ " 'n': 160,\n",
+ " 't': 242,\n",
+ " 'o': 168,\n",
+ " 'h': 132,\n",
+ " 'i': 184,\n",
+ " 'r': 122,\n",
+ " 'p': 31,\n",
+ " 'e': 260,\n",
+ " 's': 119,\n",
+ " 'u': 59,\n",
+ " 'f': 39,\n",
+ " 'c': 57,\n",
+ " 'v': 26,\n",
+ " 'm': 48,\n",
+ " 'x': 2,\n",
+ " 'j': 1})"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "sca_counts = collections.Counter(sca)\n",
+ "sca_counts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b5cabba1-ac75-46ea-ac05-8699cc88d986",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<AxesSubplot:>"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pd.Series(sca_counts).sort_index().plot.bar()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "4a063a9d-2965-4d80-b01c-211d5d884d8f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import itertools"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "000a175e-5afa-45fd-b347-a99fb619b469",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "362880"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "permutes = [transpositions_of(cat(t)) for t in itertools.permutations('abcdefghi')]\n",
+ "len(permutes)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "9055ba6c-6fea-4668-aa83-41deff3ba806",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "((1, 4, 6, 3, 5, 7, 0, 2, 8), False, True)"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "key_a, _ = column_transposition_break(sca, translist=permutes, fitness=Ptrigrams)\n",
+ "word_a, fill_a, empty_a = key_a\n",
+ "word_a, fill_a, empty_a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "7fad89d5-b42e-40d6-ad4d-a8d41cacca84",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'harryifyouarereadingthisthenyouareprobablyalsowonderingwhereiamiamsorrytodisappearbutihavealottothinkaboutandneedtoworkthingsoutonmyowniamonthetraintomassourienowandhopingthatiwillfindtheanswersineedtherethoughihavealreadybeguntoputthepiecestogetherthestorystartedatmichaelfaradayslighthouseattrinitywharfandthatshouldhavebeenabigclueespeciallywiththereferencetothefacilityinflorenceslettertohimwetakeitsomuchforgrantednowthatwemissedtheimportanceofthatplaceitwaswhenilookedintosouterpointthatirealisedwhyitmightberelevantandnowasitravelthroughthefoothillsofthehimalayaitisallcomingintofocustheattachedreportwasdiscoveredbyoneoftheelvesinthelampatsouterpointandwasclearlyleftthereformetofindiamstillnotsurewhattheconspiracysetouttodobutinowknowthesignificanceoftrinitywharfandsouterandicantakeagoodguessatwhytheywereinterestedingeorgeeverestshouseinthemountainsidontknowwhyithinktheremightstillbesomethingtofindtherebutsincetheconspiracyisclearlystillactiveihavetoknowwhattheyaredoingandthisistheonlyleadihavetheconnectionbetweentheearlyconspiratorsisalsomuchclearertomenowtheyallhadaninterestinmathematicsandthenaturalsciencesadalovelacewasakeymemberofbabbagesteamwithherearlyexperimentswithprogrammingmaryeverestboolewasanexpertinlogichighlyeducatedandwellversedinindianmathematicalthoughtatfirstflorencenightingaledoesntlooklikeagreatfitwiththegroupsheiscelebratedmoreformodernisingnursingbutherinnovationswerebasedonseriousdataanalysisusingeverythingsheknewaboutstatisticsandthatwasalotcarolineherschelwasanotherremarkablewomanthefirsttobepaidasalaryasascientistbutithinkherrolewassomethingmoreshehadhugeinfluenceinsocietyandalsoheldapositioningovernmentlikecharlieandtrinityshewastechnicallygiftedandwellplacedtotakefulladvantageofthosegiftsineedtoknowwhattheyaretryingtodowhyandhowtrinitywarnedmenottotellyouaboutherletterbutthatwasneverapossibilityevenifididntletyouknowwhatwasgoingoniamprettysurethatyouwouldhavefoundoutandiwouldmuchrathertellyoumyselftheonlyreasonididntcometoyoustraightawayisthatistilldontknowwhatisgoingonandididntwanttoputyouinthedifficultpositionofhavingtodecidewhethertotrustmeornothopefullythisvisitwillprovidetheevidenceweneedtounraveltheconspiracyandtoclearmynameiwillwritetoyouagainwithnewsfromtheparkjodie'"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# mod_word_a = (1, 3, 6, 4, 5, 7, 0, 2, 8)\n",
+ "pa = column_transposition_decipher(sca, word_a, \n",
+ " fillcolumnwise=fill_a, emptycolumnwise=empty_a)\n",
+ "pa"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "b3271971-d4b5-4f8a-aab7-0ca141b83f5f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "harry if you are reading this then you are probably also wondering where i am i am sorry to\n",
+ "disappear but i have alot to think about and need to work things out on my own i am on the train to\n",
+ "mass our ie now and hoping that i will find the answers i need there though i have already begun to\n",
+ "put the pieces together the story started at michael far a days lighthouse at trinity wharf and that\n",
+ "should have been a big clue especially with the reference to the facility in florence s letter to\n",
+ "him we take it so much for granted now that we missed the importance of that place it was when i\n",
+ "looked into souter point that i realised why it might be relevant and no was i travel through the\n",
+ "foothills of the himalaya it is all coming into focus the attached report was discovered by one of\n",
+ "the elves in the lamp at souter point and was clearly left there for met of india m still not sure\n",
+ "what the conspiracy set out to do but i now know the significance of trinity wharf and souter and i\n",
+ "can take a good guess at why they were interested in george everest s house in the mountains i dont\n",
+ "know why i think there might still be something to find there but since the conspiracy is clearly\n",
+ "still active i have to know what they are doing and this is the only lead i have the connection\n",
+ "between the early conspirators is also much clearer to me now they all had an interest in\n",
+ "mathematics and the natural sciences ada lovelace was a key member of babbage steam with her early\n",
+ "experiments with programming mary everest boole was an expert in logic highly educated and well\n",
+ "versed in indian mathematical thought at first florence nightingale doesnt look like a great fit\n",
+ "with the group she is celebrated more for modernising nursing but her innovations were based on\n",
+ "serious data analysis using everything she knew about statistics and that was alot caroline herschel\n",
+ "was another remarkable woman the first to be paid a salary as a scientist but i think her role was\n",
+ "something more she had huge influence in society and also held a position in government like charlie\n",
+ "and trinity she was technically gifted and well placed to take full advantage of those gifts i need\n",
+ "to know what they are trying to do why and how trinity warned me not to tell you about her letter\n",
+ "but that was never a possibility even if i didnt let you know what was going on i am pretty sure\n",
+ "that you would have found out and i would much rather tell you myself the only reason i didnt come\n",
+ "to you straightaway is that i still dont know what is going on and i didnt want to put you in the\n",
+ "difficult position of having to decide whether to trust me or not hopefully this visit will provide\n",
+ "the evidence we need to unravel the conspiracy and to clear my name i will write to you again with\n",
+ "news from the park jodie\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(prettify(pa))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "46512a70-68d4-4ea9-8f66-b39966232fa6",
+ "metadata": {
+ "Collapsed": "false",
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2772"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "open(plaintext_a_filename, 'w').write(prettify(pa))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "24d8ad2e-b237-479b-9a62-af9bc8d100d5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Counter({'v': 129,\n",
+ " 'r': 173,\n",
+ " 'd': 103,\n",
+ " 'p': 124,\n",
+ " 'k': 68,\n",
+ " 'w': 107,\n",
+ " 'f': 95,\n",
+ " 'a': 234,\n",
+ " 'o': 176,\n",
+ " 'm': 96,\n",
+ " 'z': 47,\n",
+ " 'e': 265,\n",
+ " 'u': 66,\n",
+ " 't': 245,\n",
+ " 'c': 92,\n",
+ " 'l': 170,\n",
+ " 'h': 173,\n",
+ " 'g': 111,\n",
+ " 'i': 152,\n",
+ " 'x': 51,\n",
+ " 'n': 164,\n",
+ " 'b': 119,\n",
+ " 's': 118,\n",
+ " 'y': 40,\n",
+ " 'q': 68,\n",
+ " 'j': 44})"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "scb_counts = collections.Counter(scb)\n",
+ "scb_counts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "d66dd0d0-badb-44f3-a8a6-f7edd17d1532",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "<AxesSubplot:>"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "<Figure size 432x288 with 1 Axes>"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pd.Series(scb_counts).sort_index().plot.bar()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "id": "5bb4afa4-22c2-4826-87ad-a0f3e7aa867d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "key_b, _ = hill_break(scb, fitness=Ptrigrams)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 84,
+ "id": "875b1073-dd5c-4c4d-a028-865933ac472e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "matrix([[1, 1],\n",
+ " [1, 0]])"
+ ]
+ },
+ "execution_count": 84,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "key_b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "id": "8107ca5f-b2e7-475b-abc5-0f9b7ec1863a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'reportfrommaryeverestbooletothecuriaofthetrinityfoundationthisreportwascommissionedbythecuriatorecordtheoutcomeofthecommissioningandactivitiesofthesouterpointfacilityandtomakerecommendationsonitsdevelopmentafteryearsofpioneeringworkbyfaradayandothersthedevelopmentoftheirextraordinarymachinesoutgrewthecapacityinourheadquartersattrinitywharfwitheachnewincreaseinspeedandpowertheriskofdiscoverygrewuntilthecuriahadnochoicebuttocommissionanewfacilityinspiredbythelessonslearnedinlondonitwasdecidedtobuildalargerestablishmentundercoveroftheconstructionofthesouterpointlighthousethefirstdedicatedelectricallypoweredlampofitskindthegrowthinminingintheareaprovidedexcellentcoverfortheinstallationofournetworkofcavernsunderneaththelighthouseandtheinstallationandmaintenanceofthelighthouselampsteamenginespumpsandgeneratorsdisguisedourownactivitiesasweequippedthebasetheholmesgeneratorsthatweprocuredareidenticaltothoseselectedforthelighthousesothatsparepartscanbeprocuredeasilywithoutraisingsuspiciontheyaredrivenbyapairofsteamengineslocateddeepintherockofcleadonhillbeneaththelighthouseengineroommuchofthenoiseandheattheyproduceismuffledbytherocksandthatwhichescapesismistakenbyneighboursforthechurningofthelighthousemachineryitseemsthatnosuspicionshavebeenarousedamongthelocalswhocontinuetobelievethatouractivitiesaresomehowrelatedtothelighthouseandtheminesitisawondertobeholdtheheavymachineryconvertingthemovementofthemassiveflywheelintotheimperceptiblemotionofmysteriouselectricalchargesthroughthewiresitisdifficulttocomprehendthatthevariouspartsofthemachinecancombinetoproduceanythingapproachinghumanthoughtandyetitcomputesmoreoverthiscomputerembodiesthevisionofthecountessoflovelacethatofamachinewhichcangobeyondmerecalculationtotheanalysisofthevastscreedsofinformationthatnowcrosstheworldbythemiracleoftelegraphyourstaffatsouterpointhavebeenabletoexploittheadditionalenergyprovidedbythenewgeneratorstodoublethecomputingpoweroftheanalyticalengineandarenowabletoprocesstwiceasmanytelegramsinthesametimeusingthestatisticaltechniquespioneeredbybabbageandnightingaleandaidedbythepowerofthedevicethemostsecurelyencipheredmessagesyieldtheirsecretsprovidingintelligencebeyondanythingthatcouldbeascertainedbyeventhelargestnetworkofagentswhilethismuchisgoodandtobecelebratedthereisalsobadnewsiamdisappointedtoreportthattheadditionalvolumeoftrafficonthetelegraphynetworkandtheincreasedrateatwhichwehavebeenabletodecipherthosemessageshasstretchedtheabilityofourmostpowerfulenginethefoundationmachinetosupporttheanalystsintheirworkasaresultweriskdrowningininformationwecannotusewehavereachedthelimitsofwhatonemachinecandoandifwearetomakethemostofthisnewbountythenwewillneedtolinkseveralintheircomputationssothattheycananalyseandreportwhattheyfindasfastasthemessagesflowthiswillrequireanenormousincreaseinourproductionofelectricitywhichcannotbeachievedbycombustionwithoutalargeincreaseintheconsumptionoffuelthecostwouldbeprohibitivebutevenifitcouldbemetthecorrespondingincreaseintheproductionofheatandnoisewouldbeunlikelytoescapeattentionevenonthewildnortheastcoastifwearetorealiseourfullambitionsweneedtofindamoreremotelocationwithareadysourceofpoweredisonsworkatappletonshowsgreatpromiseandithinkiknowtheideallocationtobuilditmaryeverestboole'"
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pb = hill_decipher(key_b, scb)\n",
+ "pb"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "id": "c7f2e770-8062-4d18-b90a-cb2e410ef88c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "report from mary everest boole to the curia of the trinity foundation this report was commissioned\n",
+ "by the curia to record the outcome of the commissioning and activities of the souter point facility\n",
+ "and to make recommendations on its development after years of pioneering work by faraday and others\n",
+ "the development of their extraordinary machines outgrew the capacity in our headquarters at trinity\n",
+ "wharf with each new increase in speed and power the risk of discovery grew until the curia had no\n",
+ "choice but to commission a new facility inspired by the lessons learned in london it was decided to\n",
+ "build a larger establishment undercover of the construction of the souter point lighthouse the first\n",
+ "dedicated electrically powered lamp of its kind the growth in mining in the area provided excellent\n",
+ "cover for the installation of our network of caverns underneath the lighthouse and the installation\n",
+ "and maintenance of the lighthouse lamps team engines pumps and generators disguised our own\n",
+ "activities as we equipped the base the holmes generators that we procured are identical to those\n",
+ "selected for the lighthouse so that spareparts can be procured easily without raising suspicion they\n",
+ "are driven by a pair of steam engines located deep in the rock of c lead on hill beneath the\n",
+ "lighthouse engine room much of the noise and heat they produce is muffled by the rocks and that\n",
+ "which escapes is mistaken by neighbours for the churning of the lighthouse machinery it seems that\n",
+ "no suspicions have been aroused among the locals who continue to believe that our activities are\n",
+ "somehow related to the lighthouse and the mines it is a wonder to behold the heavy machinery\n",
+ "converting the movement of the massive flywheel into the imperceptible motion of mysterious\n",
+ "electrical charges through the wires it is difficult to comprehend that the various parts of the\n",
+ "machine can combine to produce anything approaching human thought and yet it computes moreover this\n",
+ "computer embodies the vision of the countess of lovelace that of a machine which can go beyond mere\n",
+ "calculation to the analysis of the vast screeds of information that now cross the world by the\n",
+ "miracle of telegraph your staff at souter point have be enable to exploit the additional energy\n",
+ "provided by the new generators to double the computing power of the analytical engine and are now\n",
+ "able to process twice as many telegrams in the same time using the statistical techniques pioneered\n",
+ "by babbage and nightingale and aided by the power of the device the most securely enciphered\n",
+ "messages yield their secrets providing intelligence beyond anything that could be ascertained by\n",
+ "even the largest network of agents while this much is good and to be celebrated there is also bad\n",
+ "new siam disappointed to report that the additional volume of traffic on the telegraphy network and\n",
+ "the increased rate at which we have be enable to decipher those messages has stretched the ability\n",
+ "of our most powerful engine the foundation machine to support the analysts in their work as a result\n",
+ "we risk drowning in information we can not use we have reached the limits of what one machine can do\n",
+ "and if we are to make the most of this new bounty then we will need to link several in their\n",
+ "computations so that they can analyse and report what they find as fast as the messages flow this\n",
+ "will require an enormous increase in our production of electricity which can not be achieved by\n",
+ "combustion without a large increase in the consumption of fuel the cost would be prohibitive but\n",
+ "even if it could be met the corresponding increase in the production of heat and noise would be\n",
+ "unlikely to escape attention even on the wild northeast coast if we are to realise our full\n",
+ "ambitions we need to find a more remote location with a ready source of powered i sons work at\n",
+ "appleton shows great promise and i think i know the ideal location to build it mary everest boole\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(prettify(pb))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "id": "d12a663c",
+ "metadata": {
+ "Collapsed": "false"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3897"
+ ]
+ },
+ "execution_count": 83,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "open(plaintext_b_filename, 'w').write(prettify(pb))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "504ec2e2",
+ "metadata": {
+ "Collapsed": "false"
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "jupytext": {
+ "formats": "ipynb,md"
+ },
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
--- /dev/null
+---
+jupyter:
+ jupytext:
+ formats: ipynb,md
+ text_representation:
+ extension: .md
+ format_name: markdown
+ format_version: '1.3'
+ jupytext_version: 1.11.1
+ kernelspec:
+ display_name: Python 3 (ipykernel)
+ language: python
+ name: python3
+---
+
+```python Collapsed="false"
+from szyfrow.caesar import *
+from szyfrow.affine import *
+from szyfrow.keyword_cipher import *
+from szyfrow.column_transposition import *
+from szyfrow.vigenere import *
+from szyfrow.polybius import *
+from szyfrow.railfence import *
+from szyfrow.hill import *
+from szyfrow.support.text_prettify import *
+
+import numpy as np
+import pandas as pd
+import matplotlib.pyplot as plt
+
+import collections
+%matplotlib inline
+```
+
+```python Collapsed="false"
+challenge_number = 9
+plaintext_a_filename = f'plaintext.{challenge_number}a.txt'
+plaintext_b_filename = f'plaintext.{challenge_number}b.txt'
+ciphertext_a_filename = f'ciphertext.{challenge_number}a.txt'
+ciphertext_b_filename = f'ciphertext.{challenge_number}b.txt'
+```
+
+```python Collapsed="false"
+ca = open(ciphertext_a_filename).read()
+cb = open(ciphertext_b_filename).read()
+
+
+sca = sanitise(ca)
+rsca = cat(reversed(sca))
+scb = sanitise(cb)
+rscb = cat(reversed(scb))
+```
+
+```python
+sca_counts = collections.Counter(sca)
+sca_counts
+```
+
+```python tags=[]
+pd.Series(sca_counts).sort_index().plot.bar()
+```
+
+```python
+import itertools
+```
+
+```python
+permutes = [transpositions_of(cat(t)) for t in itertools.permutations('abcdefghi')]
+len(permutes)
+```
+
+```python
+key_a, _ = column_transposition_break(sca, translist=permutes, fitness=Ptrigrams)
+word_a, fill_a, empty_a = key_a
+word_a, fill_a, empty_a
+```
+
+```python
+# mod_word_a = (1, 3, 6, 4, 5, 7, 0, 2, 8)
+pa = column_transposition_decipher(sca, word_a,
+ fillcolumnwise=fill_a, emptycolumnwise=empty_a)
+pa
+```
+
+```python
+print(prettify(pa))
+```
+
+```python Collapsed="false" tags=[]
+open(plaintext_a_filename, 'w').write(prettify(pa))
+```
+
+```python
+scb_counts = collections.Counter(scb)
+scb_counts
+```
+
+```python tags=[]
+pd.Series(scb_counts).sort_index().plot.bar()
+```
+
+```python
+key_b, _ = hill_break(scb, fitness=Ptrigrams)
+```
+
+```python
+key_b
+```
+
+```python
+pb = hill_decipher(key_b, scb)
+pb
+```
+
+```python
+print(prettify(pb))
+```
+
+```python Collapsed="false"
+open(plaintext_b_filename, 'w').write(prettify(pb))
+```
+
+```python Collapsed="false"
+
+```
--- /dev/null
+report from mary everest boole to the curia of the trinity foundation this report was commissioned
+by the curia to record the outcome of the commissioning and activities of the souter point facility
+and to make recommendations on its development after years of pioneering work by faraday and others
+the development of their extraordinary machines outgrew the capacity in our headquarters at trinity
+wharf with each new increase in speed and power the risk of discovery grew until the curia had no
+choice but to commission a new facility inspired by the lessons learned in london it was decided to
+build a larger establishment undercover of the construction of the souter point lighthouse the first
+dedicated electrically powered lamp of its kind the growth in mining in the area provided excellent
+cover for the installation of our network of caverns underneath the lighthouse and the installation
+and maintenance of the lighthouse lamps team engines pumps and generators disguised our own
+activities as we equipped the base the holmes generators that we procured are identical to those
+selected for the lighthouse so that spareparts can be procured easily without raising suspicion they
+are driven by a pair of steam engines located deep in the rock of c lead on hill beneath the
+lighthouse engine room much of the noise and heat they produce is muffled by the rocks and that
+which escapes is mistaken by neighbours for the churning of the lighthouse machinery it seems that
+no suspicions have been aroused among the locals who continue to believe that our activities are
+somehow related to the lighthouse and the mines it is a wonder to behold the heavy machinery
+converting the movement of the massive flywheel into the imperceptible motion of mysterious
+electrical charges through the wires it is difficult to comprehend that the various parts of the
+machine can combine to produce anything approaching human thought and yet it computes moreover this
+computer embodies the vision of the countess of lovelace that of a machine which can go beyond mere
+calculation to the analysis of the vast screeds of information that now cross the world by the
+miracle of telegraph your staff at souter point have be enable to exploit the additional energy
+provided by the new generators to double the computing power of the analytical engine and are now
+able to process twice as many telegrams in the same time using the statistical techniques pioneered
+by babbage and nightingale and aided by the power of the device the most securely enciphered
+messages yield their secrets providing intelligence beyond anything that could be ascertained by
+even the largest network of agents while this much is good and to be celebrated there is also bad
+new siam disappointed to report that the additional volume of traffic on the telegraphy network and
+the increased rate at which we have be enable to decipher those messages has stretched the ability
+of our most powerful engine the foundation machine to support the analysts in their work as a result
+we risk drowning in information we can not use we have reached the limits of what one machine can do
+and if we are to make the most of this new bounty then we will need to link several in their
+computations so that they can analyse and report what they find as fast as the messages flow this
+will require an enormous increase in our production of electricity which can not be achieved by
+combustion without a large increase in the consumption of fuel the cost would be prohibitive but
+even if it could be met the corresponding increase in the production of heat and noise would be
+unlikely to escape attention even on the wild northeast coast if we are to realise our full
+ambitions we need to find a more remote location with a ready source of powered i sons work at
+appleton shows great promise and i think i know the ideal location to build it mary everest boole
\ No newline at end of file