--- /dev/null
+{
+ "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
+}
--- /dev/null
+{
+ "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": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAFQlJREFUeJzt3X+0ZWV93/H3R7CgggLOzRRHzCV2TBbJiphM0EbLwiU1Ik0HktSgBtGSjCtBk1jt6pjWqFWTafOry2WqwUjELoOlQQoNVBwJWVRFYUAYGIh1GsYwOMDkB6jxRwt++8fZVw6He+45595z5s4z9/1a6657zj7Pc57v3mfv+7n7x903VYUkSa15wmoXIEnSchhgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJh2+2gUArFu3rubn51e7DEnSQeDmm2/+66qaG9XuoAiw+fl5duzYsdplSJIOAkm+PE47DyFKkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkpp0UNxKSpJ0cJrfetXYbfdsO3OGlTyee2CSpCYZYJKkJhlgkqQmGWCSpCaNDLAkJyS5LsmdSXYl+ZVu+juS3Jvk1u7r5X193ppkd5IvJvmJWc6AJGltGucqxIeBN1fVLUmOBm5Osr177feq6rf7Gyc5CTgH+EHgGcCnkjynqh6ZZuGSpLVt5B5YVe2rqlu6x18D7gI2LNFlM/Cxqvp2Vd0N7AZOmUaxkiQtmOgcWJJ54HnA57tJb0iyM8lFSY7tpm0A7unrtpelA0+SpImNHWBJjgIuA361qr4KvB94NnAysA/4nUkGTrIlyY4kO/bv3z9JV0mSxguwJE+kF14fraqPA1TV/VX1SFV9B/ggjx4mvBc4oa/7M7tpj1FVF1bVpqraNDc3t5J5kCStQeNchRjgQ8BdVfW7fdOP72t2NnBH9/hK4JwkRyQ5EdgI3Di9kiVJGu8qxBcC5wK3J7m1m/ZrwCuTnAwUsAd4PUBV7UpyKXAnvSsYL/AKREnStI0MsKr6NJBFXrp6iT7vAd6zgrokSVqSd+KQJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNenw1S5AkjR781uvGrvtnm1nzrCS6XEPTJLUJANMktQkA0yS1CQDTJLUJANMktSkkQGW5IQk1yW5M8muJL/STT8uyfYkX+q+H9tNT5L3JtmdZGeSH5n1TEiS1p5x9sAeBt5cVScBLwAuSHISsBW4tqo2Atd2zwHOADZ2X1uA90+9aknSmjcywKpqX1Xd0j3+GnAXsAHYDFzcNbsYOKt7vBn4SPV8DjgmyfFTr1yStKZNdA4syTzwPODzwPqq2te9dB+wvnu8Abinr9vebpokSVMzdoAlOQq4DPjVqvpq/2tVVUBNMnCSLUl2JNmxf//+SbpKkjRegCV5Ir3w+mhVfbybfP/CocHu+wPd9HuBE/q6P7Ob9hhVdWFVbaqqTXNzc8utX5K0Ro1zFWKADwF3VdXv9r10JXBe9/g84Iq+6a/prkZ8AfBQ36FGSZKmYpyb+b4QOBe4Pcmt3bRfA7YBlyY5H/gy8IrutauBlwO7gW8Ar5tqxZIkMUaAVdWngQx5+SWLtC/gghXWJUnSkrwThySpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkjAyzJRUkeSHJH37R3JLk3ya3d18v7Xntrkt1JvpjkJ2ZVuCRpbRtnD+zDwMsWmf57VXVy93U1QJKTgHOAH+z6/Ockh02rWEmSFhw+qkFVXZ9kfsz32wx8rKq+DdydZDdwCnDDsiuUJAEwv/Wqidrv2XbmjCo5OKzkHNgbkuzsDjEe203bANzT12ZvN02SpKlaboC9H3g2cDKwD/idSd8gyZYkO5Ls2L9//zLLkCStVcsKsKq6v6oeqarvAB+kd5gQ4F7ghL6mz+ymLfYeF1bVpqraNDc3t5wyJElr2LICLMnxfU/PBhauULwSOCfJEUlOBDYCN66sREmSHm/kRRxJLgFOA9Yl2Qu8HTgtyclAAXuA1wNU1a4klwJ3Ag8DF1TVI7MpXZK0lo1zFeIrF5n8oSXavwd4z0qKkqQDaZKr+/qv7DsQ/Qb76lHeiUOS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KTDV7sASZqG+a1XTdR+z7YzZ1SJDhT3wCRJTTLAJElNMsAkSU0ywCRJTTLAJElNMsAkSU3yMnpJMzHJZe39l7R7ObzG5R6YJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSSMDLMlFSR5IckfftOOSbE/ype77sd30JHlvkt1Jdib5kVkWL0lau8bZA/sw8LKBaVuBa6tqI3Bt9xzgDGBj97UFeP90ypQk6bFGBlhVXQ/87cDkzcDF3eOLgbP6pn+kej4HHJPk+GkVK0nSguWeA1tfVfu6x/cB67vHG4B7+trt7aY9TpItSXYk2bF///5lliFJWqtWfBFHVRVQy+h3YVVtqqpNc3NzKy1DkrTGLDfA7l84NNh9f6Cbfi9wQl+7Z3bTJEmaquUG2JXAed3j84Ar+qa/prsa8QXAQ32HGiVJmpqRd6NPcglwGrAuyV7g7cA24NIk5wNfBl7RNb8aeDmwG/gG8LoZ1CxJ0ugAq6pXDnnpJYu0LeCClRYlSdIo3olDktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktSkkX8HJmltm9961dht92w7c4aVSI/lHpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSYevdgGSZm9+61UTtd+z7cwZVSJNj3tgkqQmGWCSpCYZYJKkJnkOTFoFk5yT6j8f5bks6VEGmLQCyw0iSSvnIURJUpNWtAeWZA/wNeAR4OGq2pTkOOC/AvPAHuAVVfV3KytTkqTHmsYe2Iur6uSq2tQ93wpcW1UbgWu755IkTdUsDiFuBi7uHl8MnDWDMSRJa9xKA6yATya5OcmWbtr6qtrXPb4PWL/CMSRJepyVXoX4oqq6N8n3ANuT/EX/i1VVSWqxjl3gbQF41rOetcIyJElrzYr2wKrq3u77A8DlwCnA/UmOB+i+PzCk74VVtamqNs3Nza2kDEnSGrTsAEvylCRHLzwGXgrcAVwJnNc1Ow+4YqVFSpI0aCWHENcDlydZeJ8/rqpPJLkJuDTJ+cCXgVesvExJkh5r2QFWVX8JPHeR6X8DvGQlRUkHkrdnktrknTgkSU0ywCRJTTLAJElNMsAkSU0ywCRJTfL/gemQ4dWE0triHpgkqUkGmCSpSQaYJKlJngPTQWeSc1mex5LWLgNMM2MQSZolA2yNWO4Vel7ZJ+lg5TkwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpO8F2JjvEGuJPW4ByZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSl9GvEi+Hl6SVcQ9MktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KSZBViSlyX5YpLdSbbOahxJ0to0kwBLchjw+8AZwEnAK5OcNIuxJElr06xuJXUKsLuq/hIgyceAzcCdMxpvRSa5rRM8emun5faTJK3crAJsA3BP3/O9wPNnNNZ3eX9BSVo7UlXTf9PkZ4CXVdXPd8/PBZ5fVW/oa7MF2NI9/X7gi1Mv5FHrgL8+hPutxpjO4/T7rcaYzuP0+63GmC3N4zi+t6rmRraqqql/Af8YuKbv+VuBt85irDHr2XEo92upVufx4BrTeXQeD/Q8TvNrVlch3gRsTHJikn8AnANcOaOxJElr0EzOgVXVw0neAFwDHAZcVFW7ZjGWJGltmtk/tKyqq4GrZ/X+E7rwEO+3GmM6j9PvtxpjOo/T77caY7Y0j1Mzk4s4JEmaNW8lJUlq0iEVYEnmk9wxMO21Sd43Zv/PTmPMaVjqfac5ZpI/T7JpzLYTLZ9hdY47ZpJfTnJXko8OTN+TZN0ktSy31mn0W2p+F5ZpktOS/OkE4y76WST5cPdnLMuq9WAw5jIdtm6taB7717kkb5lWveOMd6D6Lufn3ErGm6WZnQNrUVX9+GrXcDBbheXzS8DpVbX3AI97wCx3mbquzswvAacDP38gx1vmOr6svitYdw667fGQ2gPrl+T7knwBmANO6H4L/lKSty/R5+t9j/91kpuS7EzyzhHDHZbkg0l2Jflkkicl+UdJPpXktiS3JHn2wFhv6252/OkklyR5S5If7drfBlwwyXwm+bEk/6sb65Ykj1tJFxuze+ncJLcmuSPJKWMun3+T5Pau3m2TLJtxxkzyAeD7gP+Z5M1d311J/hDIEjUutlx/ofssb0tyWZInj1vrBH37P4t/kuRj3W+rlwNPWqLP1/uePjXJVV39H0gydPtc6Jee93V9PgV8z7A+Q2p9fpLf6lvXXz+k/WLL9dlJPpHk5m7d+4Ex+y25bXQW+yzG3T4W6ztOrd9d54A3Ac9NckN6Pzd+YRnL9be79XtnkjcuNV63Pd3Q9f1sku8fMU5/37cl+aNue9yZ5KdH9F1Yd45Kcm33GdyeZPOY4/3bJBclubGrd2i/mVvtP0Sb5hcwD9xB784eXwCeC7wW2Ac8nd4PkjuATUP6f737/lJ6V9iEXsj/KXDqEmM+DJzcPb8U+Dng88DZ3bQjgSf39fkx4NZu+tHAl4C3ADsXxgF+C7hjgvl8MnBk9/pGBv7IcIkx/xz4YNfm1GFjDiyfM4DPLswTcNyEy2asMYE99P7a/73Ar3fTzgQKWLdI+2Hz+PS+Nu8G3jhBrUv2HfJZ/Ct6fzoC8MPd+45a504DvkXvh8RhwHbgZ8b4LH6qa3sY8AzgwWH9htS6Bfh33etHADuAE8dcrtcCG7s2zwf+bMx+Q7eNEZ/FyO1jib5L1rrIOvcO4DZ6PzPW0bs13jMmWK6/CPwJcPiIbWRhvKf2tT0duGyMn3cLff8D8J/6ph87ot/CunM48NTu8TpgN92FfSPG+w3g57ppxwD/G3jKqHpn8XUoHkKcA64Afqqq7kzyPGB7Vf0NQJKPAy+it6EO89Lu6wvd86PohcL1Q9rfXVW3do9vBk4ENlTV5QBV9a2B9i8EruimfyvJ/+imH1NVC2P8F3pBMe58Pg14X5KTgUeA54w5JsAlXZ3XJ3lqkmOq6sElxj4d+KOq+kbX72+XaDu4bOaXMeap9H5QU1VXJfm7Ie2GzeMPJXk3vY3tKHp/nzhureP0Hfws3kkvdKmqnUl2Dhlv0I316A2wL6G3nv7JiD6nApdU1SPAV5L82Yj2g7W+DfjhPHre7Gn01vW7+/ostlyPBH4c+G/Jd3eIjxgYa7F+T2LpbWPBYp/FuNvHYn1H1bqYK6rqm8A3k1xH7ybl/31I28Hl+uvAB6rqYRi5jUBvuV+cZCO9X9CeOEZ9C06nd7MIurGGbR+DAvxGklOB79C7h+164L4R/V4K/PM8egTnSOBZwF0T1DwVh2KAPQT8Fb2Nf+Hu94N/KzDqbwcC/GZV/cGYY3677/Ej9H7YzdrgfL4JuJ/eb39PoPfb/LgmXT6TGFw2C4fTZjnmoA8DZ1XVbUleS29vZzGL1TpO38XWueU4EMtksNbQ26scFurDPAF4sKpOnnJ9CwY/i+NX0Hc9y6t1ks9jpevAu4DrqursJPP0jlLM2qvpBe+PVtX/S7KHXhiNEuCnq2qW968dy6F4Duz/AmcDr0nyqm7aP01yXHrnX84CPjPiPa4B/mWSowCSbEgy1rmFzteAvUnO6vofkceeO/kM8JNJjuzG+Gfd9AeTvKh7/OoRYwzO59OAfVX1HeBceoeU+g0bE+BnuzpfBDxUVQ+NGHs78LqFeUpy3Ij2i5lkzOuBV3XtzwCOHdJu2DweDexL8kRGL9dB4/Qd/Cz66/0heocRx3FKerdfewK95fPpMfpcD/xsksOSHA+8eET7wVqvAX6xmz+SPCfJUwb6LLZcvwHcneRfdP2S5Llj9PsmS28bwzzIZNtHv6+OUetiNne1P53eLy43LdF2cLluB16f5PBuzFHbyNOAe7vHrx2jtn7b6TsnmGTY9rHYmA904fVi4HvH7HcN8MZ0u7PdUa5VcSgGGFX19/Q2ljfRO7Z8I3AZvWPol1XVUocPqapPAn8M3JDkdnqHcY6esIxzgV/uDh99FviHfe9/E717Q+6kd8L4dnq/wb0O+P0kt7LEhQp979M/n3uA89I7wf0DwN8PtB02JvQO73wB+ABw/hjjfqJ7rx1drWNdbjxgkjHfCZyaZBe9Q4l/NaSuYfP4NnrnXT4D/MWEdY7Vd+Cz+D/AUUnuAv49vcNY47gJeB+9QzF3A5eP0edyeueW7gQ+AtwwqsNArfd1fW9J71LwP2DgyMwSy/XVwPndOreL3v/8G6ff0G1jhIm2jwFL1jrETuA64HPAu6rqK0s1HliuX6G3nu7sxnzVUn2B/wj8ZrdNTHpk7N3AseldMHIbo3+JWfBRYFP3M+41jL9tvIveIc6d3Tb5rgnrnRrvxLFKkhxVVV/vfvu8HthSVbccamMeaGthHlfDcpern4dm6VA8B9aKC5OcRO+Y88UHaKNejTEPtLUwj6thucvVz0Mz4x6YJKlJh+Q5MEnSoc8AkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXp/wMuzXS3xlEXKwAAAABJRU5ErkJggg==\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
+}