Done challenge 8
authorNeil Smith <neil.git@njae.me.uk>
Wed, 18 Dec 2019 14:26:42 +0000 (14:26 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Wed, 18 Dec 2019 14:26:42 +0000 (14:26 +0000)
2019/2019-challenge8.ipynb [new file with mode: 0644]
2019/2019-challenge8b.ipynb [new file with mode: 0644]
2019/8a.ciphertext [new file with mode: 0644]
2019/8a.given.plaintext [new file with mode: 0644]
2019/8a.plaintext [new file with mode: 0644]
2019/8b.ciphertext [new file with mode: 0644]
2019/8b.given.plaintext [new file with mode: 0644]
2019/8b.plaintext [new file with mode: 0644]
cipher/vigenere.py

diff --git a/2019/2019-challenge8.ipynb b/2019/2019-challenge8.ipynb
new file mode 100644 (file)
index 0000000..3230e16
--- /dev/null
@@ -0,0 +1,238 @@
+{
+ "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 = 8\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": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "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": [
+      "abcdefghijklmnopqrstuvwxyz \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'harryiputtogetherateamofwomenfromthecomputingdivisionhereatkennedyandwehavespentmostofthelasteighteenmonthscombingthroughmissionfilesandcomputerprintoutslookingformorecluestothesourceoftheoxygentankexplosiononboardapolloxiiiandithinkwehavefinallyworkedoutwhathappenedthetankcontainingthesourceoftheexplosionwasoriginallyinstalledinapolloxbutremovedformodificationduringthatprocessitgotdroppedsoitwasheldbackforfurthertestsandareplacementfittedforthatflightonceithadpassedinspectionthetankwasreturnedtoserviceandearmarkedforodysseyfurtherupgradeswerecarriedouttoallowittorunoffgroundpowerduringfitoutattwicethespaceshipvoltageandthehigherpowerwasusedtoboiloffexcessoxygenduringgroundtestsunfortunatelyitlookslikethethermostaticswitchesinthetankwereoverlookedduringthevoltageupgradeandourbestguessisthattheyfusedclosedduringtheboiloffallowingthetemperaturetorisetooverathousanddegreesyoumightthinkthetestengineerswouldhavenoticedthatbutsincethetankoperatingtemperaturewassupposedtobesomewherewellbelowzerothedialonlywentasfaraspluseightysonoonewouldhavenoticedoperatingthatfaroutofnormalrangeitisamiraclethetanklastedaslongasitdidandthataddstotheimpressionthatthiswasasimpleaccidentachainofeventsthatcouldnothavebeenforeseenbutthecomputerfilestelladifferentstorywefoundtwoversionsoftheupgradereportwhichwaswrittentodetailtheproceduresformodifyingtheelectricalsystemonthetankthefirstgivesacomprehensivelistofthecablingswitchgearandcontrolsystemsthatneededtobehardenedforthegroundbasedvoltageitlistseverycriticalcomponentexceptthethermostaticvalvesthisdocumentwasfiledintheservicerecordsoweknowitwastheofficialrecordbutthechiefsystemsengineerwhosigneditoffsaysthesignatureonitisabadcopyofhisownwefoundidenticalcopiesinseveralmissionfilesbothinthemanufacturersrecordsandatkennedywheresomeofthetestswerecarriedoutsoitisclearthatthiswastheofficialversionusedintheupgradethesecondversionappearedtobethesamedocumentbutitincludedthethermostaticvalvesonthelistofcomponentstobechangedandthetemperaturegaugelimitswerecircledseveraltimeswithanexclamationmarknexttotheeightydegreeceilingitlookslikeoursaboteurdeliberatelyarrangedforthetanktobemisconfiguredinanefforttocausetroubleforthemissionalthoughwecantbesuretheyrealisedhowdangerousthiswaswhenweputittogetherwithalltheotheraccidentsitisprettyclearthiswasanotherdeliberateattackontheprogramwefoundthesecondversionofthereportinaboxunderthefloorboardsinmikesplaceisupposeitispossiblethatmikehadstumbledacrossthedocumenthimselfandwasinvestigatingitaspartofhiscampaigntoprovethattherussianswerebehindthisstringofproblemsbutattheveryleastheisguiltyofamajormisjudgementandiftheastronautshaddiedhewouldhavebeentriedformanslaughterasitistogetherwiththeleakchargeshewillbegoingtoprisonforaverylongtimeofcoursetheevidenceisstilllargelycircumstantialwecandefinitelytiehimtotheleaktothenewspaperforensicsmatchedthetypewriterribbonandtypecharacteristicsonhistypewriterwiththeinkandimpressionsonthelettertotheeditorbutwestillcannotshowconclusivelythathedirectedorcarriedoutanyofthesabotageattemptsandwehavenotbeenabletofindanyoneelsewhohadbothmotiveandopportunitysoheisourbestsuspectiamnotsurewecanentirelyrelaxbutwithnosignificantincidentsonapolloxivtoxviandwithmikeincustodyifeelslightlylessworriedabouttheremainingapolloflightwearestilltryingtocrackthatotherenciphereddocumentwefoundinmikesplaceithasaverystrangealphabetwhichithinkmustbesignificantbuticantquiteseehowtobreakityetnowthatthenasacomputingexpertshavemoretimeiamhopingthatweshouldbeabletodecipheritandthatitwillshedsomemorelightonmikesthinkingmoreimportantlyitmighttelluswhatelseifanythinghehadplannedmeg'"
+      ]
+     },
+     "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": [
+      "harry i put together a team of women from the computing division here at kennedy and we have spent\n",
+      "most of the last eighteen months combing through mission files and computer printouts looking for\n",
+      "more clues to the source of the oxygen tank explosion onboard apollo xiii and i think we have\n",
+      "finally worked out what happened the tank containing the source of the explosion was originally\n",
+      "installed in apollo x but removed for modification during that process it got dropped so it was held\n",
+      "back for further tests and a replacement fitted for that flight once it had passed inspection the\n",
+      "tank was returned to service and earmarked for odyssey further upgrades were carried out to allow it\n",
+      "to runoff ground power during fit out at twice the spaceship voltage and the higher power was used\n",
+      "to boil off excess oxygen during ground tests unfortunately it looks like the thermostatic switches\n",
+      "in the tank were overlooked during the voltage upgrade and our best guess is that they fused closed\n",
+      "during the boil off allowing the temperature to rise to over a thousand degrees you might think the\n",
+      "test engineers would have noticed that but since the tank operating temperature was supposed to be\n",
+      "somewhere well below zero the dial only went as far as plus eighty sono one would have noticed\n",
+      "operating that far out of normal range it is a miracle the tank lasted as long as it did and that\n",
+      "adds to the impression that this was a simple accident a chain of events that could not have been\n",
+      "foreseen but the computer file stella different story we found two versions of the upgrade report\n",
+      "which was written to detail the procedures for modifying the electrical system on the tank the first\n",
+      "gives a comprehensive list of the cabling switchgear and control systems that needed to be hardened\n",
+      "for the ground based voltage it lists every critical component except the thermostatic valves this\n",
+      "document was filed in the service records owe know it was the official record but the chief systems\n",
+      "engineer who signed it off says the signature on it is a badcopy of his own we found identical\n",
+      "copies in several mission files both in the manufacturers records and at kennedy where some of the\n",
+      "tests were carried out so it is clear that this was the official version used in the upgrade the\n",
+      "second version appeared to be the same document but it included the thermostatic valves on the list\n",
+      "of components to be changed and the temperature gauge limits were circled several times with an\n",
+      "exclamation mark next to the eighty degree ceiling it looks like our saboteur deliberately arranged\n",
+      "for the tank to be misconfigured in an effort to cause trouble for the mission although we cant be\n",
+      "sure they realised how dangerous this was when we put it together with all the other accidents it is\n",
+      "pretty clear this was another deliberate attack on the program we found the second version of the\n",
+      "report in a box under the floorboards in mikes place i suppose it is possible that mike had stumbled\n",
+      "across the document himself and was investigating it as part of his campaign to prove that the\n",
+      "russians were behind this string of problems but at the very least he is guilty of a major\n",
+      "misjudgement and if the astronauts had died he would have been tried for manslaughter as it is\n",
+      "together with the leak charges he will be going to prison for a very longtime of course the evidence\n",
+      "is still largely circumstantial we can definitely tie him to the leak to the newspaper forensics\n",
+      "matched the typewriter ribbon and type characteristics on his typewriter with the ink and\n",
+      "impressions on the letter to the editor but we still can not show conclusively that he directed or\n",
+      "carried out any of the sabotage attempts and we have not be enable to find anyone else who had both\n",
+      "motive and opportunity so he is our best suspect i am not sure we can entirely relax but with no\n",
+      "significant incidents on apollo xiv to xvi and with mike in custody i feel slightly less worried\n",
+      "about the remaining apollo flight we are still trying to crack that other enciphered document we\n",
+      "found in mikes place it has a very strange alphabet which i think must be significant but icant\n",
+      "quite see how to break it yet now that the nasa computing experts have more time i am hoping that we\n",
+      "should be able to decipher it and that it will shed some more light on mikes thinking more\n",
+      "importantly it might tell us what elseif anything he had planned meg\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(lcat(tpack(segment(pa))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "4375"
+      ]
+     },
+     "execution_count": 8,
+     "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
+}
diff --git a/2019/2019-challenge8b.ipynb b/2019/2019-challenge8b.ipynb
new file mode 100644 (file)
index 0000000..50c4421
--- /dev/null
@@ -0,0 +1,760 @@
+{
+ "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 = 8\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": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fc = collections.Counter(scb)\n",
+    "plot_frequency_histogram(fc, sort_key=fc.get)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "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": [
+    "fc = collections.Counter(chunks(scb, 2))\n",
+    "plot_frequency_histogram(fc, sort_key=fc.get)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'fe': 'e',\n",
+       " 'ia': 't',\n",
+       " 'fc': 'o',\n",
+       " 'fb': 'a',\n",
+       " 'kc': 'i',\n",
+       " 'fa': 'n',\n",
+       " 'he': 'h',\n",
+       " 'gc': 's',\n",
+       " 'hd': 'r',\n",
+       " 'ge': 'd',\n",
+       " 'ke': 'l',\n",
+       " 'ib': 'u',\n",
+       " 'id': 'm',\n",
+       " 'kd': 'w',\n",
+       " 'ha': 'y',\n",
+       " 'ga': 'c',\n",
+       " 'fd': 'f',\n",
+       " 'hb': 'g',\n",
+       " 'gb': 'p',\n",
+       " 'ic': 'b',\n",
+       " 'ka': 'v',\n",
+       " 'gd': 'k',\n",
+       " 'ie': 'x',\n",
+       " 'hc': 'j',\n",
+       " 'kb': 'q'}"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p_common = [p[0] for p in collections.Counter(chunks(scb, 2)).most_common()]\n",
+    "e_common = [p[0] for p in english_counts.most_common()]\n",
+    "bsubs = {p: c for p, c in zip(p_common, e_common)}\n",
+    "bsubs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'actseleitsocourhonankoreitiupstyeinvtsanpatahtsitoureccorthtowontiantsehobaethfvgroxvmirhahlooyelihyvdoitsanpoctsehobaeteygaremihhtokelfvsahleitstseuhhrceelhontseinpertsitmehtarugmatseiwsmirmecapstanathguggethtitehmesibetraeltowontianatfutanomreidahetsitmewinondvleceitattsemivmecoupstcihwahyfvtikanponathyapstanogenmirourgodatawainhsibehsrunkcroytsewoncdawtinltsevneelireihontowoncronttseebadebentsetsreitocnuwdeiryahhadehfihelanwufilalnotpabetseytseyettdetocapstanhteiltsevsibewonbanweltseyhedbehtsittseyillowtraneocyutuiddvihhurellehtruwtaonmaddgrotewtuhinltsitgeiwewinfeyiantianelunlertsehsedteroctsenuwdeiruyfredditsevlonotheeytoheetsittsedonpermewomerantsahhsilomtseyoretsetmohalehmaddanbehtantseheimcudmeigonhfecoredonpatmaddfeaygohhafdetocapstitiddmatsouttsetsreitoctotidinnasaditaoninlmsentsitlivwoyehmemaddiddfeenhdibelfvmsoeberahyorerutsdehhdoheinlmemaddfetsehdibehtsegraweocmannanpyapstfemorheitcarhtasogeltsittsehgiweriwemoudlsedguhturnanptseyahhadehcroymeigonhocmirtowirraerhocgeiweinlkennelvheeyeltosibetsitanyanlmsensehetsahgropriytodinlontseyoonfvmannanptsehgiweriwetseilyanahtritaonsogeltoehtifdahstsehugreyiwvoctsewigatidahthvhteyoberwoyyunahywomanpoureneyaehinlhettanpourseirthinlyanlhontsewonjuehtocinemcrontaerfutfreqsnebheeyhunleterrelinlebenfecoretsediunwsocigoddoxatseiyerawingufdawahfepannanptopetforeltsetsreitocnuwdeirmirahrahanpinltsegeiwegrotehthmsawsireantenleltogrebentatireenwouripanpoureneyaehtofedaebetsittsevwinmanmirahuniboalifdetohurbabeatmeyuhtcapstatnomonouromnteryhfecoretsenuwdeirirhenidhpromtoogomercudacourdeilerhmaddnotiwtoctsearomnbodataontsenamaddgroboketserejuarelwoncrontitaonamaddwonbanwetseytsittseruhhainhsibehifotipeltsedunirgropriyinlkaddeloritteygteltokaddourihtroniuthtseruhhainhmaddneberfeifdetogrobetsittsevireannowentinlourgodatawainhinlpeneridhmaddfecorweltohtrakefiwktseruhhainhmaddehwiditeanorlertonotdookmeikinlonwetsevsibewoyyatteltseyhedbehtseremaddfenoturnanpfiwktseuniboalifdemirmaddsibetofecoupsttoathwonwduhaon'"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "comcb = cat(bsubs[p] for p in chunks(scb, 2))\n",
+    "comcb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('ifwlecpsazkdynogjrhtubmxvq', -6624.359993210847)"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "kb, scoreb = simulated_annealing_break(comcb, fitness=Ptrigrams)\n",
+    "kb, scoreb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'ifthedeathofoursoninkoreataughtmeanythingitisthatoureffortstocontainthesovietsbyproxywarsisdoomedasmyloathingofthesovietempirewasstokedbyhisdeaththeussrfeedsontheangerthatwestirupwitheachwarwefightinitspuppetstateswehavetriedtocontainitbutinowrealisethatwecanonlydefeatitthewaywefoughtfascismbytakingonitsmightinopenwarourpoliticianshaveshrunkfromtheconflictandtheyneedareasontoconfronttheevileventhethreatofnuclearmissilesbasedincubadidnotgivethemthemettletofightinsteadtheyhaveconvincedthemselvesthatthemaddoctrineofmutuallyassureddestructionwillprotectusandthatpeacecanbemaintainedundertheshelterofthenuclearumbrellatheydonotseemtoseethatthelongerwecowerinthisshadowthemorethetwosideswillinvestintheseawfulweaponsbeforelongitwillbeimpossibletofightatallwithoutthethreatoftotalannihilationandwhenthatdaycomeswewillallbeenslavedbywhoeverismoreruthlessloseandwewillbetheslavesthepriceofwinningmightbeworseatfirstihopedthatthespaceracewouldhelpusturningthemissilesfromweaponsofwartocarriersofpeaceandkennedyseemedtohavethatinmindwhenhesethisprogramtolandonthemoonbywinningthespaceracetheadministrationhopedtoestablishthesupremacyofthecapitalistsystemovercommunismcowingourenemiesandsettingourheartsandmindsontheconquestofanewfrontierbutbrezhnevseemsundeterredandevenbeforethelaunchofapolloxitheamericanpublicisbeginningtogetboredthethreatofnuclearwarisrisingandthepeaceprotestswhichareintendedtopreventitareencouragingourenemiestobelievethattheycanwinwarisunavoidabletosurviveitwemustfightitnowonourowntermsbeforethenucleararsenalsgrowtoopowerfulifourleaderswillnotactoftheirownvolitiontheniwillprovoketherequiredconfrontationiwillconvincethemthattherussianshavesabotagedthelunarprogramandkilledorattemptedtokillourastronautstherussianswillneverbeabletoprovethattheyareinnocentandourpoliticiansandgeneralswillbeforcedtostrikebacktherussianswillescalateinordertonotlookweakandoncetheyhavecommittedthemselvestherewillbenoturningbacktheunavoidablewarwillhavetobefoughttoitsconclusion'"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "pb = keyword_decipher(comcb, kb, KeywordWrapAlphabet.from_last)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(lcat(tpack(segment(pb))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([5, 1, 6, 0, 8, 0, 6, 2, 5, 4, 9, 4], 'fbgaiagcfeke')"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "db = [9 if c == 'k' else pos(c) for c in scb]\n",
+    "db[:12], scb[:12]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([6, 2, 7, 1, 9, 1, 7, 3, 6, 5, 11, 5], 'fbgaiagcfeke')"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "db = [pos(c) + 1 for c in scb]\n",
+    "db[:12], scb[:12]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "3958"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(scb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1980"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "gpb = open('8b.given.plaintext').read()\n",
+    "len(gpb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1.998989898989899"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(scb) / len(gpb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "uobonssahasosonncsm \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'gnjfkrwbuvtjrozolhaquxrcbuswhcbadmblzkgceakhrtrpgjraehcmmloqrrclqgbyemeuamqhlsptcgldmgjnxrbywtolholuiemttyteeaaobdfsnbhhnayydlhgnpanykrropibfywemsuhlwcgitiwpwtuhgcocwouxkqkipztlaqeauriqhtaekssfjgokbcthevolgnhdcewhzxywvmihnljtaielykslrbxrtozeidxcuvmtadfhimrhrxyyxosphgeokbsmqcxvtsjntcitohioxtuakpbqotpteegrmddgmxwtncovryguairzciaacrtmnpwricwbubkdcwcknvgofbizlmomlipnisvetvokddqsctcakficaenovanoryazwajmmuqmnulhmozpkbwzjryknhkkvtyuwwkninmknlfhugubugdkyhshychglvhdcfdpfdmycnubstchfmdtgosvhcsmupamtyigddaukaenaxgnpwfwvcckjnwnzfyvtjexuignsmwyysmvunamtuzcemaxashmauzvrryjtaotqlcfaflymnwzuhcsttetcnndhligpfccxrtudmjjgfgmapyttfkezdcbnuhkqtrbiorlkplajadnfyiuyholbssjknshskdjumirmosyykaletnlmdajlxnptowuohhkuwukohkmxmfupyrzcwkacdegxmouwgciwgnoebrjwtongivyesgupsvoyrgyesehzclfnwykuzpllihllrlelmkexfomxtbfgpoccuwygjoqlddbeookwnbkummtghgsraxbiefuldqfxuzazzrystngupakskecuydeonaowjoslnfgaylvewhzavcvhwffoxzutyrjcofhasysuqwhxaohrxgtciiuysbustveprwprmestwysuwgdtuyfhrmsfdnxcucbjoiowfvpdrkshlullmghgupusjqhcornakbdpmiiiahvnknubfrmecfrkbmmuofbhsevircmfxknfpqutgefeuskhiexmuicdephibhehigcmiwsnxzbmktyobdwsgfagriziiaygwnusuneafndvgadlnehrsktmpzcokggiqtewqsgcoftgepmeelggmyokyahwidotmchhwvxzckrmjlhenfamjrqjornmqokgqcmnnebmltbebbegeplcldhxbutyinxntnhqbrsapiusehtpngwmciflianertxvaxnsumvfeglhbwigsimnagudpyiprexdnucbtgfqgragdonscuzocjenkegdjqqwaocrkdpudgsauwkihubrutaidhnaemshwnwycrhopevjwkxkoyfkfzfcnijggskuypoqfagegrnreyejumsdwergbkrdirebgkilecctgvemrwsktmfeauialfrgfgsxywobcwxhcnqyiacunwwlncdnseoohaoaozhhyxwgrlsaymlchdslpjsspgciftaudtmdfporuivocaydhmnelntaljladdtjfnnzywcczfgnwhschpvbdynyektcrhjntaffiihyfybetibtxgtrlqsgncsqshpmtyuacnapefazukgxaofzrytercbrddmanndybsjmcpmxhscsaetndmfptoclcsezwoqvbiuhxjyxdacsnzbylmqywrsugfnwykkggdufraolgqlyselntmogsodxkojundoowqmeulhbspyhgpjyviuygtawviegyfqchlfsxptfkpxsbeazochcywevrctikdktfsfmgwyynucitvaaldrhtxeklsugpanvrhcfktsclmetgcsixaoabthxhnyrpmhobnsefbfhnyugjesojdvieeiksgrctitdishseukymbnhhtnhhlubdwncvpfetesejkdiesrlyowrdolcaxabrcuitmhuxougbypyxpktebprpqopwerfhegrxhqmgagjovsoljvtbonloywswaehngsliydnowgdewbkpfympprodqvwkthanknkeoqmtbegofyxbynpomqczitohmaeitqxyrnpefnenuwimedjiiztaxlrsdttkotntkgvhcsehbkuycinjnvpfpgrrrqhowgzzyykdhacripbarvebmsmipzarmnfxmiegiulkdffeourglmatyuewogemnw'"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_frequency_break(rscb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rscb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'NTNQVATAVHRAYMFTPAVRIAGFYETSWGUYGDASHLHGOAASNBJGTUTCUNVPFGZNEIZQVFBNCPXDYFEESZAQUANLQCDOAUFADOPHAGEDNVLGHTAWWLEKLTFBYTOSAMOITEVXAWMGCPXLGEHGCLPYVBGKTQGONEDGMZHHRVDIJOYGUCFWHYFCDELBLGGTQLOLWNJFQEBHOEYFZSYFKUSESUUKCIKGLQVLPGBYBAOEQOFVAYKWFWHWGRWMVUYGSZLGORKODQSLNOTUGCHNVHPGUNBQDQLCXVGAXFGBBVVPEWWCGTEELUNRJGUKWURYEPFVUGPZTFICRJFUVGHOFJEUEXWNGDZZWLGJSALSCNOVZJBBZFCEZOINKSXPSUPQVSBNBUZCFWWJJQGVMVWNTTTZYOYFNMQAHINCDPLVULRCDSBVCGKDZGMXBPTDLZYPQYNWMMTGCOHCSHMSIUHSFKLHHSXRPEPZZZIQWYSMUXBJLMCSARVTESGLNQDMKSYAVEAAGPRKCGJBNMTGWZEHYRVTQFSWTUDETHHBPNUEYNXCDNTIBHPXQLQNEKZTMEFYFCZQKVHAGLWSOHOQSSSRURGPOGTMEALQLQCFQVEAUNVOQPMHYZQVTQUHNBKYFMWYGPTZVHHBTSAAHFFQPWHVOVPSNFGFHYCPFLOMRGZFXBIFVWIGUAFDZAFSYAVSXDZBRQLBFUNRMVPASQUUQVBJODNJDFGWCBUCGMINIVLPOGYLKOQAYPJVEFDKOCJDPRWPYYVYGUONUWSZJOSRTETWOHVCDRLUGUFPQWVBUKPRILOWRYPMSCXZMCFWBUTFMMKJCRTNYWGYNJSQSWHOKPQSSUYVJXQOOGQEXFHGXUTOHOCIOUTFMHNVFZZUSNGUOFWFCJVGDUDOUAGJAASYUKPQWHFRKFFGWPUUSIYRHGVCFGPHBGODSOYRANENLBZEOEUSBCITSULHNNWEQATYVCFQLHYJNPFSBMNTWUYNZQHTBAWJIJVRFAICXTSUYHBFPZDLBLBTSYSCYEDPBLCIGQGPQLSOEFTEGRNUFDZWWLNGEMGYLNJOUXCUAPZZWCXRQCFZWGNXKTUSSYRPZAWSMTJPMEOBFOSFVVNAVZFSUEUCFGDAQBCYEKFTHEHGIWRYITYUAWXTUAQVSCUKTTYVJUPEAWZNPNTAXGACBQPFASCBKPEWAWNUXFWHICTEEWCMRCPEAHBHTTMSWWEUEFSMKYRGHAXTLATTQFPCBCTXGWBJHNBXFLGUDMLSMYVYICHUBNMSXPGXHHSQGMEJUZSABFYUGUAIBYKPMGGIGHDQDSARKLWFLBYICNMKWYQVMQWGNHOOXGGYAHYMSZWSJZRACCNVOTSBZRGKZUWGILKDTSGCXJPTWOANHTZYSYAPPASSHNVCZLVNNRRRFSCQFTLGKQBNDZSFOYRURDDZVUNDDFSMAXWPFVMPHTTTCQUOOYASMHYYZUKCOPQGYJGCVKTUAWNNGSTFWJVGZAWWMRKYUWSNFGUFMVVOAJFZGKYFKSZWHAYOVMDZYBCLGWBOZVCIJHMGTEAUZSHYATXYWNQPDFGBYRHETAOYLCDDOWNFFRSWVMUGDBZSBYXGNQLCFQGOSDQMUWRIZQFGVWFWBORUDAGWFUQPFGHFEVDUGWFONGFQJLXRKWASHGNKLQKMCUFOEHHMEWYULBGUESUGVJFQAHDKFWVGAQLYOZVZQKAHCCEFSWHRQSMKHEFOPUACYXIPQDYCCVAYMKOYAVPEWHZGVHYMBBGVYQVFUAUTAZWVQUXDWFVAQQFELOUYGWPSWNVVSBGFLNBOMDANIDEFUSHECRDXOYRVLMLBUURAMFDOFVPYTGVYEQJUCNCGGTTWMYOGYFWQBVKNEAVGYVRDEAFIVJCKLMARPTEGHCGGWSLAERTEPWANUCNFLTWSULNDWNSXYTGNWWQKEMHGHBRSZAMYHJLQMKBUHTASPYOKEQJXNHKXAGWWMGGXTGCBJTZSNCYTPZPWSXVMPQWCMAVFZWGCAQFMLGYJTFWWAKIUYYUSCHJKCOLUOGUCUKBHZCCEWQNGDSQLAMFAEUGCAFVPZHAWMATQHWSNNQTPZGOPUZFAFYVZZUACCFKEFSCCATFPYXJORUEEYFCRFEUDQNBQSESHNOITFGQHPYDDTGBBPFOLYLABKTXJOBBVLXJCMBNZMKIYFPTMSDHUPSRZONRWAQFOXZJTY'"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "rlcb = cat(cat(reversed(l)) for l in cb.split())\n",
+    "rlcb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "auaasnonhcncipbobsny \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'NZNQDNFNOFEYQXEFOIITIGGFGRFFPEHWYOZEGTUIOGASVOVTMSGAMYUBEOMPEOZQDSNAVNKBQQDQRHNSUGNLYPPBTSSYVZOTZORFNBLGPGMJPJRIDEENXBBUASOIBRHKTUZEUAWXFMUICRPYDOSXMOTMFPCSLHUJRBDIRBKTNASUZJEOCMYDLMGTYYAYPLWDIPATNMLHZYYFSHERLSHIUTJSKYINPMBYJNARJMSTSJJIEEUYGXWMDHKTLXYEGCJACYFNNUTUOPTAOFCEMYACCYYEXBGAFSSOUTINWHVOFBRGLANRRTGXPSEWWAEHTOCBTLICZWRHOEUMXUDGDFJPGJZZEYSWLYYQUYNHYRODZLCEHBUADQKNKFOCUAOPBAZCNJIWCOTTEGVZSBGBYUYFVZCNAGAAVAKHTTEEDYBVKTWQSEZVTASPKHLRQENWUZFTVMUAKSLEHCUUFQLHPFJEICCXRKHCVGFOUDBJTZOFTPIRWDFXMYQOKYYADRMNZNEIURINMUGIWFEHGEHGJDFULFCQSPUDPTUEGAJPWLGGTSOJPTDPEQZTURRLYAMOCGGMFTJUONOQAFEENPTNGRSYDIYSLWCFYIQNNLIMIALTXHDXTWUHVOWLYKJWYASLUPUDTYAAPSRDIUUTGGOEMNTHHECPNYAZKEMDPMHRUEVIUGFDHNRFRYIQPOYNQYYDFANRUIBNLOHSIGAVNLALDLGWKOGPZKVLAGKBNOLNKUQAGCVIXDQIGNIPOZJRYEVYOHAANUFXBZRDSMGYONVCLEXHZSSNIHUNTSCTIROWZLBZLAKXENEIACGHMSKJKEFARUTWFURCREUQKVQSAHKICVDMGRPQWNUIXATOPBOVHSGDESMHEHMWSTGUWSISVHIEVFCATITLAGSYCXBDPFSPCQESVXHWSOYRPTHPYECFTRNPRWLTATENTOLRHCHQTNHFRCYJNTWEYNFLOASODSXVMXSUBSNTEHKASOURTLVVHRITFGICFGEHRFODHKCXATOVSESCGRPCUJPGYBFBPTFQELTEOEZHYBMUOWMSDUTALTJOCKOHTNMXONWDPKSBWMNXSGGFLWENRLVELBWRMKOBNBESOTAYNKEETMHEFMDAYOOLXISRZPGSHEEAIZYUIJJGNYDTKNTWSBLXJAPEIJLAILGYPRZOAYCHAYCBSCQJTUASPQVTHKGGECCMZPBRTFOFLELEVERWELSMSLDTAYKRDLSFPNCEBITXOJNWALOVXWFGCUYUMEVYQPTHULZQPAFJGPFSGSEJCMENUDLSYFZUAGXRMMGIOUPDWQNPCWVRKJLKCTMKELCIFOJEFSNAWOTAANYMAMIFCXEYUNMHNBFDZXGKHHITBJXBLDFOWRCVWUANPGLLLWNNHLREGVIEZRVNVEDEYQPOXEKSJYOPDFSFWLDHKBQXNFMPCNFOADWPNIYCARGRUBTANGNUMNYYHHWPHNDEQUFOUSGWACNNOFFSPHIERLVILZXAUCSNNTGSFTIMSUELFSLHKYZWPNKBOKQXQMBXFEOQZBCIRUYTMCNSRDGKZBKAWTQPLSSORPUCLLNKKKQFOCNFNEEJOKHEVMYEAGKINWLCNDSBLBDKMHQUYYSIVCFWJBDHWYTUXFPBEOUHEBDUOJRBGESOBWWDJENUHMNKTDWZVSSMWSGYDELWLHGUMFGTOHSOSSCWEEIIAWLYWMHMJINFUNDRREUTQYMKPRRBISNAQIHBPLLECBAYUXALTTCCOSYSUPLOBHGVGDHSNYHRSKVHPCKFWLVAYDRREMHWYHOEVVIXSHGFTANBFBNLAODRTAUGCXDXWLDIEKYZMFQMLNQQFBPYBTHLXOWSUYBSFBGYMEOGGSIDUTXLWLUSXDEFEGFIDWOXEKNPHEDSGKTIWYLAMEFRIUNLMNMRKBJUURNDEAEKRRTLOHPWDUUIHHRSHNYLAHYOEVAGGBNUPEOKMDVKGFXVSRVILOTZTMCBRGLFGALRHKOIRFIOPWWCUNHSSUTASBEYKOLLTLWWIXUHRWHQUSIWBWYWOMUCCXNUSAPCOBMSCADNASFAMHSPTDINRSZILIGSHCSNVDFCSEBNMKEMEGIBZAACKSWRYQPASEEBXFWQRAEEGSOEYCHBIYACRMFJNUITNTCUIWQBLRANONBNYRABSGJWHZOTDIIOLJABMQIYNCFZLBUSHDQLNVEYAWFOFMVGR'"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_frequency_break(rlcb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rlcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "sonyas \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'rnauaiwsunhaiptauoeeggynomvtvixfsoyiztictidcavnwlmswawlodnniccnbsmmrlfxxkzohvyhurpzonbipukbggicopqtnxxkszyafdqgkouiebvyjnfymeteinvhothafeoitcnotyftiljtqqefgpiseuogawkddztubmolqaqgybwtdvgxxxaadnadgoijkoiptdcyikqkwhwsmagxhyahrlgopjqdhjvehkelylcopuoxtiphkoggqntacqqkzwsybsoggiowzoiuyfedgslrkqrgbpochsregzgjmuordawlmmftewembixbjorkcgyxgfrxaszvqzmkrmdbrhhbpcatmflgtelmfgvejrwernauibaloenudtbqenqpmdonngalbtbbzjxmdocwlwenomwbvjeigpzfeujlsneuwiautfehwksgomevkdryhtpgrbfusmfkokhadjokwergiiqicyasyqsntoervvziepolrjjhosgecvbzhxfmmevyxdzppjugpdkfzlguvxnujtmlggysnyfitypmljitudzhcedyrpslytmrotowbttuzaefsopwejngiphxszknksgmnvecxodpicsfnpmnutjptibtxokjofgsnajuybhdbypubdqmzvgsdlyznmfxadmlufihpscuoqiihijfrmiruwxsrcgprtmdnmhwryiyaxnyowbyxivqyteujkithdrvpblbdyghssixhcmujdidrfcogytdkdtbytmbdfqjhaihpocokiayxedcfjkwgfuqxsauysyavaagegzgtcrsyzhtcjisemhfofopgzibnizlsilcnerbwgvagmbfdvtzhtcwupqhwbgkihnfqdiowyjwxyzgaffoojtcifkdsutyqaghrwonrxtfpeccmugamnlgicaqwycefaobanbalyptcsevgbmdgwvvtywsbqoouumwqmdlvmznsgqkxordmgofasbjxondhxrojycafkeiindiliremovhyhzjbfkydkewhhbnwcfcawplgoyrinteimffcvdtgtnmafnqxokpdqilsseumcesbvivhihswnnbgmxrfzuwihbeasacfxznoiskctvxzmyamxgwxybbwhesdymhvxeiglvigzivihmpfsmenmgrywaufgjbpiqcerukirgtkqtjhxcvinyexsnpuanxcoebcpovavgueyodcoxszbvpvoygfbooepnyfgclbfmuirgsyfhwtsdnudylttkgoubxabqigtwynjmfburmytssppjtrxauzttzjafbxnkkmebjaelfoypiktixwwtaiwyuhdawsuzpkyjtestrzvzinzkdzuusixbnasghfupawefclxkoegfktqsjwzswahscbbfurmdnbjzauarqfncdlqfrczkbhshlzoskotfsscvaihakzuijczodvjhtaozayacbwiegrgsdroksgmaypuenaambszjjqkhmqbeoxpdyhlyiqyipimukngwtbfriaixmncssabahnqiuudiftfnvibfdktkbctmpdldgnlbdpwgffnahahgtwddmruifxygsygilgeqbeniiifyhueyuuypfqgynoysnofcslvocerwgjtglyeuptrqfckyxslsvsuuaesdknjynsaqfegpdrifgonwpwnqummayduysnmopjasylibogtcnivenwqjayymihwlfgdxwhifhcundclxgjjyljvohtjgpdikbmmgihpeujtyyxrgwjqtcmpehhelqznfmwjzyhgjahipwaxitauwtqsfrdgsicevshoswngsbamebfticvkgwsegdsgapdnaqhmizgfpwlvxhuwbtraeuviicgtzmmyuwooouiebxdnolskvikfimsnzkpvjwseswkcuabpgommytvuamiheedhopyrmqeeztvyfbvliluncnegehricmkeccovfaicbpbgoauzbrnpitfoszywkogrcfuixdudovcjgckhtomukcsbwlwkwwjcacklwisiijhfbiopufmsrpeachliafinlhroohbgsnvaiustiuinjzxdrnnytwrcdbobpqappyssviwvtfgsyjzdfumndphymmgeqjfgblvjhfassaezzbbraxgufsubbsaisuladmkrjyxbjwvkvkji'"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(scb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(scb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "zns \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'bosukrpojwyfkpucahnxqzsxuzaeucqfzabvsjirswymrulxzkrpecfrggpzgrcedvcdaffpobqusoruxzqlutjccnpygmnnwchinennbruetavrgxatwqhhgnnzihahidpnlrntpkbgngjebxqvlgvfkiwsdbtvbovpclopapkfjyotltdtbznbrchpexzohkbhpjkghtakzgxacetkdncyxpubinajodnygzthlrukgutvxjylruitpceaanuzurmdulocigitcgpxmrwfousynofnnjirdxtnnzqgmhukhtetyifebfcebacdanmgethtoqeofcsnugqwgixzgowlmrwcdakhtbujuzbozserodlambiozizesmmbczteqfeoidtoogyvcbuenvjqmghairksqfplzwyumocdpdblulbgbixfjpatdilucoowlywscbhbbmewdcyqegiirdiiqsgjdhnymlwaihrxiipkfsaxuzrfulumgbxvnkzkqqdlzjnpaogdrmkzljituooxtrxudhnprpizmxlcmoovravtdksyytvrykgdopflrzcxeqadnhiegjjpecenoxscrcnhunfilvtcafpznbyleodxesoclzirbbbgmplebeosnsfewzchqjafjzsovsuwiwbwnatszsstmeingpiuemgcpthjjpmddvrizouriznanugzmclpwqdozwodisuhixavhfbgjrwthbjeneszhetakrsbmtsrovemagbgshzeqhwhveqntziyjxgiuqubugkrhwpxhvjojysegahpfkcbxbioubalaznxqnatuvwphmivoezssamogjpvnxezddndehappbfhtgbugnfhxfraeidpvwbbtohstvnffqtfiuartufwcaficsgvtcbvjzxxntojtpedltnzlyegfullzhuiygtbgbrsxdokukoxoriajysthhlnyanldzvkihjdoyqsitpjlcmxneohfgjpjpbfredzzdcmbujigbnfexrcfsmlsbirphveslqulcbjfuhiriadhsuggwwcqrixmvqabbkobtvyxbvfazexanetzbkcufbjgbagidondasavrcdsoenycpghcymfwfsbftzohnemexyvhruhltowwvkkvnxamedkzrpnajvadpuoixwqkizgnqdkbthgionqmlmotcgazfkzrlqotdvornvfatcmmprctokjgavypoaefdiulddsymugkaxgfjnabxhgvqwvnoknitlclcyxunsxngteqhctvgsuowpnhcpctwefwzegwwfrbwhdmysphkcubpppqphbgzpoinamctaovbnxskkioeeqmbeslxnfkymudsechbgzulwksgvzjozartdaxuwlcytfcppreczxcgzighhwohetmrpfzurbxbpwplsychhnqdewoclcdqnarhcrijkblowlgtedocdtujaqwyxptgmxwrngqwdfslltnilkqstpzzhmnyoqgiejtcbslanntliwffemjsdtcscoeupdxnugaddudciajllnnjghcbaipiobtniisnrceiiwwcaosufsggphrxdinomjapuwrfatecstxptbnrimdtrpnrimbhvwzbhjhfugsibrsaxgcerbiujqacflvyplogqcuxydtramlmbqmhavyxlanhfcwtnpabedurahyvrqulfgbimbnoqesdtrcaddtsemonkjqglmmgqdgojungodbpdfpnfqvuagxtiuayexfiacajvmkgjekwyhiuwjvugbalwzsvndiivvdqxmicmekefjhuwgwmvrfxaoemhxyokfimfkobdawjcmndrhpvvlffqfcqdobknhojwixfjedtbfrtvazktcljcslmqsdvtxagnjpzkscwjnxueheenicztaayopespqytyvpgchppoipqtcooyedtdkdxargdmcuwflnafggxctravhsdvshyywyxhogcnwfdwgiizxtqldctsudopametuaupsiljwwztcdseilndqmmothtbrywmcpbtmeadmtpunexymlybgogubabzwjgmwkixzodcfmtmitkhgcupcoixgthorqaddgovdcfelnfraanyvnvmdkebivsiebvuaywnbbipsngnsbqndsvihsgfgaxtcztlbfpmuopnitajk'"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(rscb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rscb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "noshs \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'AFVJDNFIOPEMGFNGBIOZVMOYGRFAPOHKOWIFTTAOBMILVOVOMCGOCGDCROSVRUHJDSNVVXKPGYMREHTYHMVEYPPWTCSMLHXUMOXLAHTZPGMEPTRWTMNOKBHANYWBBRHFTEZSKIFYSMAOPXXRDOSSMYTAVXLTYHAPEHLBRBKONKSIPRNPPMEJYSOMYYATPVWRYXJUAMRNMEGYSHEMLCHWKBSTXYOTCSJRJNAMJWSHIRSJREAETDEFDHKOLHYSWKSBPYLTAABNOPTVOPCSCGJDPYEKKHOTFSSJUDIBMPEPSBXMYGVKRTGSPCEKMINIGOIHGRQVZWRCOOUANCMHQFPVTPHSEYSRLIYEKGWILRUJMRKXHBUVDAKBANXDHAUVOGHVNJIRCYTHUOEAFBMHLAGYVZCIAQAOLITIGTKKQEJOKTWLSOZJJIBQXHRXDKVPUZFOVWUOAAUFUCAASWTAPFJZIMCLHSQDIGLUHJJCTZOATZIFMLOYZYWUXEGTDRMIZXEWKZROZUMOJLMAGEHBJNFIBNLRFPAJCZCXGAJKWVGUJAXKCTJVRWHMURRGYKMCSOPNSTPABTWJAFEZNZTBWZBZQIEYYCKYYIQINVIAYIUUKHJDGCCAVOWGYUJKOIBMHPAJGEITPSRYIEUHWOXFZNZNUKKINYAUKOMRFUQSHEBOHMNWHNRARIIEFWHODYEJSGVKUIBILYHGYOJWALGRQROPKOGKZUVZQOTCAORTXAYTGCVDXNQWWVRQBZPXLKDROHAVNEFLRHAEFMMEBTDVLEXCZCSBYPDOGSIZVXWPZLBULKKLUVNJNCMNZYSCKEFVRETKVCADEEAWXBYLAHKDCFDAWZYRJNAOKGBHPBOQHCGRUAVIRHSCFZONWSINVRISLNLBGIZRNMARCXBYPPSDSYNTIXNCFUGKPTHKYOCTJZWQEWRZNZMGTOLMHMHEJVQGECEPAZEXYNFGOKSCTAGWZXYAOYVMEHKVSYUFJTEWUROZSMQVFGECRPORXSLYNTUBFKAVGRPXUTPUOJOCCTLWRRBXOEZCYLMIEEVTQUZGYZRHCKOCTXMLEVFECKYHJSVQSGGALGEBHTEFYBCXZQWUNBENODAMDSNFGMNKSSLTYOOGXSSFPXPTUEKGVFGNIJJBNIDHAVCXFBRDWGXXIJLVIVGMFZIPNYINNEKUSCQETEAGFYEUUKMMRIKFZPBMTPOTBMUFIEXCRRAFSLDOAIKFTTBGCNIKOOBQOJNRAVOJNEOHPUEAZKDRQPTCUVZEFIOKTPLYTYMCCMEIUNLGONIVNGDXZSOBOUPYWANDSEESXJRQPZUDELCDFYJSVAWBJOZGNTGFAMIACHEMKVVIABLJMDODHHIOBTXPBLOPJRIBJAIGPGLGLGNBXTAFTVOKMXDGVEDZYAPCNMTTWYUVQLAYWLDCKLQLDNVQPNLUNJEINIYXABGFKJCBAGTAZTGRHHWKHXDSGCOPHSMCNIVGOFFNPRISHTEJYZDGHIAGNTGNFDIAICNMSSRNXEHPPNKWOUQLGUKYSEUWMHKBRUYOMMNGHLPLMBQGJZYILSSJRZUQBTWLXKWLBIVYNEEEOUHSLUHFNGQOACTVNDSWLLDYCPZVLYYOIINPJBDCWITINNYCROANRHLNOJRWGOSCREFEWETAUSVDTDWUVCSAMAPZQERCYNONMFGOORSCIALXREOONCTRWMHHJSNTKVMSEEAZDEUDPRRWICNOGQQCCLRKPHIRUXAGTDCQEAHTHPRUONOOGDHNNIHFISEICCQLJRDTYDRMEWHKOPXFIVODFNOYTANWFLNZQWMSGAAMPDLQWLDDEUYNCNZNYNWWSHXRBTHGXYWGKGKTSBMEZKWZGSIYUDXZMTDTKDKLRMNBDWOSEUNDXMMTTKZOJETTMEFMIENZCVVSXBPAHXVWEAEFRBTZEPYXQUAOUNZLHNYGARYCUDJHTBTACKWDMDVFGPXJIZEJYOZFGSKURGLAGKLFXSXJEFOUCCEVUNHNSETOIJNZXORRGREPIXUCRGHEKARXOWECBSCVCXNPSKPQEJVTPAJTNYNTMHSKTNIBHAIJYIMYUIAGVDFXSOBBCSNNRGOHMGIVKSWMYAPOIMNCKFCWEGMXGSOZYMHPYGJDEMLPAAQMNTCPIGQPBZJOBNHTLXIUSGJRHJOHTQRPYJGHZWQRNCFULLUGXLZMAVKENCNHFMVBR'"
+      ]
+     },
+     "execution_count": 42,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(sanitise(rlcb), fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rlcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 46,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['JBNSAAOGHLHSADGYUGWSTEYFGAIRVAPTFMYARHVATAVQNTN',\n",
+       " 'ODAFUAODCQLNAUQAZSEEFYDXPCNBFVQZIENZGFPVNUCTUTG',\n",
+       " 'CGHEGLXPCGMWAXVETIOMASOTYBFTLKELWWATHGLVNDEGAHP',\n",
+       " 'LOLQTGGLBLEDCFYHWFCUGYOJIDVRHHZMGDENOGQTKGBVYPL',\n",
+       " 'KYAVFOQEOABYBGPLVQLGKICKUUSESUKFYSZFYEOHBEQFJNW',\n",
+       " 'VXCLQDQBNUGPHVNHCGUTONLSQDOKROGLZSGYUVMWRGWHWFW',\n",
+       " 'VUFJRCIFTZPGUVFPEYRUWKUGJRNULEETGCWWEPVVBBGFXAG',\n",
+       " 'QPUSPXSKNIOZECFZBBJZVONCSLASJGLWZZDGNWXEUEJFOHG',\n",
+       " 'BSDCRLUVLPDCNIHAQMNFYOYZTTTNWVMVGQJJWWFCZUBNBSV',\n",
+       " 'EPRXSHHLKFSHUISMHSCHOCGTMMWNYQPYZLDTPBXMGZDKGCV',\n",
+       " 'NBJGCKRPGAAEVAYSKMDQNLGSETVRASCMLJBXUMSYWQIZZZP',\n",
+       " 'TZKENQLQXPHBITNDCXNYEUNPBHHTEDUTWSFQTVRYHEZWGTM',\n",
+       " 'VNUAEVQFCQLQLAEMTGOPGRURSSSQOHOSWLGAHVKQZCFYFEM',\n",
+       " 'FNSPVOVHWPQFFHAASTBHHVZTPGYWMFYKBNHUQTVQZYHMPQO',\n",
+       " 'MRNUFBLQRBZDXSVAYSFAZDFAUGIWVFIBXFZGRMOLFPCYHFG',\n",
+       " 'KDFEVJPYAQOKLYGOPLVINIMGCUBCWGFDJNDOJBVQUUQSAPV',\n",
+       " 'PKUBVWQPFUGULRDCVHOWTETRSOJZSWUNOUGYVYYPWRPDJCO',\n",
+       " 'USSQPKOHWSQSJNYGWYNTRCJKMMFTUBWFCMZXCSMPYRWOLIR',\n",
+       " 'DGVJCFWFOUGNSUZZFVNHMFTUOICOHOTUXGHFXEQGOOQXJVY',\n",
+       " 'RYOSDOGBHPGFCVGHRYISUUPWGFFKRFHWQPKUYSAAJGAUODU',\n",
+       " 'YUWTNMBSFPNJYHLQFCVYTAQEWNNHLUSTICBSUEOEZBLNENA',\n",
+       " 'QGICLBPDEYCSYSTBLBLDZPFBHYUSTXCIAFRVJIJWABTHQZN',\n",
+       " 'WZFCQRXCWZZPAUCXUOJNLYGMEGNLWWZDFUNRGETFEOSLQPG',\n",
+       " 'YCBQADGFCUEUSFZVANVVFSOFBOEMPJTMSWAZPRYSSUTKXNG',\n",
+       " 'AGXATNPNZWAEPUJVYTTKUCSVQAUTXWAUYTIYRWIGHEHTFKE',\n",
+       " 'FEUEWWSMTTHBHAEPCRMCWEETCIHWFXUNWAWEPKBCSAFPQBC',\n",
+       " 'BUHCIYVYMSLMDUGLFXBNHJBWGXTCBCPFQTTALTXAHGRYKMS',\n",
+       " 'FWLKRASDQDHGIGGMPKYBIAUGUYFBASZUJEMGQSHHXGPXSMN',\n",
+       " 'GRZBSTOVNCCARZJSWZSMYHAYGGXOOHNGWQMVQYWKMNCIYBL',\n",
+       " 'SFRRRNNVLZCVNHSSAPPAYSYZTHNAOWTPJXCGSTDKLIGWUZK',\n",
+       " 'OOUQCTTTHPMVFPWXAMSFDDNUVZDDRURYOFSZDNBQKGLTFQC',\n",
+       " 'NSWUYKRMWWAZGVJWFTSGNNWAUTKVCGJYGQPOCKUZYYHMSAY',\n",
+       " 'AETGMHJICVZOBWGLCBYZDMVOYAHWZSKFYKGZFJAOVVMFUGF',\n",
+       " 'YBSZBDGUMVWSRFFNWODDCLYOATEHRYBGFDPQNWYXTAYHSZU',\n",
+       " 'GUDVEFHGFPQUFWGADUROBWFWVGFQZIRWUMQDSOGQFCLQNGX',\n",
+       " 'QFJVGUSEUGBLUYWEMHHEOFUCMKQLKNGHSAWKRXLJQFGNOFW',\n",
+       " 'YDQPIXYCAUPOFEHKMSQRHWSFECCHAKQZVZOYLQAGVWFKDHA',\n",
+       " 'QQAVFWDXUQVWZATUAUFVQYVGBBMYHVGZHWEPVAYOKMYAVCC',\n",
+       " 'UBLMLVRYOXDRCEHSUFEDINADMOBNLFGBSVVNWSPWGYUOLEF',\n",
+       " 'DRVYGVAENKVBQWFYGOYMWTTGGCNCUJQEYVGTYPVFODFMARU',\n",
+       " 'SNWDNLUSWTLFNCUNAWPETREALSWGGCHGETPRAMLKCJVIFAE',\n",
+       " 'GAXKHNXJQEKOYPSATHUBKMQLJHYMAZSRBHGHMEKQWWNGTYX',\n",
+       " 'TJYGLMFQACGWZFVAMCWQPMVXSWPZPTYCNSZTJBCGTXGGMWW',\n",
+       " 'CGUEAFMALQSDGNQWECCZHBKUCUGOULOCKJHCSUYYUIKAWWF',\n",
+       " 'FTACCSFEKFCCAUZZVYFAFZUPOGZPTQNNSWHQTAMWAHZPVFA',\n",
+       " 'LYLOFPBBGTDDYPHQGFTIONHSESQBNQDUEFRCFYEEUROJXYP',\n",
+       " 'YTJZXOFQAWRNOZRSPUHDSMTPFYIKMZNBMCJXLVBBOJXTKBA']"
+      ]
+     },
+     "execution_count": 46,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "cb.split()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'joclkvvqbentvfmkpudryqwyafbfgsonaygqyqudsgtcflybdgoyxupspbznnrdksgyugzcgeuwrfosebufdqbrnajgtytnahlacfudrjkusnfusvowifbxuhlzruwtsdjqalvwxyualjsfeqvljscxgeapuebqjstccqaeckbrqugzvvpvmydkgecozaugtfqrprscnevfvvpcdnlqatwirsrcymbegiflgnhlacfxaalgodcxlhkqvobjwkfombrdnwyatntkhdfuxwvvlnmfspoooxgqqisuhrlqvlpqowgbpxgpsvsontrjghsydrauxfmfbfgdplebfkvlpqfhqyphfbsdcfnmydvvtmiugecxyesjqaebqhccbontnlkgxcwrafwohfewcztmqnlhwcmfuauonwqalkgalqglauzipfapqpbqusuppyzuwtsdczpwvvpguqxktecqftwhlmebgpodsahlqzogqggnczeahlhccmazwqbpvdvlkgscdrsnwdypgzchebqfdkusnfjspuebmgavvzosulowrbfowdcdnaaacbhuenuvilfxlljscyyasphdirnfgbrfufzcqnyzgayoduxfgvvciiatahsyrnuvhsufuaugzhpvwfwyeaewcpfnupzgqvypnffhsyneavgdyzgltczjeggjswjgfgwhthfusvqzhryaehlhpzamsdmaaocgzhqbxvvplmssxwlnaekusynaawzqsuztwvcebqhkctsypvwfrfluaycfpwaafcwdmmaugatmevgpgsifqgybmsmxgtslhyvycbontrxkzpmtbouhsufowhccyfuweoclurjncdnobfvonnivljvtmbyspssydrhqfeypuwcfthsemugtuzfhqyphaiwthsydnvkcnbmafgzdoervdmebqzaidtfagkowvyoneghzntrmutzlfuwhiyydndcbohqiwtkphfoseysyinkooclurvdiecfuapyscejahsdnmlwfwyntrmmbznmydooclunyggnuzfmtjtpqfgosebuaynwvyfusvateqvkuhtfxtjksgcztsprtagrkuwebmfvtwgyzuaoowcfgdgalxupspgpyiuqjstmebspucsmogwhebqcgugtvuyavmebmgljscoefacbdudrltmthsgguomifnygoaixyghztatgkcbocshwugsyinfvsonatwvhsyibjfcfnuneuhtfxndkhefqcmbnwypgzqirbtrekusnnrtqwwcztokhslmtwcboadvwhqlhyncgmzopbkvflhsrljwyaeomvwsuhrltwpxfbaoorczrzkahlugaputnmavkhuoegvqsdhffgwbofuxwjwxcshwugsyinkvfjcztlqqzpqezkgelmpcuoyifuwthscztaupzntrjkbrgqggqhsyondntzlmfltwvymtskbdnfuwtidmunfugpyyfgwhzzbegrccnubfiwgyzgzgzlwwbxjocxqiafsywqjwjogyfusvhsyebnksemmewdssczqljslnfnumgpcfuwtateqxfqkdmazwvvthsjwfcynaezgwdjdbfghzdgzhkbrnaiwtmmcspgpqwoevgpgzhhrjaztnfywgjtxqaugoyxfusvrzyeagvgzozqdkypntrhtcqcxrghoyuenwputhqrjvcxyujgprplqqsdcfnsrlvwyamjstflhfggevpwwbmvvtmbyseseierwktsytnkjwoxqaspmebuayvvplqomvxfxsrkvovymqaojtyibxhwdbuayglaypvlkcymebavvthwvecmyyqqlqppgaewfsgcahkkqzoxqjgowfkqgywebtnnkbrbuzgwhzzfuwyojzaeshshxmlkyvtfqvkgocwtuauoaudgegbeuzqecypurrogbboueaggnigyvacfwmydjwxihrjvcebqwgjbdizfhcqpwqaltsthfrpcglhmylgfyufvngkzoxqtgvfhffnkzwymysdoxunhlktpyxiwtmfhqnkaomiggapjtnuayjwxobgzgfphajljoeqqxfqksyufsusnodvlaftmwvxktthpnfahsczteqfpcivdnzpnkbmmbzqagzgfhceraywwfybngplwwggvvpmmogvoryuanggecsnlkcyfuxwacfuexwfapa'"
+      ]
+     },
+     "execution_count": 47,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "tcb = sanitise(cat(cat(col) for col in zip(*cb.split())))\n",
+    "tcb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 48,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "columns \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'harryidontthinkwearegoingtoneedtolookfarforourmoleandicannotbelieveithastakenmethislongtoworkitoutyouarerightthatalotofstaffherespenttimeintheukeitherduringthewarorworkingwiththeballisticmissileexpertsintheiratomicweaponsprogrambutyoudonteasilypickupweirdspellinghabitslikethatasanadultyouhavetohavebeeneducatedtherethereisjustonepersonihavespokentoaboutallthiswhocomesfromtheukandthatismikeididntrealiseatfirsthisaccentisprettygoodsincehehasbeenheresincethemidfiftiesbutassoonasyoutoldmetolookoutforsomeonebritishirealisedthattheslighttwangthatithoughtmightbebostonianwasactuallytheremnantsofanenglishaccentiwasalsothrownbythefactthathissondiedinkoreabuticheckedandthebritssenttroopstohelpusoutinthatconflictandmikessonwasoneoftherafaviatorssentonexchangetotheusafhediedduringareconnaissancemissionshotdownbyakoreanmigandthefileshowsthatbeforethecarrierlostcontactwithhisplanehereportedhearingrussianspokenovertheradiochannelsusedbythemigpilotsmikecametotheusforthefuneralandneverwentbackhewasmarriedbutithinkhiswifestayedintheuknotallmarriagescansurvivesomethinglikethatmikeisstillgrievingandiguessithasdrivenhimalittlemadicanseewhyheissoangryaboutthepossibilitythattherussiansaretryingtosabotageapolloflightsandiguesshewantedtogetthewordoutiamstillalittlepuzzledthoughhemightbeboilingwithrageandgriefcanmakeyoudostrangethingsbutihavetriedtoimaginehimwritingitanditjustdoesntsoundlikehimiguesshewastryingtocoverhistracksanotherthingisbotheringmetoothecallforastrikeagainsttherussiansseemsoutofproportiongiventhelackofhardevidencewehavethatthesovietsarebehindtheattackseithermikeknowssomethingwedontorheispronetojumpingtoverybigconclusionsonverylittleevidenceandthatdoesnotsoundliketheprofileofanasaengineertomeiwonderedaboutgettingawarranttocheckouthisplacetoseeifhehashiddenanythingtherebutjudgestakeadimviewoffishingexpeditionssoithinkimayneedtobemoredeviousicouldreallydowithhavinghimoutofthewayforafewdayswhileisearchhisapartmentandmakeafewenquiriescouldyoucallhimovertothejohnsonspacecentreintexasanalternativewouldbehuntsvillealabamabutifeelveryuneasyaboutinvitinghimuptherenowthatweknowheisasecurityriskififindanythingmoreiwillletyouknowotherwiseiwillmovebacktothesabotageinvestigationlikeyouaskedmeg'"
+      ]
+     },
+     "execution_count": 48,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(tcb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(tcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "columns \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'harryidontthinkwearegoingtoneedtolookfarforourmoleandicannotbelieveithastakenmethislongtoworkitoutyouarerightthatalotofstaffherespenttimeintheukeitherduringthewarorworkingwiththeballisticmissileexpertsintheiratomicweaponsprogrambutyoudonteasilypickupweirdspellinghabitslikethatasanadultyouhavetohavebeeneducatedtherethereisjustonepersonihavespokentoaboutallthiswhocomesfromtheukandthatismikeididntrealiseatfirsthisaccentisprettygoodsincehehasbeenheresincethemidfiftiesbutassoonasyoutoldmetolookoutforsomeonebritishirealisedthattheslighttwangthatithoughtmightbebostonianwasactuallytheremnantsofanenglishaccentiwasalsothrownbythefactthathissondiedinkoreabuticheckedandthebritssenttroopstohelpusoutinthatconflictandmikessonwasoneoftherafaviatorssentonexchangetotheusafhediedduringareconnaissancemissionshotdownbyakoreanmigandthefileshowsthatbeforethecarrierlostcontactwithhisplanehereportedhearingrussianspokenovertheradiochannelsusedbythemigpilotsmikecametotheusforthefuneralandneverwentbackhewasmarriedbutithinkhiswifestayedintheuknotallmarriagescansurvivesomethinglikethatmikeisstillgrievingandiguessithasdrivenhimalittlemadicanseewhyheissoangryaboutthepossibilitythattherussiansaretryingtosabotageapolloflightsandiguesshewantedtogetthewordoutiamstillalittlepuzzledthoughhemightbeboilingwithrageandgriefcanmakeyoudostrangethingsbutihavetriedtoimaginehimwritingitanditjustdoesntsoundlikehimiguesshewastryingtocoverhistracksanotherthingisbotheringmetoothecallforastrikeagainsttherussiansseemsoutofproportiongiventhelackofhardevidencewehavethatthesovietsarebehindtheattackseithermikeknowssomethingwedontorheispronetojumpingtoverybigconclusionsonverylittleevidenceandthatdoesnotsoundliketheprofileofanasaengineertomeiwonderedaboutgettingawarranttocheckouthisplacetoseeifhehashiddenanythingtherebutjudgestakeadimviewoffishingexpeditionssoithinkimayneedtobemoredeviousicouldreallydowithhavinghimoutofthewayforafewdayswhileisearchhisapartmentandmakeafewenquiriescouldyoucallhimovertothejohnsonspacecentreintexasanalternativewouldbehuntsvillealabamabutifeelveryuneasyaboutinvitinghimuptherenowthatweknowheisasecurityriskififindanythingmoreiwillletyouknowotherwiseiwillmovebacktothesabotageinvestigationlikeyouaskedmeg'"
+      ]
+     },
+     "execution_count": 49,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_frequency_break(tcb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(tcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry i dont think we are going to need to look far for our mole and i can not believe it has taken\n",
+      "me this long to work it out you are right that alot of staff here spent time in the uk either during\n",
+      "the war or working with the ballistic missile experts in their atomic weapons program but you dont\n",
+      "easily pickup weird spelling habits like that as an adult you have to have been educated there there\n",
+      "is just one person i have spoken to about all this who comes from the uk and that is mike i didnt\n",
+      "realise at first his accent is pretty good since he has been here since the mid fifties but as soon\n",
+      "as you told me to lookout for someone british i realised that the slight twang that i thought might\n",
+      "be bostonian was actually the remnants of an english accent i was also thrown by the fact that his\n",
+      "son died in korea but i checked and the brits sent troops to help us out in that conflict and mikes\n",
+      "son was one of the raf aviators sent on exchange to the usaf he died during a reconnaissance mission\n",
+      "shot down by a korean mig and the file shows that before the carrier lost contact with his plane he\n",
+      "reported hearing russian spoken over the radio channels used by the mig pilots mike came to the us\n",
+      "for the funeral and never went back he was married but i think his wife stayed in the uk not all\n",
+      "marriages can survive something like that mike is still grieving and i guess it has driven him a\n",
+      "little madi can see why he is so angry about the possibility that the russians are trying to\n",
+      "sabotage apollo flights and i guess he wanted to get the word out i am still a little puzzled though\n",
+      "he might be boiling with rage and grief can make you do strange things but i have tried to imagine\n",
+      "him writing it and it just doesnt sound like him i guess he was trying to cover his tracks another\n",
+      "thing is bothering me too the call for a strike against the russians seems out of proportion given\n",
+      "the lack of hard evidence we have that the soviets are behind the attacks either mike knows\n",
+      "something we dont or he is prone to jumping to very big conclusions on very little evidence and that\n",
+      "does not sound like the profile of a nasa engineer tomei wondered about getting a warrant to\n",
+      "checkout his place to see if he has hidden anything there but judges take a dim view of fishing\n",
+      "expeditions so i think i may need to be more devious i could really do with having him out of the\n",
+      "way for a few days while i search his apartment and make a few enquiries could you call him over to\n",
+      "the johnson space centre in texas an alternative would be huntsville alabama but i feel very uneasy\n",
+      "about inviting him up there now that we know he is a security risk if i find anything more i will\n",
+      "let you know otherwise i will move back to the sabotage investigation like you asked meg\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(lcat(tpack(segment(pb))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "2749"
+      ]
+     },
+     "execution_count": 51,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open(plaintext_b_filename, 'w').write(lcat(tpack(segment(pb))))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2019/8a.ciphertext b/2019/8a.ciphertext
new file mode 100644 (file)
index 0000000..5406b41
--- /dev/null
@@ -0,0 +1 @@
+HBTUC NVBBC YRQGV THRLX UHKCU NMFPI VTSAP NMZYC IIYEY WCQEP GNNIG UIFZR MWXPP LOCTN WAUQA PNDNU ORWYU MBQOW MFHTY XZMYZ JJMMT IUFSR HPVPD SDBIV XDALM DKKDH LFUDR IIVUY EEQED GYELH OOOIM NKJPJ JTXTW AONXH SHJFL AYNKR PBEPH WLJUE GPOYF NBZUO HEINE LLNNC QDVIG WWUVZ JVWXQ EVBNC EKIVE ICYIK OUIUV JIBFZ UUGNN RDXRG AQRHR JJAPN DLZXQ DDKSB HDJDR GETQX VHKVN CRPQK DAEJA HHRWP MQIHK QEQRF QWCEM YZTTZ FTJJH IMWBV VUIRU CMMPZ DZCSY WAVUO ELLCU SKQKY NHBYB ZORGH YKYHN YNLNO EEURM YCHAQ OWPOO RAWGK ZPNQF DRUGV XXGUL JBPBY ORUDW GNAEQ RDDGQ UXMGA NUSRT GCCSV AMBVZ MYRSF FLRXV LKCSZ ZGVTJ RFDQV OOCSU SPHHY UZMAF TOROC TVSKG VNHCC FPTRH DYZMH PFDGV THLHZ LVZBQ VESGF EWXPM MYFFG CPBCG PCOPL PTNPH IKWUB VMZZI RFSKI AGAAE QMTTB VWANI LBQOD BNQTI YAIPJ HQYFE BPGXM KOQPR PDCCL UIOTM POBBS OCQLP TLMMG MPEFC MOXWG XPNFL FGSQX RIZLA CCFZS CGJLF TNZHV GSLPQ NWQOR MCRPF USGCF KMUOE ZQVIU EKIXO UBQOE MAYLU IWHPZ NIMNK FFGYW OUOCR PHBZI QXWNJ BNXBD AOFRY WHLAC QFQFG XIKZT NODBW EUTGG GQUZM MNFDV BVJYW UIDHL DEAMN RANTN BQOEQ ZDTHR LNLZP LPHSF VRSAK YICRZ GFOCT UWZLZ APWNU NKJLY ZOQWU ETRHT IKWGA DJBCQ SXQXP INHDN XZFVQ TTKZT NWQQQ HNDGW LJZHV TYAQE OIYEY MYHLB PZTVT HAFYZ CYZZE RRIES WLIHA TFDRF YHPQH LTXGK QECIX VVBUG KKJXW FPWEX LHZJC AXHGT YXZMS NKKMN NFYRY QJOIE OYAGW RUUGI YMWQG MGUJD XKGYW DDZRA CGCRD KUICB GSITC PMWGJ TNDSQ GOCAC SLNZZ XQKOO IDWNZ KQMKY PGVPJ RVWMO KQFDI NRUIX YPWWD SMGHW YJOTM VOFKO LFCFG NJLVC KNTNW CEWWO YIPPR GAUER YQJUW CRLHR PTUEX HLZOB CMBVV WLJIV UYEEQ ETXBV KMYGH XBHFG GUISZ ZBXBJ IRTDK EVMQJ RBPRI PPVSK ZOMDZ RDNRT HVHHL OSEGB HXCVA WOABN XEAQS IQZDM BZLOM BEEWU IXLVZ VYOUS MXDXL AYZHB ASRJE DPXEZ BNWZZ GVTJR FDNCA CGQSU ILZJY HKXWA DRVTD JAOYG EPRNF UJHGF HSQWQ DIVHR XXWTL VJAAN NUTRP XEZBN WDFUO IDVWW YYPLZ DHBTG ISKKN XBETR UGELF WVVOB BUOMV DKJOA TRCEE RJTHP UKCOE ZYKCP OSSSK UBNHN QCHIX VLAYM ILQSA UKFZF RCMBD SUFRD SLEXH OSXQE IMGGM SZOMB OCHVQ THVUH LYOLU DKOQZ MYCHA CRPAS TXSZS ELZYL PCBVV WLJIO QNPDK FHTCJ WGADJ BCQWI QVMLT LLRDZ RSGPO JLAYN EDLZT VTHSS OAQBK MMQQD FPGYB DOLUM WFHRY SJPLN XEUPO ASFHB YNEKQ DVFTD PROZA RYYRV ZTISG MBDJQ FDMBP XJFIA CAOCE ESREI VLUIZ XRJEO PHHDC OMAOD AZSDV KZXNZ OQQVE SGFEW XPMMY FFFCX JZKVF ZWORG AUVKM XCHAC RPAST XSZSE PZNPG NNVUH HNTAP NEASE OSUKZ XMZYL LCVFT VMTTH XYOLD RRIES WMBZO XKDDP EXQJT AJDDT FVBRB LVXXO DBRGE SORWY GAQLF LXISH EELAY GEPRN FDQPT TTLVC CEAOS RXRFZ YYWKB SHFVH QUKYI CECQT OJWVD BGDPP UDRFE LVHRL LBOGQ EOAJZ EXMRE QFZNF ZFPFS HBRYY YNFZD VPMNJ PECDI HJWCI KNZNO NQVZX DXAMF JKHQK ILGRY WYHJX DPGER TBZTX LVPBJ XASTD RLKKN XBETR HPDBL HVZIF QBOOH LKZXL LRXLZ RTUEI LMIXW RQDTS QXFQK MWADS QZWHI ZGGUG PEMTG IYHGF TAJNC FDRHW UPJXU GEPCC HPYGE SMLZX EDFUW HMRKP BZJTC OUUKW XTMLB QOCIV HWQCD MBZKQ FDRBE FMIKU BBSEU FDGUK LRWGA XPSHJ UZEXG UWCRP DQSAY SWKUO AXRSA DMRRY NLXAY RDNAL UWGNH YPECR EDQQH AKYAR YYASH WUIWI IMPFL ZBPZX RIKYB QOQXB CGRFS KXNEK KHKFU SPFIL QBEAB BGTYK ALJJO PGALF VKEYS PSNRL PFHJC SDXXV YOMRS UJHHT IBUNX ETVAH UCXTH YSXQH NWGVX NMHBR XRUGO HFRJM IADFQ BANRD MLTAW YBZHR HWQKL AYMQP QHAOU ZIWKI MQSYP GVXIJ LKCIC LDORP DOIRY ICCKE FUSKU IQEYV OQFDI TIXMQ ZFWOK XMWCG CZKCO YCBKD NUCQH NLAPN KDFEC CQLLL BVZAG DDIGZ SZRKP JFPNR SCJIA XXAKO KZNTN DYLNA MAKDU GWHJF YXNCA OUHTI VKIQK HSLRL DTSHX VOBFG XBENI OIWSU XPAXX QAEOK UIQEI ICQGL EPHFS ZXZMC RPQIW SUEUX CNOQG KLMCU KJRFK RBNGZ GIQEL BUGSB AZNEG IMSOA MUIEU RVXCK GMBZH BYJTP VKISK DAYKA QETDH VFLCX OJYSC IGGXM KAGYO HDVHT HIAUV JJXLC TZRHG MGYIL DPDVG IYTKH HCEPR XPFYU MYKYE RDSFU SXDBS GXDIM PDSTK RRXUU BQOWQ GHTHK GMBZA AGSOS DXXBK ZBRVW ONBCE KKAIR YLLBL VULZJ RFBQK ETRRX HVUMY YKOAZ RSKHH TAAIW IZRGV TIRTH NVCBY STFOS XXGUL FOSMI SCEKT XYIWY JDTPH LRIGU GXXPQ YGTMY GAUYX LRGMP VLZJG ULXZA AEHJD ZLRMJ DBGRO VTEIX ZZCBZ POGWP CEGMM PNBUD CBPHR YOYMU ICQYO MRLLP CODKM RIHPL JNIHV CSYOV RTDKK HHVLL JKOYK YXTDC QJXOI VHWCZ CXCIY RQSOE ALJJK SAUSR TGZNB VKLQJ NOGDD BDRYY ZOMAO XMVBX DXSII GHLDK IHJWA JGYMB DTXYH GOZFZ NJYOY BKUJD XTZOM AOYOV DWUIW WXJYR KDNUY HJTAU LRXXU XSHFC SVYDP EYRAW GUCXZ YIWQP MYDWQ SWMQC EZFHT IKQOR AZBKO DUTBX VZUTH OXRRH CBPWU ZOAMB OPTBK IESJX UFEQW DTOQZ XMGAB QOYMF OREDH NNDJD CWPFT WWMGC MVYCQ GWBUZ SFBJL FLFTI CWAJY OWDVO NROQB VLHXZ YFNGE SKWES JAPJD TFJWA BJZXX NKJCL OSGOM LNAWW WTWRG IXZFD CICJM QEJOS SWZHV CVJUG AXWYL MYGHR QVHBV HPXKP NJXJF UWCWY WAUYL IYMNF FPIL
diff --git a/2019/8a.given.plaintext b/2019/8a.given.plaintext
new file mode 100644 (file)
index 0000000..2550142
--- /dev/null
@@ -0,0 +1 @@
+harryiputtogetherateamofwomenfromthecomputingdivisionhereatkennedyandwehavespentmostofthelasteighteenmonthscombingthroughmissionfilesandcomputerprintoutslookingformorecluestothesourceoftheoxygentankexplosiononboardapolloxiiiandithinkwehavefinallyworkedoutwhathappenedthetankcontainingthesourceoftheexplosionwasoriginallyinstalledinapolloxbutremovedformodificationduringthatprocessitgotdroppedsoitwasheldbackforfurthertestsandareplacementfittedforthatflightonceithadpassedinspectionthetankwasreturnedtoserviceandearmarkedforodysseyfurtherupgradeswerecarriedouttoallowittorunoffgroundpowerduringfitoutattwicethespaceshipvoltageandthehigherpowerwasusedtoboiloffexcessoxygenduringgroundtestsunfortunatelyitlookslikethethermostaticswitchesinthetankwereoverlookedduringthevoltageupgradeandourbestguessisthattheyfusedclosedduringtheboiloffallowingthetemperaturetorisetooverathousanddegreesyoumightthinkthetestengineerswouldhavenoticedthatbutsincethetankoperatingtemperaturewassupposedtobesomewherewellbelowzerothedialonlywentasfaraspluseightysonoonewouldhavenoticedoperatingthatfaroutofnormalrangeitisamiraclethetanklastedaslongasitdidandthataddstotheimpressionthatthiswasasimpleaccidentachainofeventsthatcouldnothavebeenforeseenbutthecomputerfilestelladifferentstorywefoundtwoversionsoftheupgradereportwhichwaswrittentodetailtheproceduresformodifyingtheelectricalsystemonthetankthefirstgivesacomprehensivelistofthecablingswitchgearandcontrolsystemsthatneededtobehardenedforthegroundbasedvoltageitlistseverycriticalcomponentexceptthethermostaticvalvesthisdocumentwasfiledintheservicerecordsoweknowitwastheofficialrecordbutthechiefsystemsengineerwhosigneditoffsaysthesignatureonitisabadcopyofhisownwefoundidenticalcopiesinseveralmissionfilesbothinthemanufacturersrecordsandatkennedywheresomeofthetestswerecarriedoutsoitisclearthatthiswastheofficialversionusedintheupgradethesecondversionappearedtobethesamedocumentbutitincludedthethermostaticvalvesonthelistofcomponentstobechangedandthetemperaturegaugelimitswerecircledseveraltimeswithanexclamationmarknexttotheeightydegreeceilingitlookslikeoursaboteurdeliberatelyarrangedforthetanktobemisconfiguredinanefforttocausetroubleforthemissionalthoughwecantbesuretheyrealisedhowdangerousthiswaswhenweputittogetherwithalltheotheraccidentsitisprettyclearthiswasanotherdeliberateattackontheprogramwefoundthesecondversionofthereportinaboxunderthefloorboardsinmikesplaceisupposeitispossiblethatmikehadstumbledacrossthedocumenthimselfandwasinvestigatingitaspartofhiscampaigntoprovethattherussianswerebehindthisstringofproblemsbutattheveryleastheisguiltyofamajormisjudgementandiftheastronautshaddiedhewouldhavebeentriedformanslaughterasitistogetherwiththeleakchargeshewillbegoingtoprisonforaverylongtimeofcoursetheevidenceisstilllargelycircumstantialwecandefinitelytiehimtotheleaktothenewspaperforensicsmatchedthetypewriterribbonandtypecharacteristicsonhistypewriterwiththeinkandimpressionsonthelettertotheeditorbutwestillcannotshowconclusivelythathedirectedorcarriedoutanyofthesabotageattemptsandwehavenotbeenabletofindanyoneelsewhohadbothmotiveandopportunitysoheisourbestsuspectiamnotsurewecanentirelyrelaxbutwithnosignificantincidentsonapolloxivtoxviandwithmikeincustodyifeelslightlylessworriedabouttheremainingapolloflightwearestilltryingtocrackthatotherenciphereddocumentwefoundinmikesplaceithasaverystrangealphabetwhichithinkmustbesignificantbuticantquiteseehowtobreakityetnowthatthenasacomputingexpertshavemoretimeiamhopingthatweshouldbeabletodecipheritandthatitwillshedsomemorelightonmikesthinkingmoreimportantlyitmighttelluswhatelseifanythinghehadplannedmeg
diff --git a/2019/8a.plaintext b/2019/8a.plaintext
new file mode 100644 (file)
index 0000000..23b9dbd
--- /dev/null
@@ -0,0 +1,45 @@
+harry i put together a team of women from the computing division here at kennedy and we have spent
+most of the last eighteen months combing through mission files and computer printouts looking for
+more clues to the source of the oxygen tank explosion onboard apollo xiii and i think we have
+finally worked out what happened the tank containing the source of the explosion was originally
+installed in apollo x but removed for modification during that process it got dropped so it was held
+back for further tests and a replacement fitted for that flight once it had passed inspection the
+tank was returned to service and earmarked for odyssey further upgrades were carried out to allow it
+to runoff ground power during fit out at twice the spaceship voltage and the higher power was used
+to boil off excess oxygen during ground tests unfortunately it looks like the thermostatic switches
+in the tank were overlooked during the voltage upgrade and our best guess is that they fused closed
+during the boil off allowing the temperature to rise to over a thousand degrees you might think the
+test engineers would have noticed that but since the tank operating temperature was supposed to be
+somewhere well below zero the dial only went as far as plus eighty sono one would have noticed
+operating that far out of normal range it is a miracle the tank lasted as long as it did and that
+adds to the impression that this was a simple accident a chain of events that could not have been
+foreseen but the computer file stella different story we found two versions of the upgrade report
+which was written to detail the procedures for modifying the electrical system on the tank the first
+gives a comprehensive list of the cabling switchgear and control systems that needed to be hardened
+for the ground based voltage it lists every critical component except the thermostatic valves this
+document was filed in the service records owe know it was the official record but the chief systems
+engineer who signed it off says the signature on it is a badcopy of his own we found identical
+copies in several mission files both in the manufacturers records and at kennedy where some of the
+tests were carried out so it is clear that this was the official version used in the upgrade the
+second version appeared to be the same document but it included the thermostatic valves on the list
+of components to be changed and the temperature gauge limits were circled several times with an
+exclamation mark next to the eighty degree ceiling it looks like our saboteur deliberately arranged
+for the tank to be misconfigured in an effort to cause trouble for the mission although we cant be
+sure they realised how dangerous this was when we put it together with all the other accidents it is
+pretty clear this was another deliberate attack on the program we found the second version of the
+report in a box under the floorboards in mikes place i suppose it is possible that mike had stumbled
+across the document himself and was investigating it as part of his campaign to prove that the
+russians were behind this string of problems but at the very least he is guilty of a major
+misjudgement and if the astronauts had died he would have been tried for manslaughter as it is
+together with the leak charges he will be going to prison for a very longtime of course the evidence
+is still largely circumstantial we can definitely tie him to the leak to the newspaper forensics
+matched the typewriter ribbon and type characteristics on his typewriter with the ink and
+impressions on the letter to the editor but we still can not show conclusively that he directed or
+carried out any of the sabotage attempts and we have not be enable to find anyone else who had both
+motive and opportunity so he is our best suspect i am not sure we can entirely relax but with no
+significant incidents on apollo xiv to xvi and with mike in custody i feel slightly less worried
+about the remaining apollo flight we are still trying to crack that other enciphered document we
+found in mikes place it has a very strange alphabet which i think must be significant but icant
+quite see how to break it yet now that the nasa computing experts have more time i am hoping that we
+should be able to decipher it and that it will shed some more light on mikes thinking more
+importantly it might tell us what elseif anything he had planned meg
\ No newline at end of file
diff --git a/2019/8b.ciphertext b/2019/8b.ciphertext
new file mode 100644 (file)
index 0000000..1bbf100
--- /dev/null
@@ -0,0 +1 @@
+FBGAI AGCFE KEFEK CIAGC FCGAF CIBHD HEFCF AFBFA GDFCH DFEKC IAKCI BGBGC IAHAF EKCFA KAIAG CFBFA GBFBI AFBHE IAGCK CIAFC IBHDF EGAGA FCHDI AHEIA FCKDF CFAIA KCFBF AIAGC FEHEF CICFB FEIAH EFDKA HBHDF CIEKA IDKCH DHEFB HEKEF CFCHA FEKEK CHEHA KAGEF CKCIA GCFBF AGBFC GAIAG CFEHE FCICF BFEIA FEHAH BFBHD FEIDK CHEHE IAFCG DFEKE FDKAG CFBHE KEFEK CIAGC IAGCF EIBHE HEHDG AFEFE KEHEF CFAIA GCFEK CFAGB FEHDI AGCKC IAIDF EHEIA FBHDI BHBID FBIAG CFEKC KDGCI DKCHD IDFEG AFBGB GCIAF BFAFB IAHEH BIBHB HBFEI AHEIA KCIAF EHEID FEGCK CICFE IAHDF BFEKE IAFCK DFCFA IAKCF BFAFB IAFDI BIAFB FAFCI DHDFE KCGEF BHEFE IAGCK CIAID FEKDK CFAFC FAGEK AKEFE GAFEK CIAFB IAIAG CFEID KCKAI DFEGA FCIBG BGCIA GAKCH EKDFB HEHAF DKAIA KCGDF BFAGB FCFAF BIAHE HAFBG BGCIA FBFAF CHBFE FAIDK CHDFC IBHDH BFCGE FBIAF BKDFB KCFAH EGCKC ICFEH EGCHD IBFAG DGAHD FCHAI AGCFE KDFCF AGAGE FBKDI AKCFA KEIAG CFEKA FAFEF EKEKC HDFEK CHEFC FAIAF CKDFC FAGAH DFCFA IAIAG CFEFE ICFBG EFEIC FEFAI AGCFE IAGCH DFEKC IAFCG AFAIB KDGEF EKCHD HAFBH EHEFB GEFEH EFDKC HEFEK EFBFA KDIBF DKCKE FBKEF AFCIA GBFBI CFEIA GCFEH AIAGC FEHAF EIAIA GEFEI AFCGA FBGBG CIAFB FAHEI AFEKC KEIAG CFEKA GCKCI CFEKD FCFAI CFBFA KDFEK EIAGC FEHAH EFEGE ICFEH EIAGC KCIAI AGCFE HAKCK EKEFC KDIAH DFBFA FEFCG AHAIB IAIBK CGEGE KAKCH EHEIB HDFEK EKEFE HEIAH DIBKD IAFBF CFAID FBGEG EHBHD FCIAF EKDIA IBHEK CFAKE IAGCK CIAHB FEKCK DFEKD KCFAF DFEHA KCFBF AIAKC FBFAF EKEIB FAKEF EHDIA GCFEH EGCFE GEIAF EHDFC GAIAG CFEFA IBKDG EFEKC HDIBH AFDHD FEGEG EKCIA GCFEK AKEFC FAFCI AHEFE FEHAI AFCHE FEFEI AGCKC IAIAG CFEGE FCFAG BFEHD IDFEK DFCID FEHDF BFAIA GCFBH EHEGC KCKEF CIDIA GCFEH AFCHD FEIAG CFEIA IDFCH EFBKE FEHEI DFBGE GEFBF AICFE HEIAF BFAIA GCFEH EFEKC IDGAI BGEID FEKCH BFCFA HEFDF EGAFC HDFEG EFCFA GBFBI AIDFB GEGEF DFEFB HAHBF CHEHE FBFDG EFEIA FCGAF BGBGC IAKCI AKCGE GEIDF BIAGC FCIBI AIAGC FEIAG CHDFE KCIAF CGAIA FCIAK CGEKC FAFAF BGCFB GEKCI AFBFC FAKCF AKEID GCFEF AIAGC KCIAK EKCKA KDFCH AFEHE IDFEI DFBGE GEKCG EGEFD FEFEF AHEGE KCICF EKEFD KAIDG CFCFE ICFEH DFBHE HAFCH DFEHD IBIAG CGEFE HEHEG EFCHE FEKCF AKEID FEIDF BGEGE FDFEI AGCFE HEGEK CICFE HEIAG CFEHB HDFBK DFEFC GAIDF BFAFA FBFAG BHAFB GBGCI AFDFE IDFCH DHEFE KCIAG AFBHD HEIAF BGCFC HBFEK EIAGC KCIAI AGCFE HEHBK CKDFE HDKCK DFEID FCIBG EKEGC FEGEH BIBHE IAIBH DFAFB FAGBI AGCFE HAFBH EHEFB GEFEH EGAHD FCHAI DFEKC HBFCF AHEFC GAIDK CHDIA FCKDK CHDHD FBFEH DHEFC GAHBF EKCKD FEKCF AKEGD FEFAF AFEKE KAHEF EFEHA FEKEI AFCGC KCICF EIAGC KCIAF BFAHA FBFAK EIDGC FEFAG CFEHE FEIAG CFBHE HBHDF CGBHD KCHAI AFCGE KCFAK EFCFA IAGCF EHAFC FCFAF DKAID FBFAF AFBFA GBIAG CFEHE HBKCK DFEHD KCKDF EIAGC FEKCK EHAFB FAFBH EIAHD KCIAF BFCFA GCFCH BFEKE IAFCF EHEIA KCFDG EFBHE GCIAG CFEHE IBHBH DFEHA KCKDK AFCGA IAGCF EKDKC HBFBI AKCGE FBHEI AHEKA HEIAF EHAFC ICFEH DKDFC HAHAI BFAFB HEHAK DFCID FBFAG BFCIB HDFEF AFEHA FBFEH EKCFA KEHEF EIAIA FBFAG BFCIB HDGCF EKCHD IAHEK CFAKE HAFBF AKEHE FCFAI AGCFE KDFCF AHCIB FEHEI AFCGA KCFAF EIDGA HDFCF AIAFB FEHDF DIBIA FDHDF EKBGC FAFEI CHEFE FEHAH EIBFA KEFEI AFEHD HDFEK EKCFA KEFEI CFEFA FDFEG AFCHD FEIAG CFEGE KCIBF AKDGC FCGAK CHBFC GEGEF CIEFB IAGCF EKCHA FEHDF BKDKC FAHBI BFDGE FBKDF BHEFD FEGBF BFAFA FBFAG BIAFC GBFEI AFDFC HDFEK EIAGC FEIAG CHDFE KCIAF CGAFA IBKDG EFEKC HDIDK CHDFB HEHDF BHEFB FAGBK CFAKE IAGCF EHBFE KCKDF EHBHD FCIAF EHEIA HEIDG CFBKD GCKCH DFEFB FAIAF EFAKE FEKEI AFCHB HDFEI CFEFA IAFBI AKCHD FEFEF AKDFC IBHDK CGBFB FAGBF CIBHD FEFAF EHAFB FEHEI AFCFD FEGEF BFEIC FEIAG CKCIA IAGCF EKAKD KCFAI DFBFA IDKCH DFBHE IBFAK CICFC FBKEK CFDGE FEIAF CHEIB HDICF BICFE FBIAI DFEHA IBHEI AGAFB GBGCI AFBIA FAFCI DFCFA FCIBH DFCID FAIAF EHDHA HEFDF EGAFC HDFEI AGCFE FAIBK DGEFE KCHDK CHDHE FEFAK CGEHE GBHDF CIDIA FCFCH BFCID FEHDG AIBGE FBGAF CIBHD GEFEK CKEFE HDHEI DFBGE GEFAF CIAKC KDIAF CGAIA GCFEF BHDFC IDFAI CFCGE FBIAF BFCFA IAGCF EFAFB IDFBG EGEHB HDFCI CFCGD FEIAG CFEHD FEHCI BFBHD FEKEK DFCFA GAHDF CFAIA KCIAF BFCFA FBIDF BGEGE KDFCF AICFB FAKDF EIAGC FEHAI AGCKC IAIAG CFEHD IBHEH EFBKC FAHEG CKCIC FEHEK CFDFC IAKCG BFEKE IAGCF EGEIB FAKCH DHBHD FCGBH DKCHA KCFAK EGDFB GEGEF EKEFC HDKCI AIAFE HAHBI AFEKE IAFCG DFBGE GEFCI BHDKC HEIAH DFCFA KCIBI AHEIA GCFEH DIBHE HEFBK CFAHE IDFBG EGEFA FEICF EHDFD FEKCF DGEFE IAFCH BHDFC ICFEI AGCKC IAIAG CFEKA KCHDF EFBFA FAFCK DFEFA IAKCF AKEFC IBHDH BFCGE FBIAF BKDFB KCFAH EKCFA KEGBF EFAFE HDKCG EHEID FBGEG EFDFE GAFCH DKDFE KEIAF CHEIA HDFBG DFEFD KCKDG DIAGC FEHDI BHEHE FBKCF AHEID FBGEG EFEHE KDKCG EKCIA FEFBF AFCHD KEFEH DIAFC FAFCI AGEFC FCGDI DFEKC GDKCF AKEFC FAKDF EIAGC FEKAG CKCIC FEKDF CHAHA FBIAI AFEKE IAGCF EHAHE FEGEI CFEHE IAGCF EHDFE IDFBG EGEFD FEFAF CIAIB HDFAF BFAGB FDKCK DGDIA GCFEI BFAKC ICFCF BKEKC FDGEF EIDKC HDIDF BGEGE GCKCI CFEIA FCFDF EGAFC IBGBG CIAIA FCFBI AHEKD FCFAK DGEIB HEFBF CFA
diff --git a/2019/8b.given.plaintext b/2019/8b.given.plaintext
new file mode 100644 (file)
index 0000000..a23954a
--- /dev/null
@@ -0,0 +1 @@
+ifthedeathofoursoninkoreataughtmeanythingitisthatoureffortstocontainthesovietsbyproxywarsisdoomedasmyloathingofthesovietempirewasstokedbyhisdeaththeussrfeedsontheangerthatwestirupwitheachwarwefightinitspuppetstateswehavetriedtocontainitbutinowrealisethatwecanonlydefeatitthewaywefoughtfascismbytakingonitsmightinopenwarourpoliticianshaveshrunkfromtheconflictandtheyneedareasontoconfronttheevileventhethreatofnuclearmissilesbasedincubadidnotgivethemthemettletofightinsteadtheyhaveconvincedthemselvesthatthemaddoctrineofmutuallyassureddestructionwillprotectusandthatpeacecanbemaintainedundertheshelterofthenuclearumbrellatheydonotseemtoseethatthelongerwecowerinthisshadowthemorethetwosideswillinvestintheseawfulweaponsbeforelongitwillbeimpossibletofightatallwithoutthethreatoftotalannihilationandwhenthatdaycomeswewillallbeenslavedbywhoeverismoreruthlessloseandwewillbetheslavesthepriceofwinningmightbeworseatfirstihopedthatthespaceracewouldhelpusturningthemissilesfromweaponsofwartocarriersofpeaceandkennedyseemedtohavethatinmindwhenhesethisprogramtolandonthemoonbywinningthespaceracetheadministrationhopedtoestablishthesupremacyofthecapitalistsystemovercommunismcowingourenemiesandsettingourheartsandmindsontheconquestofanewfrontierbutbrezhnevseemsundeterredandevenbeforethelaunchofapolloxitheamericanpublicisbeginningtogetboredthethreatofnuclearwarisrisingandthepeaceprotestswhichareintendedtopreventitareencouragingourenemiestobelievethattheycanwinwarisunavoidabletosurviveitwemustfightitnowonourowntermsbeforethenucleararsenalsgrowtoopowerfulifourleaderswillnotactoftheirownvolitiontheniwillprovoketherequiredconfrontationiwillconvincethemthattherussianshavesabotagedthelunarprogramandkilledorattemptedtokillourastronautstherussianswillneverbeabletoprovethattheyareinnocentandourpoliticiansandgeneralswillbeforcedtostrikebacktherussianswillescalateinordertonotlookweakandoncetheyhavecommittedthemselvestherewillbenoturningbacktheunavoidablewarwillhavetobefoughttoitsconclusion
diff --git a/2019/8b.plaintext b/2019/8b.plaintext
new file mode 100644 (file)
index 0000000..1d7506a
--- /dev/null
@@ -0,0 +1,25 @@
+if the death of our son in korea taught me anything it is that our efforts to contain the soviets by
+proxy wars is doomed as my loathing of the soviet empire was stoked by his death the ussr feeds on
+the anger that we stir up with each war we fight in its puppet states we have tried to contain it
+but i now realise that we can only defeat it the way we fought fascism by taking on its might in
+open war our politicians have shrunk from the conflict and they need a reason to confront the evil
+even the threat of nuclear missiles based in cuba did not give them the mettle to fight instead they
+have convinced themselves that the mad doctrine of mutually assured destruction will protect us and
+that peace can be maintained under the shelter of the nuclear umbrella they do not seem to see that
+the longer we cower in this shadow the more the two sides will invest in these awful weapons before
+long it will be impossible to fight at all without the threat of total annihilation and when that
+day comes we will all be enslaved by whoever is more ruthless lose and we will be the slaves the
+price of winning might be worse at first i hoped that the space race would help us turning the
+missiles from weapons of war to carriers of peace and kennedy seemed to have that in mind when he
+set his program to landon the moon by winning the space race the administration hoped to establish
+the supremacy of the capitalist system over communism cowing our enemies and setting our hearts and
+minds on the conquest of a new frontier but brezhnev seems undeterred and even before the launch of
+apollo xi the american public is beginning to get bored the threat of nuclear war is rising and the
+peace protests which are intended to prevent it are encouraging our enemies to believe that they can
+win war is unavoidable to survive it we must fight it now on our own terms before the nuclear
+arsenals grow too powerful if our leaders will not act of their own volition then i will provoke the
+required confrontation i will convince them that the russians have sabotaged the lunar program and
+killed or attempted to kill our astronauts the russians will never be able to prove that they are
+innocent and our politicians and generals will be forced to strike back the russians will escalate
+in order to not look weak and once they have committed themselves there will be no turning back the
+unavoidable war will have to be fought to its conclusion
\ No newline at end of file
index 362322d8c28dcefeb38a73281da234b5309d5158..f1cfe996c5bc1eb6e4c3fcb6bf1ac708f40a509b 100644 (file)
@@ -44,6 +44,16 @@ beaufort_variant_encipher=vigenere_decipher
 beaufort_variant_decipher=vigenere_encipher
 
 
+def index_of_coincidence_scan(text, max_key_length=20):
+    """Finds the index of coincidence of the text, using different chunk sizes."""
+    stext = sanitise(text)
+    iocs = {}
+    for i in range(1, max_key_length + 1):
+        splits = every_nth(stext, i)
+        mean_ioc = sum(index_of_coincidence(s) for s in splits) / i
+        iocs[i] = mean_ioc
+    return iocs
+
 def vigenere_keyword_break_mp(message, wordlist=keywords, fitness=Pletters,
                               chunksize=500):
     """Breaks a vigenere cipher using a dictionary and frequency analysis.