Done 2018 challenge 4
authorNeil Smith <neil.git@njae.me.uk>
Thu, 1 Nov 2018 23:26:16 +0000 (23:26 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Thu, 1 Nov 2018 23:26:16 +0000 (23:26 +0000)
2018/2018-challenge4.ipynb [new file with mode: 0644]
2018/4a.ciphertext [new file with mode: 0644]
2018/4a.plaintext [new file with mode: 0644]
2018/4b.ciphertext [new file with mode: 0644]
2018/4b.plaintext [new file with mode: 0644]

diff --git a/2018/2018-challenge4.ipynb b/2018/2018-challenge4.ipynb
new file mode 100644 (file)
index 0000000..8aec6a1
--- /dev/null
@@ -0,0 +1,596 @@
+{
+ "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 support.text_prettify import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "WHE QLXE AYU IO WHE OYME. WHE VLYQK MXUEXM IU APTLN FYMPXU YU WHE IO-HPXUE MXUEXM PF QTIME YW OEA UQPWLYON CYTN. WHE HIUWPTC VPPKU (PT YW LEYUW, AIKIRENIY) WPLN ME WHYW IW HYN VEEO UEW XR VC IOUREQWPT OEYME YON RQ TYONYLL UPME WIME YFWET YRTIL 1875 YU Y AYC WP XUE WHE RTIUPOETU' RTPRETWC UWPTE WP IOUWTXQW OEA TEQTXIWU IO WHE YTW PF NEWEQWIPO. WHE OYME FITUW YRREYTU IO RXVLIQ IO YO YTWIQLE IO WHE PVUETZET OEAURYRET IO 1877, YON WHE HIUWPTIYOU UYC IW AYU QPIOEN YU Y GTIULC HEYNLIOE VC Y JPXTOYLIUW AHP AYU UOXVVEN VC OEYME, VXW I YM OPW UP UXTE. IW NINO'W UEEM YO YQQINEOW WHYW NPXGLYU VLYQK AYU LPPKIOG WP UEW XR Y WPR UEQTEW YTQHIZE IO LPONPO YW WHYW WIME, YON UQPWLYON CYTN GYZE HIM WHE RETFEQW LPQYWIPO. IW AYU QEOWTYL YON EYUC WP YQQEUU. IW HYN UEZETYL EOWTYOQEU, AIWH Y UWEYNC FLPA PF ZIUIWPTU, OPW YLL PF WHEM EOWITELC TERXWYVLE, WHYW APXLN NIUGXIUE WHE QPMIOGU YON GPIOGU PF WHE YGEOWU YON PFFIQETU PF VLYQK'U OEWAPTK. VEUW PF YLL IW HYN WHE EOWITE MEWTPRPLIWYO RPLIQE FPTQE UWYONIOG GXYTN, AHIQH AYU GTEYW FPT VLYQK, YON WPXGH PO ME. IW APXLN VE WHE INEYL LPQYWIPO FPT WHE UHYNPA YTQHIZE.\n",
+      "UQPWLYON CYTN HYN MPZEN WP OEA RTEMIUEU UEZETYL WIMEU UIOQE IW AYU FITUW UEW XR, VXW I AYU VEWWIOG WHYW WHE UHYNPA YTQHIZE HYN MPZEN AIWH IW, YON I UREOW WHE VEUW RYTW PF WHTEE AEEKU UQPXWIOG WHE OPTMYO UHYA VXILNIOGU YON WHE OEA \"OEA UQPWLYON CYTN\" OEBW NPPT YW WHE QXTWIU GTEEO VXILNIOG. IW IU OPW EYUC WP NP WHYW AIWHPXW VEIOG URPWWEN, HEOQE WHE OIGHW WIME TEQPOOYIUUYOQE IO WHE TYIO. WHE AYWET YON WHE QPLN RLYCEN HYZPQ AIWH MC MPPN, VXW YLUP AIWH MYOC NEWEQWPT UCUWEMU UP IW AYU APTWH WHE NIUQPMFPTW.\n",
+      "OP-POE AYU LIKELC WP GIZE ME WHE TEYL RLYOU PF WHE RLYQE, WHPXGH HYTTC AYU HYRRC WP RTPZINE ME AIWH Y QPRC PF WHE PFFIQIYL LYCPXW, YON I XUEN Y LINYT UCUWEM WP MYR YU MXQH PF WHE PXWUINE YU I QPXLN. QPMRYTIOG WHE WAP UHPXLN HYZE TEZEYLEN XOMYTKEN UWPTYGE YTEYU YON GIZEO ME UPME INEY HPA I MIGHW GEW IO, VXW OPWHIOG UHPAEN XR XOWIL I HYN Y LXQKC VTEYK. LIWETYLLC. I HYN LPAETEN WHE LINYT NEWEQWPT NPAO Y UHYFW PO WHE QXTWIU GTEEO TPPF, HPRIOG WP GEW Y GLIMRUE IOWP UPME PF WHE OEYTVC TPPMU. IW HYN JXUW YVPXW TEYQHEN GTPXON LEZEL AHEO WHE OCLPO LIOE UOYRREN. IW MYNE Y HELL PF Y TPA YU IW QLYWWETEN NPAO, YON I RTERYTEN WP TXO, VXW OP YLYTMU AEOW PFF YON, MPTE IMRPTWYOWLC, I OPWIQEN UPMEWHIOG UIGOIFIQYOW. IW HYN WYKEO YTPXON FIZE UEQPONU FPT WHE LINYT WP QTYUH NPAO, AHIQH, YW Y TPXGH EUWIMYWE, MEYOW IW HYN FYLLEO FTEE FPT YTPXON POE HXONTEN YON WAEOWC MEWTEU. WHYW APXLN HYZE WYKEO IW Y LPOG AYC XONETGTPXON, YON WHETE AETE OP VYUEMEOW TPPMU MYTKEN PO WHE RLYOU IO WHYW LPQYWIPO. I AYU RTEWWC UXTE I HYN FPXON WHE UHYNPA YTQHIZE: OPA I JXUW HYN WP FION Y AYC IO.\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "key_a, score_a = caesar_break(c4a)\n",
+    "print(caesar_decipher(c4a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "STO IRLO QEG MW STO WEKO. STO ZREIY KLGOLK MG QPNRD HEKPLG EG STO MW-TPLGO KLGOLK PH INMKO ES WOQ\n",
+      "GIPSREWD CEND. STO TMGSPNC ZPPYG (PN ES ROEGS, QMYMBODME) SPRD KO STES MS TED ZOOW GOS LB ZC\n",
+      "MWGBOISPN WOEKO EWD BI NEWDERR GPKO SMKO EHSON EBNMR 1875 EG E QEC SP LGO STO BNMGPWONG’ BNPBONSC\n",
+      "GSPNO SP MWGSNLIS WOQ NOINLMSG MW STO ENS PH DOSOISMPW. STO WEKO HMNGS EBBOENG MW BLZRMI MW EW\n",
+      "ENSMIRO MW STO PZGONXON WOQGBEBON MW 1877, EWD STO TMGSPNMEWG GEC MS QEG IPMWOD EG E ANMGRC TOEDRMWO\n",
+      "ZC E FPLNWERMGS QTP QEG GWLZZOD ZC WOEKO, ZLS M EK WPS GP GLNO. MS DMDW’S GOOK EW EIIMDOWS STES\n",
+      "DPLAREG ZREIY QEG RPPYMWA SP GOS LB E SPB GOINOS ENITMXO MW RPWDPW ES STES SMKO, EWD GIPSREWD CEND\n",
+      "AEXO TMK STO BONHOIS RPIESMPW. MS QEG IOWSNER EWD OEGC SP EIIOGG. MS TED GOXONER OWSNEWIOG, QMST E\n",
+      "GSOEDC HRPQ PH XMGMSPNG, WPS ERR PH STOK OWSMNORC NOBLSEZRO, STES QPLRD DMGALMGO STO IPKMWAG EWD\n",
+      "APMWAG PH STO EAOWSG EWD PHHMIONG PH ZREIY’G WOSQPNY. ZOGS PH ERR MS TED STO OWSMNO KOSNPBPRMSEW\n",
+      "BPRMIO HPNIO GSEWDMWA ALEND, QTMIT QEG ANOES HPN ZREIY, EWD SPLAT PW KO. MS QPLRD ZO STO MDOER\n",
+      "RPIESMPW HPN STO GTEDPQ ENITMXO. GIPSREWD CEND TED KPXOD SP WOQ BNOKMGOG GOXONER SMKOG GMWIO MS QEG\n",
+      "HMNGS GOS LB, ZLS M QEG ZOSSMWA STES STO GTEDPQ ENITMXO TED KPXOD QMST MS, EWD M GBOWS STO ZOGS BENS\n",
+      "PH STNOO QOOYG GIPLSMWA STO WPNKEW GTEQ ZLMRDMWAG EWD STO WOQ “WOQ GIPSREWD CEND” WOJS DPPN ES STO\n",
+      "ILNSMG ANOOW ZLMRDMWA. MS MG WPS OEGC SP DP STES QMSTPLS ZOMWA GBPSSOD, TOWIO STO WMATS SMKO\n",
+      "NOIPWWEMGGEWIO MW STO NEMW. STO QESON EWD STO IPRD BRECOD TEXPI QMST KC KPPD, ZLS ERGP QMST KEWC\n",
+      "DOSOISPN GCGSOKG GP MS QEG QPNST STO DMGIPKHPNS. WP-PWO QEG RMYORC SP AMXO KO STO NOER BREWG PH STO\n",
+      "BREIO, STPLAT TENNC QEG TEBBC SP BNPXMDO KO QMST E IPBC PH STO PHHMIMER RECPLS, EWD M LGOD E RMDEN\n",
+      "GCGSOK SP KEB EG KLIT PH STO PLSGMDO EG M IPLRD. IPKBENMWA STO SQP GTPLRD TEXO NOXOEROD LWKENYOD\n",
+      "GSPNEAO ENOEG EWD AMXOW KO GPKO MDOE TPQ M KMATS AOS MW, ZLS WPSTMWA GTPQOD LB LWSMR M TED E RLIYC\n",
+      "ZNOEY. RMSONERRC. M TED RPQONOD STO RMDEN DOSOISPN DPQW E GTEHS PW STO ILNSMG ANOOW NPPH, TPBMWA SP\n",
+      "AOS E ARMKBGO MWSP GPKO PH STO WOENZC NPPKG. MS TED FLGS EZPLS NOEITOD ANPLWD ROXOR QTOW STO WCRPW\n",
+      "RMWO GWEBBOD. MS KEDO E TORR PH E NPQ EG MS IRESSONOD DPQW, EWD M BNOBENOD SP NLW, ZLS WP ERENKG\n",
+      "QOWS PHH EWD, KPNO MKBPNSEWSRC, M WPSMIOD GPKOSTMWA GMAWMHMIEWS. MS TED SEYOW ENPLWD HMXO GOIPWDG\n",
+      "HPN STO RMDEN SP INEGT DPQW, QTMIT, ES E NPLAT OGSMKESO, KOEWS MS TED HERROW HNOO HPN ENPLWD PWO\n",
+      "TLWDNOD EWD SQOWSC KOSNOG. STES QPLRD TEXO SEYOW MS E RPWA QEC LWDONANPLWD, EWD STONO QONO WP\n",
+      "ZEGOKOWS NPPKG KENYOD PW STO BREWG MW STES RPIESMPW. M QEG BNOSSC GLNO M TED HPLWD STO GTEDPQ\n",
+      "ENITMXO: WPQ M FLGS TED SP HMWD E QEC MW.\n"
+     ]
+    }
+   ],
+   "source": [
+    "(m_a, s_a, o_a), score_a = affine_break(c4a)\n",
+    "print(lcat(tpack(affine_decipher(c4a, m_a, s_a, o_a).split())))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('retaliates', <KeywordWrapAlphabet.from_last: 2>, -2652.2981337278975)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a, wrap_a), score_a = keyword_break_mp(c4a)\n",
+    "key_a, wrap_a, score_a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "tha plua wes in tha nema. tha flepk musaum is world gemous es tha in-housa musaum og prima et naw\n",
+      "spotlend yerd. tha history fooks (or et laest, wikibadie) told ma thet it hed faan sat ub fy\n",
+      "insbaptor naema end bp rendell soma tima egtar ebril 1875 es e wey to usa tha brisonars’ brobarty\n",
+      "stora to instrupt naw rapruits in tha ert og dataption. tha nema girst ebbaers in buflip in en\n",
+      "ertipla in tha ofsarvar nawsbebar in 1877, end tha historiens sey it wes poinad es e crisly haedlina\n",
+      "fy e journelist who wes snuffad fy naema, fut i em not so sura. it didn’t saam en eppidant thet\n",
+      "doucles flepk wes lookinc to sat ub e tob saprat erphiva in london et thet tima, end spotlend yerd\n",
+      "ceva him tha bargapt lopetion. it wes pantrel end aesy to eppass. it hed savarel antrenpas, with e\n",
+      "staedy glow og visitors, not ell og tham antiraly rabutefla, thet would discuisa tha pomincs end\n",
+      "coincs og tha ecants end oggipars og flepk’s natwork. fast og ell it hed tha antira matroboliten\n",
+      "bolipa gorpa stendinc cuerd, whiph wes craet gor flepk, end touch on ma. it would fa tha idael\n",
+      "lopetion gor tha shedow erphiva. spotlend yerd hed movad to naw bramisas savarel timas sinpa it wes\n",
+      "girst sat ub, fut i wes fattinc thet tha shedow erphiva hed movad with it, end i sbant tha fast bert\n",
+      "og thraa waaks spoutinc tha normen shew fuildincs end tha naw “naw spotlend yerd” naxt door et tha\n",
+      "purtis craan fuildinc. it is not aesy to do thet without fainc sbottad, hanpa tha nicht tima\n",
+      "raponneissenpa in tha rein. tha wetar end tha pold bleyad hevop with my mood, fut elso with meny\n",
+      "dataptor systams so it wes worth tha dispomgort. no-ona wes likaly to civa ma tha rael blens og tha\n",
+      "blepa, thouch herry wes hebby to brovida ma with e poby og tha oggipiel leyout, end i usad e lider\n",
+      "systam to meb es muph og tha outsida es i pould. pomberinc tha two should heva ravaelad unmerkad\n",
+      "storeca eraes end civan ma soma idae how i micht cat in, fut nothinc showad ub until i hed e lupky\n",
+      "fraek. litarelly. i hed lowarad tha lider dataptor down e shegt on tha purtis craan roog, hobinc to\n",
+      "cat e climbsa into soma og tha naerfy rooms. it hed just efout raephad cround laval whan tha nylon\n",
+      "lina snebbad. it meda e hall og e row es it plettarad down, end i braberad to run, fut no elerms\n",
+      "want ogg end, mora imbortently, i notipad somathinc sicnigipent. it hed tekan eround giva saponds\n",
+      "gor tha lider to presh down, whiph, et e rouch astimeta, maent it hed gellan graa gor eround ona\n",
+      "hundrad end twanty matras. thet would heva tekan it e lonc wey undarcround, end thara wara no\n",
+      "fesamant rooms merkad on tha blens in thet lopetion. i wes bratty sura i hed gound tha shedow\n",
+      "erphiva: now i just hed to gind e wey in.\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(lcat(tpack(keyword_decipher(c4a, key_a, wrap_a).split())))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'retalisuvwxyzbcdfghjkmnopq'"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "kca = keyword_cipher_alphabet_of(key_a, wrap_a)\n",
+    "kca"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'lidarstuvwxyzbceqghjkmnopf'"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "cipher_alphabet, score = simulated_annealing_break(c4a, cipher_alphabet=kca, fitness=Pbigrams)\n",
+    "cipher_alphabet"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'the clue was in the name. the black museum is world famous as the in-house museum of crime at new scotland yard. the history books (or at least, wikipedia) told me that it had been set up by inspector neame and pc randall some time after april 1875 as a way to use the prisoners’ property store to instruct new recruits in the art of detection. the name first appears in public in an article in the observer newspaper in 1877, and the historians say it was coined as a grisly headline by a journalist who was snubbed by neame, but i am not so sure. it didn’t seem an accident that douglas black was looking to set up a top secret archive in london at that time, and scotland yard gave him the perfect location. it was central and easy to access. it had several entrances, with a steady flow of visitors, not all of them entirely reputable, that would disguise the comings and goings of the agents and officers of black’s network. best of all it had the entire metropolitan police force standing guard, which was great for black, and tough on me. it would be the ideal location for the shadow archive.\\nscotland yard had moved to new premises several times since it was first set up, but i was betting that the shadow archive had moved with it, and i spent the best part of three weeks scouting the norman shaw buildings and the new “new scotland yard” next door at the curtis green building. it is not easy to do that without being spotted, hence the night time reconnaissance in the rain. the water and the cold played havoc with my mood, but also with many detector systems so it was worth the discomfort.\\nno-one was likely to give me the real plans of the place, though harry was happy to provide me with a copy of the official layout, and i used a lidar system to map as much of the outside as i could. comparing the two should have revealed unmarked storage areas and given me some idea how i might get in, but nothing showed up until i had a lucky break. literally. i had lowered the lidar detector down a shaft on the curtis green roof, hoping to get a glimpse into some of the nearby rooms. it had just about reached ground level when the nylon line snapped. it made a hell of a row as it clattered down, and i prepared to run, but no alarms went off and, more importantly, i noticed something significant. it had taken around five seconds for the lidar to crash down, which, at a rough estimate, meant it had fallen free for around one hundred and twenty metres. that would have taken it a long way underground, and there were no basement rooms marked on the plans in that location. i was pretty sure i had found the shadow archive: now i just had to find a way in.\\n'"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# cipher_alphabet = 'cpearstubomykvliqghjdxnwzf'\n",
+    "cipher_translation = ''.maketrans(cipher_alphabet, string.ascii_lowercase)\n",
+    "plaintext = c4a.lower().translate(cipher_translation)\n",
+    "plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'lidarstuvwxyzbcefghjkmnopq'"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of('lidar', KeywordWrapAlphabet.from_last)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'the clue was in the name. the black museum is world famous as the in-house museum of crime at new scotland yard. the history books (or at least, wikipedia) told me that it had been set up by inspector neame and pc randall some time after april 1875 as a way to use the prisoners’ property store to instruct new recruits in the art of detection. the name first appears in public in an article in the observer newspaper in 1877, and the historians say it was coined as a grisly headline by a journalist who was snubbed by neame, but i am not so sure. it didn’t seem an accident that douglas black was looking to set up a top secret archive in london at that time, and scotland yard gave him the perfect location. it was central and easy to access. it had several entrances, with a steady flow of visitors, not all of them entirely reputable, that would disguise the comings and goings of the agents and officers of black’s network. best of all it had the entire metropolitan police force standing guard, which was great for black, and tough on me. it would be the ideal location for the shadow archive.\\nscotland yard had moved to new premises several times since it was first set up, but i was betting that the shadow archive had moved with it, and i spent the best part of three weeks scouting the norman shaw buildings and the new “new scotland yard” next door at the curtis green building. it is not easy to do that without being spotted, hence the night time reconnaissance in the rain. the water and the cold played havoc with my mood, but also with many detector systems so it was worth the discomfort.\\nno-one was likely to give me the real plans of the place, though harry was happy to provide me with a copy of the official layout, and i used a lidar system to map as much of the outside as i could. comparing the two should have revealed unmarked storage areas and given me some idea how i might get in, but nothing showed up until i had a lucky break. literally. i had lowered the lidar detector down a shaft on the curtis green roof, hoping to get a glimpse into some of the nearby rooms. it had just about reached ground level when the nylon line snapped. it made a hell of a row as it clattered down, and i prepared to run, but no alarms went off and, more importantly, i noticed something significant. it had taken around five seconds for the lidar to crash down, which, at a rough estimate, meant it had fallen free for around one hundred and twenty metres. that would have taken it a long way underground, and there were no basement rooms marked on the plans in that location. i was pretty sure i had found the shadow archive: now i just had to find a way in.\\n'"
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_decipher(c4a, 'lidar', KeywordWrapAlphabet.from_last)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_decipher(c4a, 'lidar', KeywordWrapAlphabet.from_last) == plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(3, 1, True)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "m_a, s_a, o_a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "2674"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open('4a.plaintext', 'w').write(keyword_decipher(c4a, 'lidar', KeywordWrapAlphabet.from_last))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "OHFRK DTYTR YWHUU HDUHR DFUTU NUHDD FTUFR DWRNA YMWSE UHDZF EYMUH DTNVU HDRMR DWYNM UHDNU UNLFM TFRDR DTUKD TTFMZ YMUHD MNRUH UHDUH RDDDL PDRNR TFRDF WRNAY MWUHR DFUUN NVRYM CKVDM ODUHD CNRDY WMNCC YODTD DLPFR FKETD ZCNOV TTDZD MUYRD KENMC NRLYM WFKKY FMODT FMZVM FSKDU NZDUD RLYMD UHDYR SDTUT URFUD WEYUH YMJUH DEFRD LYTUF JDMYM UHDYR NVUKN NJUHD ECNOV TUNNL VOHNM URDFU YDTFM ZMNUD MNVWH NMRDF KPNKY UYJFT XNMRN OHFVA RNUDU HDKFA NCPNA DRWNX DRMTU HDANR KZNCT UFUDT IVTUF TUHDK FANCW RFXYU EWNXD RMTUH DPHET YOFKA NRKZF MZADF RDPDR HFPTU NNLVO HYMOK YMDZU NNXDR KNNJU HDRDF KLYWH UNCUH DLNRD PNADR CVKFM ZUHDY MDXYU FSYKY UENCY UTPNK YUYOF KYMCK VDMOD NVRUF TJMNA YTMNU UNOHN NTDFC FXNVR DZPFR UMDRU NONMU RNKUH DNUHD RTUHF UAFER YTJTA FRFMF KKYFM ODAYK KDMON VRFWD FONVM UDRFK KYFMO DFMZF ZFMWD RNVTD TOFKF UYNMY MTUDF ZNVRT URFUD WETHN VKZSD UNLFY MUFYM FMFZL YUUDZ KEVMD FTEPD FODSD UADDM UHDDL PDRNR TUNWD UHDRU HDEFR DUHDS YWWDT UPNKY UYOFK UHRDF UUNNV RDLPY RDSVU FTDMD LYDTN CNMDF MNUHD RUHDE FKTNU HRDFU DMNVR URFZY MWRNV UDTAD MDDZU NYMZV ODUHD LUNAN RJUNW DUHDR AHYKD PRDXD MUYMW UHDLC RNLCN RLYMW FPNAD RSKNO FWFYM TUNVR YMUDR DTUNV RLNTU YLPNR UFMUA DFPNM YMUHY TYTON MCVTY NMFMZ LYKZZ YTURV TUUHD SDTUN VUONL DANVK ZSDUN DMONV RFWDF ZETCV MOUYN MFKFK KYFMO DSDUA DDMFK KUHRD DUHFU LFJDT YUHFR ZCNRU HDDLP DRNRT UNCYW HUNMD FMNUH DRNRV TFMZY MUHDN UUNLF MORYT YTYUH YMJYT DMTDF MNPPN RUVMY UEUNZ NIVTU UHFU\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "key_b, score_b = caesar_break(c4b)\n",
+    "print(caesar_decipher(c4b, key_b))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "tewsdoahashzerreoresowrarcreoowarwsozscphlzjfreoywfhlreoacireoslsozhclreocrrcuwlawsosoardoaawlyhlreolcsrereoresoooukoscsawsowzscphlzresowrrccishlxdioltoreoxcsohzlcxxhtoaooukwswdfaoyxctiaaoyolrhsodfclxcsuhlzwddhwltoawlyilwjdorcyorosuhloreohsjoararswrozfhrehlmreofwsouharwmolhlreohscirdccmreofxctiarccuiteclrsowrhoawlylcrolcizeclsowdkcdhrhmwaqclsctewipscroreodwpcxkcposzcqoslareopcsdycxarwroaviarwareodwpcxzswqhrfzcqoslareokefahtwdpcsdywlypowsokosewkarccuitehltdhloyrccqosdccmreosowduhzercxreoucsokcposxidwlyreohloqhrwjhdhrfcxhrakcdhrhtwdhlxdioltocisrwamlcphalcrrcteccaowxwqcisoykwsrlosrctclrscdreocreosarewrpwfshamapwswlwddhwltophddoltciswzowtcilroswddhwltowlywywlzosciaoatwdwrhclhlarowycisarswrozfaecidyjorcuwhlrwhlwlwyuhrroydfilowafkowtojorpoolreooukoscsarczoreosreofwsoreojhzzoarkcdhrhtwdresowrrccisoukhsojirwaolouhoacxclowlcreosreofwdacresowrolcisrswyhlzsciroapolooyrchlyitoreourcpcsmrczoreospehdoksoqolrhlzreouxscuxcsuhlzwkcposjdctwzwhlarcishlrosoarcisucarhukcsrwlrpowkclhlrehahatclxiahclwlyuhdyyharsiarreojoarcirtcuopcidyjorcoltciswzowyfaxiltrhclwdwddhwltojorpoolwddresoorewruwmoahrewsyxcsreooukoscsarcxhzerclowlcreoscsiawlyhlreocrrcuwltshahahrehlmhaolaowlckkcsrilhrfrcycviarrewr\n"
+     ]
+    }
+   ],
+   "source": [
+    "(m_b, s_b, o_b), score_b = affine_break(c4b)\n",
+    "print(lcat(tpack(affine_decipher(sanitise(c4b), m_b, s_b, o_b).split())))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('polarimeter', <KeywordWrapAlphabet.from_last: 2>, -1501.4114029890893)"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_b, wrap_b), score_b = keyword_break_mp(sanitise(c4b))\n",
+    "key_b, wrap_b, score_b"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'dierlaswsrwfittiatiraetstotiaaesterafrogwnfhytiaceywntiasoutiarnrafwontiaottomenserarastlassencwntianortitiatiraaamparorseraefrogwnftiraettoourwnbluandatiaborawfnobbwdasaamperelysacbodussacantwralyonbormwnfellwendasencunehlatocatarmwnatiawrhaststretafywtiwnktiayeramwstekanwntiawroutlooktiaybodustoomudiontraetwasencnotanoufionraelpolwtwkesvonrodieugrotatialegobpogarfovarnstiagorlcobstetasjustestialegobfrevwtyfovarnstiapiyswdelgorlcencgaerapariepstoomudiwndlwnactoovarlooktiaraelmwfitobtiamorapogarbulenctiawnavwtehwlwtyobwtspolwtwdelwnbluandaourtesknogwsnottodioosaebevouracpertnartodontroltiaotiarstietgeyrwsksgerenellwendagwllandourefaedountarellwendaencecenfarousasdeletwonwnstaecourstretafysioulchatomewntewnenecmwttaclyunaesypaedahatgaantiaamparorstofatiartiayeratiahwffastpolwtwdeltiraettoourampwrahutesanamwasobonaenotiartiayelsotiraetanourtrecwnfroutasganaactowncudatiamtogorktofatiargiwlapravantwnftiambrombormwnfepogarhlodefewnstourwntarastourmostwmportentgaeponwntiwswsdonbuswonencmwlccwstrusttiahastoutdomagoulchatoandourefaecysbundtwonelellwendahatgaanelltiraatietmekaswtiercbortiaamparorstobwfitonaenotiarorusencwntiaottomendrwswswtiwnkwsansaenopportunwtytocojusttiet'"
+      ]
+     },
+     "execution_count": 33,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_decipher(sanitise(c4b), key_b, wrap_b)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 43,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'realpoitkuvwxyzbndfghjmsqc'"
+      ]
+     },
+     "execution_count": 43,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "cipher_alphabet, score = simulated_annealing_break(c4b, fitness=Pbigrams)\n",
+    "cipher_alphabet"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'realpoitkuvwxyzbcdfghjmnqs'"
+      ]
+     },
+     "execution_count": 47,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of('realpolitik', KeywordWrapAlphabet.from_largest)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 44,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'charl esisr ightt hethr eatst othee astar egrow ingby theda yinth esout hernr egion theot toman sarer estle ssand inthe north theth reeem peror sarea growi ngthr eatto ourin fluen cethe forei gnoff icese empar alyse dfocu ssede ntire lyonf ormin galli ances andun ablet odete rmine their bests trate gyith inkth eyare mista kenin their outlo okthe yfocu stoom uchon treat iesan dnote nough onrea lpoli tikas vonro chauw rotet helaw ofpow ergov ernst hewor ldofs tates justa sthel awofg ravit ygove rnsth ephys icalw orlda ndwea reper hapst oomuc hincl inedt oover lookt herea lmigh tofth emore power fulan dthei nevit abili tyofi tspol itica linfl uence ourta sknow isnot tocho oseaf avour edpar tnert ocont rolth eothe rstha twayr isksw arana llian cewil lenco urage acoun teral lianc eanda dange rouse scala tioni nstea dours trate gysho uldbe tomai ntain anadm itted lyune asype acebe tween theem peror stoge thert heyar etheb igges tpoli tical threa ttoou rempi rebut asene mieso fonea nothe rthey alsot hreat enour tradi ngrou teswe needt oindu cethe mtowo rktog ether while preve nting themf romfo rming apowe rbloc again stour inter estou rmost impor tantw eapon inthi sisco nfusi onand mildd istru stthe besto utcom ewoul dbeto encou ragea dysfu nctio nalal lianc ebetw eenal lthre ethat makes ithar dfort heemp erors tofig htone anoth eroru sandi ntheo ttoma ncris isith inkis ensea noppo rtuni tytod ojust that\\n'"
+      ]
+     },
+     "execution_count": 44,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# cipher_alphabet = 'cpearstubomykvliqghjdxnwzf'\n",
+    "cipher_translation = ''.maketrans(cipher_alphabet, string.ascii_lowercase)\n",
+    "plaintext = c4b.lower().translate(cipher_translation)\n",
+    "plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'charlesisrightthethreatstotheeastaregrowingbythedayinthesouthernregiontheottomansarerestlessandinthenorththethreeemperorsareagrowingthreattoourinfluencetheforeignofficeseemparalysedfocussedentirelyonformingalliancesandunabletodeterminetheirbeststrategyithinktheyaremistakenintheiroutlooktheyfocustoomuchontreatiesandnotenoughonrealpolitikasvonrochauwrotethelawofpowergovernstheworldofstatesjustasthelawofgravitygovernsthephysicalworldandweareperhapstoomuchinclinedtooverlooktherealmightofthemorepowerfulandtheinevitabilityofitspoliticalinfluenceourtasknowisnottochooseafavouredpartnertocontroltheothersthatwayriskswaranalliancewillencourageacounterallianceandadangerousescalationinsteadourstrategyshouldbetomaintainanadmittedlyuneasypeacebetweentheemperorstogethertheyarethebiggestpoliticalthreattoourempirebutasenemiesofoneanothertheyalsothreatenourtradingroutesweneedtoinducethemtoworktogetherwhilepreventingthemfromformingapowerblocagainstourinterestourmostimportantweaponinthisisconfusionandmilddistrustthebestoutcomewouldbetoencourageadysfunctionalalliancebetweenallthreethatmakesithardfortheemperorstofightoneanotherorusandintheottomancrisisithinkisenseanopportunitytodojustthat'"
+      ]
+     },
+     "execution_count": 49,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_decipher(sanitise(c4b), 'realpolitik', KeywordWrapAlphabet.from_largest)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 52,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_decipher(sanitise(c4b), 'realpolitik', KeywordWrapAlphabet.from_largest) == sanitise(plaintext)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charles is right the threats to the east are growing by the day in the southern region the ottomans\n",
+      "are restless and in the north the three emperors area growing threat to our influence the foreign\n",
+      "office seem paralysed focussed entirely on forming alliances and unable to determine their best\n",
+      "strategy i think they are mistaken in their outlook they focus too much on treaties and not enough\n",
+      "on realpolitik as von rocha u wrote the law of power governs the world of states just as the law of\n",
+      "gravity governs the physical world and we are perhaps too much inclined to overlook the real might\n",
+      "of the more powerful and the inevitability of its political influence our task now is not to choose\n",
+      "a favoured partner to control the others that way risks war an alliance will encourage a counter\n",
+      "alliance and a dangerous escalation instead our strategy should be to maintain an admittedly uneasy\n",
+      "peace between the emperors together they are the biggest political threat to our empire but as\n",
+      "enemies of one another they also threaten our trading routes we need to induce them to work together\n",
+      "while preventing them from forming a power bloc against our interest our most important weapon in\n",
+      "this is confusion and mild distrust the best outcome would be to encourage a dysfunctional alliance\n",
+      "between all three that makes it hard for the emperors to fight one another or us and in the ottoman\n",
+      "crisis i think i sense an opportunity to do just that\n"
+     ]
+    }
+   ],
+   "source": [
+    "kpt = keyword_decipher(sanitise(c4b), 'realpolitik', KeywordWrapAlphabet.from_largest)\n",
+    "print(lcat(tpack(segment(sanitise(kpt)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 58,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1436"
+      ]
+     },
+     "execution_count": 58,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open('4b.plaintext', 'w').write(lcat(tpack(segment(kpt))))"
+   ]
+  },
+  {
+   "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.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/2018/4a.ciphertext b/2018/4a.ciphertext
new file mode 100644 (file)
index 0000000..9b3db5a
--- /dev/null
@@ -0,0 +1,3 @@
+JUR DYKR NLH VB JUR BLZR. JUR IYLDX ZKHRKZ VH NCGYA SLZCKH LH JUR VB-UCKHR ZKHRKZ CS DGVZR LJ BRN HDCJYLBA PLGA. JUR UVHJCGP ICCXH (CG LJ YRLHJ, NVXVERAVL) JCYA ZR JULJ VJ ULA IRRB HRJ KE IP VBHERDJCG BRLZR LBA ED GLBALYY HCZR JVZR LSJRG LEGVY 1875 LH L NLP JC KHR JUR EGVHCBRGH’ EGCERGJP HJCGR JC VBHJGKDJ BRN GRDGKVJH VB JUR LGJ CS ARJRDJVCB. JUR BLZR SVGHJ LEERLGH VB EKIYVD VB LB LGJVDYR VB JUR CIHRGMRG BRNHELERG VB 1877, LBA JUR UVHJCGVLBH HLP VJ NLH DCVBRA LH L TGVHYP URLAYVBR IP L WCKGBLYVHJ NUC NLH HBKIIRA IP BRLZR, IKJ V LZ BCJ HC HKGR. VJ AVAB’J HRRZ LB LDDVARBJ JULJ ACKTYLH IYLDX NLH YCCXVBT JC HRJ KE L JCE HRDGRJ LGDUVMR VB YCBACB LJ JULJ JVZR, LBA HDCJYLBA PLGA TLMR UVZ JUR ERGSRDJ YCDLJVCB. VJ NLH DRBJGLY LBA RLHP JC LDDRHH. VJ ULA HRMRGLY RBJGLBDRH, NVJU L HJRLAP SYCN CS MVHVJCGH, BCJ LYY CS JURZ RBJVGRYP GREKJLIYR, JULJ NCKYA AVHTKVHR JUR DCZVBTH LBA TCVBTH CS JUR LTRBJH LBA CSSVDRGH CS IYLDX’H BRJNCGX. IRHJ CS LYY VJ ULA JUR RBJVGR ZRJGCECYVJLB ECYVDR SCGDR HJLBAVBT TKLGA, NUVDU NLH TGRLJ SCG IYLDX, LBA JCKTU CB ZR. VJ NCKYA IR JUR VARLY YCDLJVCB SCG JUR HULACN LGDUVMR.
+HDCJYLBA PLGA ULA ZCMRA JC BRN EGRZVHRH HRMRGLY JVZRH HVBDR VJ NLH SVGHJ HRJ KE, IKJ V NLH IRJJVBT JULJ JUR HULACN LGDUVMR ULA ZCMRA NVJU VJ, LBA V HERBJ JUR IRHJ ELGJ CS JUGRR NRRXH HDCKJVBT JUR BCGZLB HULN IKVYAVBTH LBA JUR BRN “BRN HDCJYLBA PLGA” BROJ ACCG LJ JUR DKGJVH TGRRB IKVYAVBT. VJ VH BCJ RLHP JC AC JULJ NVJUCKJ IRVBT HECJJRA, URBDR JUR BVTUJ JVZR GRDCBBLVHHLBDR VB JUR GLVB. JUR NLJRG LBA JUR DCYA EYLPRA ULMCD NVJU ZP ZCCA, IKJ LYHC NVJU ZLBP ARJRDJCG HPHJRZH HC VJ NLH NCGJU JUR AVHDCZSCGJ.
+BC-CBR NLH YVXRYP JC TVMR ZR JUR GRLY EYLBH CS JUR EYLDR, JUCKTU ULGGP NLH ULEEP JC EGCMVAR ZR NVJU L DCEP CS JUR CSSVDVLY YLPCKJ, LBA V KHRA L YVALG HPHJRZ JC ZLE LH ZKDU CS JUR CKJHVAR LH V DCKYA. DCZELGVBT JUR JNC HUCKYA ULMR GRMRLYRA KBZLGXRA HJCGLTR LGRLH LBA TVMRB ZR HCZR VARL UCN V ZVTUJ TRJ VB, IKJ BCJUVBT HUCNRA KE KBJVY V ULA L YKDXP IGRLX. YVJRGLYYP. V ULA YCNRGRA JUR YVALG ARJRDJCG ACNB L HULSJ CB JUR DKGJVH TGRRB GCCS, UCEVBT JC TRJ L TYVZEHR VBJC HCZR CS JUR BRLGIP GCCZH. VJ ULA WKHJ LICKJ GRLDURA TGCKBA YRMRY NURB JUR BPYCB YVBR HBLEERA. VJ ZLAR L URYY CS L GCN LH VJ DYLJJRGRA ACNB, LBA V EGRELGRA JC GKB, IKJ BC LYLGZH NRBJ CSS LBA, ZCGR VZECGJLBJYP, V BCJVDRA HCZRJUVBT HVTBVSVDLBJ. VJ ULA JLXRB LGCKBA SVMR HRDCBAH SCG JUR YVALG JC DGLHU ACNB, NUVDU, LJ L GCKTU RHJVZLJR, ZRLBJ VJ ULA SLYYRB SGRR SCG LGCKBA CBR UKBAGRA LBA JNRBJP ZRJGRH. JULJ NCKYA ULMR JLXRB VJ L YCBT NLP KBARGTGCKBA, LBA JURGR NRGR BC ILHRZRBJ GCCZH ZLGXRA CB JUR EYLBH VB JULJ YCDLJVCB. V NLH EGRJJP HKGR V ULA SCKBA JUR HULACN LGDUVMR: BCN V WKHJ ULA JC SVBA L NLP VB.
diff --git a/2018/4a.plaintext b/2018/4a.plaintext
new file mode 100644 (file)
index 0000000..c4b80e0
--- /dev/null
@@ -0,0 +1,3 @@
+the clue was in the name. the black museum is world famous as the in-house museum of crime at new scotland yard. the history books (or at least, wikipedia) told me that it had been set up by inspector neame and pc randall some time after april 1875 as a way to use the prisoners’ property store to instruct new recruits in the art of detection. the name first appears in public in an article in the observer newspaper in 1877, and the historians say it was coined as a grisly headline by a journalist who was snubbed by neame, but i am not so sure. it didn’t seem an accident that douglas black was looking to set up a top secret archive in london at that time, and scotland yard gave him the perfect location. it was central and easy to access. it had several entrances, with a steady flow of visitors, not all of them entirely reputable, that would disguise the comings and goings of the agents and officers of black’s network. best of all it had the entire metropolitan police force standing guard, which was great for black, and tough on me. it would be the ideal location for the shadow archive.
+scotland yard had moved to new premises several times since it was first set up, but i was betting that the shadow archive had moved with it, and i spent the best part of three weeks scouting the norman shaw buildings and the new “new scotland yard” next door at the curtis green building. it is not easy to do that without being spotted, hence the night time reconnaissance in the rain. the water and the cold played havoc with my mood, but also with many detector systems so it was worth the discomfort.
+no-one was likely to give me the real plans of the place, though harry was happy to provide me with a copy of the official layout, and i used a lidar system to map as much of the outside as i could. comparing the two should have revealed unmarked storage areas and given me some idea how i might get in, but nothing showed up until i had a lucky break. literally. i had lowered the lidar detector down a shaft on the curtis green roof, hoping to get a glimpse into some of the nearby rooms. it had just about reached ground level when the nylon line snapped. it made a hell of a row as it clattered down, and i prepared to run, but no alarms went off and, more importantly, i noticed something significant. it had taken around five seconds for the lidar to crash down, which, at a rough estimate, meant it had fallen free for around one hundred and twenty metres. that would have taken it a long way underground, and there were no basement rooms marked on the plans in that location. i was pretty sure i had found the shadow archive: now i just had to find a way in.
diff --git a/2018/4b.ciphertext b/2018/4b.ciphertext
new file mode 100644 (file)
index 0000000..2f76280
--- /dev/null
@@ -0,0 +1 @@
+ATRDW PFKFD KITGG TPGTD PRGFG ZGTPP RFGRD PIDZM KYIEQ GTPLR QKYGT PFZHG TPDYD PIKZY GTPZG GZXRY FRDPD PFGWP FFRYL KYGTP YZDGT GTPGT DPPPX BPDZD FRDPR IDZMK YIGTD PRGGZ ZHDKY OWHPY APGTP OZDPK IYZOO KAPFP PXBRD RWQFP LOZAH FFPLP YGKDP WQZYO ZDXKY IRWWK RYAPF RYLHY REWPG ZLPGP DXKYP GTPKD EPFGF GDRGP IQKGT KYVGT PQRDP XKFGR VPYKY GTPKD ZHGWZ ZVGTP QOZAH FGZZX HATZY GDPRG KPFRY LYZGP YZHIT ZYDPR WBZWK GKVRF JZYDZ ATRHM DZGPG TPWRM ZOBZM PDIZJ PDYFG TPMZD WLZOF GRGPF UHFGR FGTPW RMZOI DRJKG QIZJP DYFGT PBTQF KARWM ZDWLR YLMPR DPBPD TRBFG ZZXHA TKYAW KYPLG ZZJPD WZZVG TPDPR WXKIT GZOGT PXZDP BZMPD OHWRY LGTPK YPJKG REKWK GQZOK GFBZW KGKAR WKYOW HPYAP ZHDGR FVYZM KFYZG GZATZ ZFPRO RJZHD PLBRD GYPDG ZAZYG DZWGT PZGTP DFGTR GMRQD KFVFM RDRYR WWKRY APMKW WPYAZ HDRIP RAZHY GPDRW WKRYA PRYLR LRYIP DZHFP FARWR GKZYK YFGPR LZHDF GDRGP IQFTZ HWLEP GZXRK YGRKY RYRLX KGGPL WQHYP RFQBP RAPEP GMPPY GTPPX BPDZD FGZIP GTPDG TPQRD PGTPE KIIPF GBZWK GKARW GTDPR GGZZH DPXBK DPEHG RFPYP XKPFZ OZYPR YZGTP DGTPQ RWFZG TDPRG PYZHD GDRLK YIDZH GPFMP YPPLG ZKYLH APGTP XGZMZ DVGZI PGTPD MTKWP BDPJP YGKYI GTPXO DZXOZ DXKYI RBZMP DEWZA RIRKY FGZHD KYGPD PFGZH DXZFG KXBZD GRYGM PRBZY KYGTK FKFAZ YOHFK ZYRYL XKWLL KFGDH FGGTP EPFGZ HGAZX PMZHW LEPGZ PYAZH DRIPR LQFOH YAGKZ YRWRW WKRYA PEPGM PPYRW WGTDP PGTRG XRVPF KGTRD LOZDG TPPXB PDZDF GZOKI TGZYP RYZGT PDZDH FRYLK YGTPZ GGZXR YADKF KFKGT KYVKF PYFPR YZBBZ DGHYK GQGZL ZUHFG GTRG
diff --git a/2018/4b.plaintext b/2018/4b.plaintext
new file mode 100644 (file)
index 0000000..99e1c4a
--- /dev/null
@@ -0,0 +1,15 @@
+charles is right the threats to the east are growing by the day in the southern region the ottomans
+are restless and in the north the three emperors area growing threat to our influence the foreign
+office seem paralysed focussed entirely on forming alliances and unable to determine their best
+strategy i think they are mistaken in their outlook they focus too much on treaties and not enough
+on realpolitik as von rocha u wrote the law of power governs the world of states just as the law of
+gravity governs the physical world and we are perhaps too much inclined to overlook the real might
+of the more powerful and the inevitability of its political influence our task now is not to choose
+a favoured partner to control the others that way risks war an alliance will encourage a counter
+alliance and a dangerous escalation instead our strategy should be to maintain an admittedly uneasy
+peace between the emperors together they are the biggest political threat to our empire but as
+enemies of one another they also threaten our trading routes we need to induce them to work together
+while preventing them from forming a power bloc against our interest our most important weapon in
+this is confusion and mild distrust the best outcome would be to encourage a dysfunctional alliance
+between all three that makes it hard for the emperors to fight one another or us and in the ottoman
+crisis i think i sense an opportunity to do just that
\ No newline at end of file