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

diff --git a/2017/2017-challenge4.ipynb b/2017/2017-challenge4.ipynb
new file mode 100644 (file)
index 0000000..635f451
--- /dev/null
@@ -0,0 +1,554 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect, collections\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) \n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "ca = open('4a.ciphertext').read()\n",
+    "cb = open('4b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "UGXXV,\n",
+      "\n",
+      "BGXVGB THQQRTKRF N QRK NY KCHZU GT PR YRRF G ZCHXNRX GYF TUR KUCHQUK VCH BNQUK AR NYKRXRTKRF NY SCNYNYQ HT. URX TCHXZRT UGOR ZCYENXBRF KUGK KUR ACCL NT ARNYQ UHYKRF AV GY NIIRQGI EHYFXGNTNYQ QXCHM YGBRF BNFGT PUNZU UGT ARRY GTTCZNGKRF PNKU TRORXGI KRXXCX YRKPCXLT NY KUR IGTK ERP VRGXT. BGXVGB UGT KXGORIIRF KC NTKGYAHI ECIICPNYQ G IRGF CY KUR AHVRX NY KUR UCMR PR ZGY TZGXR KURB CEE, AHK NE KUGK FCRTY’K PCXL KURY PR PNII YRRF KC ENYF KUR XRTK CE KUR ACCL ZUGMKRXT ARECXR BNFGT FC. PR GXR ACKU UCMNYQ VCHX FNGXV NT ZIRGX, ARZGHTR NE N GB XNQUK PR PNII UGOR GYCKURX KUXRR MIGZRT KC ONTNK GEKRX KUNT CYR, GYF N GB YCK THXR UCP ICYQ NK PNII KGLR.\n",
+      "\n",
+      "N ENYNTURF BV PCXL CY KUR KUNXF ZUGMKRX CE KGZNKHT’T BCYCQXGMU PUNZU N ECHYF CY XUCFRT. NK PGT ZCYZRGIRF NY G IGXQR TKCYR INYKRI ARGXNYQ GY NBGQR CE G XCTR, KUR TVBACI CE KUR ZCYTCXK CE KUR THY QCF URINCT. NYKXNQHNYQIV XUCFRT NT GITC LYCPY GT KUR NTIGYF CE KUR LYNQUKT, YGBRF GEKRX KUR LYNQUKT CE TGNYK SCUY CE SRXHTGIRB, GYF KUR ZIHR GK KUR RYF CE ZUGMKRX KUXRR MCNYKRF KC GYCKURX UCBR CE KUR LYNQUKT GK ACFXHB, TC N KXGORIIRF KURXR GYF PGT YCK KCC THXMXNTRF KC ENYF ZUGMKRX ECHX ZCYZRGIRF NY KUR XRBGNYT CE KURNX ECXK. N PGT UCPRORX GTKCYNTURF AV KUR KRJK! NK KCCL BR G PUNIR KC ZXGZL NK GT N FNFY'K XRZCQYNTR KUR RYZXVMKNCY GT GYVKUNYQ ZIGTTNZGI. PURY N ENYGIIV AXCLR NK N FNTZCORXRF KUGK KGZNKHT UGF HTRF G ZNMURX KUGK PR KUCHQUK UGF ARRY NYORYKRF NY TNJKRRYKU ZRYKHXV EXGYZR. NK TRRBT KUGK KUR NBMRXNGI ZNMURX TZUCCI PRXR BHZU BCXR GFOGYZRF KUGY PR UGF GYV XRGTCY KC RJMRZK. NE ZCHXNRX FHKV NTY'K RJZNKNYQ RYCHQU ECX VCH MRXUGMT KUR ZUGYZR KC FNTZCORX BCXR NBMRXNGI ZNMURXT PNII AR?\n",
+      "\n",
+      "KUR ZIHR GK KUR RYF CE KUNT ZUGMKRX NT ORXV THQQRTKNOR, GYF N UGOR ACHQUK G KNZLRK KC TRIZHL KC NYORTKNQGKR. N GB MXRKKV THXR N PGT ECIICPRF KC KUR KNZLRK CEENZR.\n",
+      "\n",
+      "NE VCH ZGY ZCBR KURY PR YRRF VCH KC FXCM AV KUR AXNKNTU BHTRHB ARECXR VCH ZCBR CHK. N KUNYL KURXR NT TCBRKUNYQ KURXR KUGK PR YRRF GYF PNII TRYF G BRTTGQR KC BV ZCYKGZK NY XCCB KPRYKV KPC KRIINYQ KURB KC RJMRZK VCH GYF AXNRENYQ KURB CY PUGK KC ICCL CHK ECX. NK PCHIF AR QCCF NE VCH ZCHIF AR ORXV FNTZXRRK GACHK KUGK, AHK BGLR GT BHZU EHTT GT VCH INLR GACHK BRRKNYQ BR NY TRIZHL. N PNII RJMIGNY IGKRX!\n",
+      "\n",
+      "GII KUR ARTK,\n",
+      "\n",
+      "SCFNR\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(ca)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('comportment', <KeywordWrapAlphabet.from_largest: 3>), -2417.7329224996606)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ka, score = keyword_break_mp(ca)\n",
+    "ka, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "isllj,\n",
+      "\n",
+      "psljsp ftyyefwer h yew hm watni sf de meer s natlhel smr fie wiatyiw jat phyiw oe hmwelefwer hm zahmhmy tf. iel fatlnef isbe namghlper wisw wie oaax hf oehmy itmwer oj sm huueysu gtmrlshfhmy ylatc msper phrsf dihni isf oeem sffanhswer dhwi febelsu wellal mewdalxf hm wie usfw ged jeslf. psljsp isf wlsbeuuer wa hfwsmotu gauuadhmy s uesr am wie otjel hm wie iace de nsm fnsle wiep agg, otw hg wisw raefm’w dalx wiem de dhuu meer wa ghmr wie lefw ag wie oaax niscwelf oegale phrsf ra. de sle oawi iachmy jatl rhslj hf nuesl, oenstfe hg h sp lhyiw de dhuu isbe smawiel wilee cusnef wa bhfhw sgwel wihf ame, smr h sp maw ftle iad uamy hw dhuu wsxe.\n",
+      "\n",
+      "h ghmhfier pj dalx am wie wihlr niscwel ag wsnhwtf’f pamaylsci dihni h gatmr am liaref. hw dsf namnesuer hm s uslye fwame uhmweu oeslhmy sm hpsye ag s lafe, wie fjpoau ag wie namfalw ag wie ftm yar ieuhaf. hmwlhythmyuj liaref hf sufa xmadm sf wie hfusmr ag wie xmhyiwf, msper sgwel wie xmhyiwf ag fshmw zaim ag zeltfsuep, smr wie nute sw wie emr ag niscwel wilee cahmwer wa smawiel iape ag wie xmhyiwf sw oarltp, fa h wlsbeuuer wiele smr dsf maw waa ftlclhfer wa ghmr niscwel gatl namnesuer hm wie lepshmf ag wiehl galw. h dsf iadebel sfwamhfier oj wie wevw! hw waax pe s dihue wa nlsnx hw sf h rhrm'w lenaymhfe wie emnljcwham sf smjwihmy nusffhnsu. diem h ghmsuuj olaxe hw h rhfnabeler wisw wsnhwtf isr tfer s nhciel wisw de wiatyiw isr oeem hmbemwer hm fhvweemwi nemwtlj glsmne. hw feepf wisw wie hpcelhsu nhciel fniaau dele ptni pale srbsmner wism de isr smj lesfam wa evcenw. hg natlhel rtwj hfm'w evnhwhmy ematyi gal jat celiscf wie nismne wa rhfnabel pale hpcelhsu nhcielf dhuu oe?\n",
+      "\n",
+      "wie nute sw wie emr ag wihf niscwel hf belj ftyyefwhbe, smr h isbe oatyiw s whnxew wa feuntx wa hmbefwhyswe. h sp clewwj ftle h dsf gauuader wa wie whnxew agghne.\n",
+      "\n",
+      "hg jat nsm nape wiem de meer jat wa rlac oj wie olhwhfi ptfetp oegale jat nape atw. h wihmx wiele hf fapewihmy wiele wisw de meer smr dhuu femr s peffsye wa pj namwsnw hm laap wdemwj wda weuuhmy wiep wa evcenw jat smr olheghmy wiep am disw wa uaax atw gal. hw datur oe yaar hg jat natur oe belj rhfnleew soatw wisw, otw psxe sf ptni gtff sf jat uhxe soatw peewhmy pe hm feuntx. h dhuu evcushm uswel!\n",
+      "\n",
+      "suu wie oefw,\n",
+      "\n",
+      "zarhe\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(ca, ka[0], ka[1]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 121,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "2163"
+      ]
+     },
+     "execution_count": 121,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open('4a.plaintext', 'w').write(affine_decipher(ca, m_a, a_a, o_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Counter({'a': 30,\n",
+       "         'b': 43,\n",
+       "         'c': 140,\n",
+       "         'e': 42,\n",
+       "         'f': 65,\n",
+       "         'g': 125,\n",
+       "         'h': 57,\n",
+       "         'i': 63,\n",
+       "         'j': 6,\n",
+       "         'k': 177,\n",
+       "         'l': 21,\n",
+       "         'm': 25,\n",
+       "         'n': 136,\n",
+       "         'o': 16,\n",
+       "         'p': 38,\n",
+       "         'q': 39,\n",
+       "         'r': 226,\n",
+       "         's': 4,\n",
+       "         't': 99,\n",
+       "         'u': 113,\n",
+       "         'v': 32,\n",
+       "         'x': 97,\n",
+       "         'y': 111,\n",
+       "         'z': 61})"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "collections.Counter(sanitise(ca))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'etoainhsrdlumwycfgpbvkxjqz'"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ltrs = [p[0] for p in english_counts.most_common()]\n",
+    "cat(ltrs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['r',\n",
+       " 'k',\n",
+       " 'c',\n",
+       " 'n',\n",
+       " 'g',\n",
+       " 'u',\n",
+       " 'y',\n",
+       " 't',\n",
+       " 'x',\n",
+       " 'f',\n",
+       " 'i',\n",
+       " 'z',\n",
+       " 'h',\n",
+       " 'b',\n",
+       " 'e',\n",
+       " 'q',\n",
+       " 'p',\n",
+       " 'v',\n",
+       " 'a',\n",
+       " 'm',\n",
+       " 'l',\n",
+       " 'o',\n",
+       " 'j',\n",
+       " 's']"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ctls =  [p[0] for p in collections.Counter(sanitise(ca)).most_common()]\n",
+    "ctls"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "24"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(ctls)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'A': 'p',\n",
+       " 'B': 'w',\n",
+       " 'C': 'o',\n",
+       " 'E': 'y',\n",
+       " 'F': 'd',\n",
+       " 'G': 'i',\n",
+       " 'H': 'm',\n",
+       " 'I': 'l',\n",
+       " 'J': 'x',\n",
+       " 'K': 't',\n",
+       " 'L': 'v',\n",
+       " 'M': 'b',\n",
+       " 'N': 'a',\n",
+       " 'O': 'k',\n",
+       " 'P': 'f',\n",
+       " 'Q': 'c',\n",
+       " 'R': 'e',\n",
+       " 'S': 'j',\n",
+       " 'T': 's',\n",
+       " 'U': 'n',\n",
+       " 'V': 'g',\n",
+       " 'X': 'r',\n",
+       " 'Y': 'h',\n",
+       " 'Z': 'u'}"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans = {pr[1].upper(): pr[0] for pr in zip(ltrs, ctls)}\n",
+    "trans"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 60,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry,\n",
+      "\n",
+      "maryam suggested i get in touch as we need a courier and she thought you might be interested in joining us. her sources have confirmed that the book is being hunted by an illegal fundraising group named midas which has been associated with several terror networks in the last few years. maryam has travelled to istanbul following a lead on the buyer in the hope we can scare them off, but if that doesn’t work then we will need to find the rest of the book chapters before midas do. we are both hoping your diary is clear, because if i am right we will have another three places to visit after this one, and i am not sure how long it will take.\n",
+      "\n",
+      "i finished my work on the third chapter of tacitus’s monograph which i found on rhodes. it was concealed in a large stone lintel bearing an image of a rose, the symbol of the consort of the sun god helios. intriguingly rhodes is also known as the island of the knights, named after the knights of saint john of jerusalem, and the clue at the end of chapter three pointed to another home of the knights at bodrum, so i travelled there and was not too surprised to find chapter four concealed in the remains of their fort. i was however astonished by the text! it took me a while to crack it as i didn't recognise the encryption as anything classical. when i finally broke it i discovered that tacitus had used a cipher that we thought had been invented in sixteenth century france. it seems that the imperial cipher school were much more advanced than we had any reason to expect. if courier duty isn't exciting enough for you perhaps the chance to discover more imperial ciphers will be?\n",
+      "\n",
+      "the clue at the end of this chapter is very suggestive, and i have bought a ticket to selcuk to investigate. i am pretty sure i was followed to the ticket office.\n",
+      "\n",
+      "if you can come then we need you to drop by the british museum before you come out. i think there is something there that we need and will send a message to my contact in room twenty two telling them to expect you and briefing them on what to look out for. it would be good if you could be very discreet about that, but make as much fuss as you like about meeting me in selcuk. i will explain later!\n",
+      "\n",
+      "all the best,\n",
+      "\n",
+      "jodie\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "trans = {'A': 'b',\n",
+    " 'B': 'm',\n",
+    " 'C': 'o',\n",
+    " 'D': 'q',      \n",
+    " 'E': 'f',\n",
+    " 'F': 'd',\n",
+    " 'G': 'a',\n",
+    " 'H': 'u',\n",
+    " 'I': 'l',\n",
+    " 'J': 'x',\n",
+    " 'K': 't',\n",
+    " 'L': 'k',\n",
+    " 'M': 'p',\n",
+    " 'N': 'i',\n",
+    " 'O': 'v',\n",
+    " 'P': 'w',\n",
+    " 'Q': 'g',\n",
+    " 'R': 'e',\n",
+    " 'S': 'j',\n",
+    " 'T': 's',\n",
+    " 'U': 'h',\n",
+    " 'V': 'y',\n",
+    " 'X': 'r',\n",
+    " 'Y': 'n',\n",
+    " 'Z': 'c'}\n",
+    "tt = ''.maketrans(trans)\n",
+    "print(ca.translate(tt))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 61,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'a': 'G',\n",
+       " 'b': 'A',\n",
+       " 'c': 'Z',\n",
+       " 'd': 'F',\n",
+       " 'e': 'R',\n",
+       " 'f': 'E',\n",
+       " 'g': 'Q',\n",
+       " 'h': 'U',\n",
+       " 'i': 'N',\n",
+       " 'j': 'S',\n",
+       " 'k': 'L',\n",
+       " 'l': 'I',\n",
+       " 'm': 'B',\n",
+       " 'n': 'Y',\n",
+       " 'o': 'C',\n",
+       " 'p': 'M',\n",
+       " 'q': 'D',\n",
+       " 'r': 'X',\n",
+       " 's': 'T',\n",
+       " 't': 'K',\n",
+       " 'u': 'H',\n",
+       " 'v': 'O',\n",
+       " 'w': 'P',\n",
+       " 'x': 'J',\n",
+       " 'y': 'V'}"
+      ]
+     },
+     "execution_count": 61,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "{v: k for k, v in trans.items()}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 62,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'A': 'b',\n",
+       " 'B': 'm',\n",
+       " 'C': 'o',\n",
+       " 'D': 'q',\n",
+       " 'E': 'f',\n",
+       " 'F': 'd',\n",
+       " 'G': 'a',\n",
+       " 'H': 'u',\n",
+       " 'I': 'l',\n",
+       " 'J': 'x',\n",
+       " 'K': 't',\n",
+       " 'L': 'k',\n",
+       " 'M': 'p',\n",
+       " 'N': 'i',\n",
+       " 'O': 'v',\n",
+       " 'P': 'w',\n",
+       " 'Q': 'g',\n",
+       " 'R': 'e',\n",
+       " 'S': 'j',\n",
+       " 'T': 's',\n",
+       " 'U': 'h',\n",
+       " 'V': 'y',\n",
+       " 'X': 'r',\n",
+       " 'Y': 'n',\n",
+       " 'Z': 'c'}"
+      ]
+     },
+     "execution_count": 62,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 56,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "2229"
+      ]
+     },
+     "execution_count": 56,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open('4a.plaintext', 'w').write(ca.translate(tt))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 57,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('arcanaimperii', -4159.598618934157)"
+      ]
+     },
+     "execution_count": 57,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "kb, sb = vigenere_frequency_break(sanitise(cb))\n",
+    "kb, sb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 58,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'over the years the heroic role of agricola at watling street came to the notice of rome and two decades later he was appointed proconsul and governor of britannia by emperor vespasian a few years after his appointment vespasian ss on domitian became emperor and one of his first acts was to issue the order to implement the new imperial ciphers invented by the cipher school in the intervening years the ninth had been left to fight lonely skirmishes and battles from their base ate bora cum with fortitude and resolve they repeatedly drove the barbarians back into the cold heartlands of caledonia during one such skirmish varus was mortally wounded and agricola promoted the tribune marcus fidel i usca to to the legatus of the ninth one day the luck of the ninth seemed to change a reconnaissance squad reported that they had seen the aquila flying from a tree at mons grau pius in a camp ruled by a tribesman called cal gac us the new legatus recognised that the privations of along march had exhausted his men they were not ready for battle and ca to should have sent for reinforcements but the joy of seeing the lost aquila so close at hand clouded his judgement and he launched an attack under the cover of darkness fighting uphill against wave upon wave of barbarians the legions heroic efforts were frustrated by the sun rising to blind them as dawn broke the troops in the frontline gave way with exhaustion and the wild cal gac us dashed out of the sundown the blood soaked slope with his cavalry into the heart of the legion the legion rained flaming arrows upon the enemy and managed to un horse cal gac us taking him prisoner but could make no headway against the savage hordes and were unable to reach the stolen aquila worse was to come while ca to organised a retreat with the prisoner cal gac us in chains the remaining soldiers held the line against repeated charges by caledonian and iceni an tribesmen when the line finally broke ca to and many of the ninth legion had reached safety and took stock the cavalry were safe as were many of the brave legionnaires but to his horror ca to realised that in the battle he had lost the second aquila and worse the legions copy of the codex had also gone the documents left to me by agricola are unclear on this point did he know that the codex might have fallen into enemy hands and that a second aquila had been lost or did ca to assure him that the codex had been destroyed as part of an orderly retreat perhaps ca to was yet to rejoin agricola at the fort and communications from the battle had yet to reach him in a letter to emperor domitian agricola wrote most excellent emperor as you have most graciously requested i have finished my affairs herein britannia in preparation for returning to your side in rome it please sme to report to you that by acts of diplomacy and strength i have persuaded the northern rebels to yield to our army and to turnover to us the rebel cal gac us who has remained free since the wars against boudicca and the iceni his letter appears to have been a reply to new orders from rome in which domitian wrote my esteemed gnaeus upon receipt of your most recent letter i have been most troubled it appears clear to me that the situation in britannia has worsened and so i must ask you to return to meat rome with the utmost speed conduct your remaining affairs in the province and do not undertake any action which mayen flame the current tensions between yourself and the caledon ii the final line of the emperors letter set a deadline for agricola s return i shall expect you to have crossed the rubicon by the end of the year and perhaps he felt that contrition was a safer refuge whatever agricola knew at that point within a month his world had been turned upsidedown as further reports from caledonia made clear that his hope of restoration in the eyes of the emperor were in real jeopardy he set out to recover the two aquilae and to determine what had happened to the codex before returning to rome those who read on must search for the truth in the spiritual home of the amazons'"
+      ]
+     },
+     "execution_count": 58,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "wcat(segment(vigenere_decipher(sanitise(cb), kb)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 59,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "4084"
+      ]
+     },
+     "execution_count": 59,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open('4b.plaintext', 'w').write(wcat(segment(vigenere_decipher(sanitise(cb), kb))))"
+   ]
+  },
+  {
+   "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.5.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/2017/4a.ciphertext b/2017/4a.ciphertext
new file mode 100644 (file)
index 0000000..5970d12
--- /dev/null
@@ -0,0 +1,13 @@
+UGXXV,
+
+BGXVGB THQQRTKRF N QRK NY KCHZU GT PR YRRF G ZCHXNRX GYF TUR KUCHQUK VCH BNQUK AR NYKRXRTKRF NY SCNYNYQ HT. URX TCHXZRT UGOR ZCYENXBRF KUGK KUR ACCL NT ARNYQ UHYKRF AV GY NIIRQGI EHYFXGNTNYQ QXCHM YGBRF BNFGT PUNZU UGT ARRY GTTCZNGKRF PNKU TRORXGI KRXXCX YRKPCXLT NY KUR IGTK ERP VRGXT. BGXVGB UGT KXGORIIRF KC NTKGYAHI ECIICPNYQ G IRGF CY KUR AHVRX NY KUR UCMR PR ZGY TZGXR KURB CEE, AHK NE KUGK FCRTY’K PCXL KURY PR PNII YRRF KC ENYF KUR XRTK CE KUR ACCL ZUGMKRXT ARECXR BNFGT FC. PR GXR ACKU UCMNYQ VCHX FNGXV NT ZIRGX, ARZGHTR NE N GB XNQUK PR PNII UGOR GYCKURX KUXRR MIGZRT KC ONTNK GEKRX KUNT CYR, GYF N GB YCK THXR UCP ICYQ NK PNII KGLR.
+
+N ENYNTURF BV PCXL CY KUR KUNXF ZUGMKRX CE KGZNKHT’T BCYCQXGMU PUNZU N ECHYF CY XUCFRT. NK PGT ZCYZRGIRF NY G IGXQR TKCYR INYKRI ARGXNYQ GY NBGQR CE G XCTR, KUR TVBACI CE KUR ZCYTCXK CE KUR THY QCF URINCT. NYKXNQHNYQIV XUCFRT NT GITC LYCPY GT KUR NTIGYF CE KUR LYNQUKT, YGBRF GEKRX KUR LYNQUKT CE TGNYK SCUY CE SRXHTGIRB, GYF KUR ZIHR GK KUR RYF CE ZUGMKRX KUXRR MCNYKRF KC GYCKURX UCBR CE KUR LYNQUKT GK ACFXHB, TC N KXGORIIRF KURXR GYF PGT YCK KCC THXMXNTRF KC ENYF ZUGMKRX ECHX ZCYZRGIRF NY KUR XRBGNYT CE KURNX ECXK. N PGT UCPRORX GTKCYNTURF AV KUR KRJK! NK KCCL BR G PUNIR KC ZXGZL NK GT N FNFY'K XRZCQYNTR KUR RYZXVMKNCY GT GYVKUNYQ ZIGTTNZGI. PURY N ENYGIIV AXCLR NK N FNTZCORXRF KUGK KGZNKHT UGF HTRF G ZNMURX KUGK PR KUCHQUK UGF ARRY NYORYKRF NY TNJKRRYKU ZRYKHXV EXGYZR. NK TRRBT KUGK KUR NBMRXNGI ZNMURX TZUCCI PRXR BHZU BCXR GFOGYZRF KUGY PR UGF GYV XRGTCY KC RJMRZK. NE ZCHXNRX FHKV NTY'K RJZNKNYQ RYCHQU ECX VCH MRXUGMT KUR ZUGYZR KC FNTZCORX BCXR NBMRXNGI ZNMURXT PNII AR?
+
+KUR ZIHR GK KUR RYF CE KUNT ZUGMKRX NT ORXV THQQRTKNOR, GYF N UGOR ACHQUK G KNZLRK KC TRIZHL KC NYORTKNQGKR. N GB MXRKKV THXR N PGT ECIICPRF KC KUR KNZLRK CEENZR.
+
+NE VCH ZGY ZCBR KURY PR YRRF VCH KC FXCM AV KUR AXNKNTU BHTRHB ARECXR VCH ZCBR CHK. N KUNYL KURXR NT TCBRKUNYQ KURXR KUGK PR YRRF GYF PNII TRYF G BRTTGQR KC BV ZCYKGZK NY XCCB KPRYKV KPC KRIINYQ KURB KC RJMRZK VCH GYF AXNRENYQ KURB CY PUGK KC ICCL CHK ECX. NK PCHIF AR QCCF NE VCH ZCHIF AR ORXV FNTZXRRK GACHK KUGK, AHK BGLR GT BHZU EHTT GT VCH INLR GACHK BRRKNYQ BR NY TRIZHL. N PNII RJMIGNY IGKRX!
+
+GII KUR ARTK,
+
+SCFNR
diff --git a/2017/4a.plaintext b/2017/4a.plaintext
new file mode 100644 (file)
index 0000000..2fe881e
--- /dev/null
@@ -0,0 +1,13 @@
+harry,
+
+maryam suggested i get in touch as we need a courier and she thought you might be interested in joining us. her sources have confirmed that the book is being hunted by an illegal fundraising group named midas which has been associated with several terror networks in the last few years. maryam has travelled to istanbul following a lead on the buyer in the hope we can scare them off, but if that doesn’t work then we will need to find the rest of the book chapters before midas do. we are both hoping your diary is clear, because if i am right we will have another three places to visit after this one, and i am not sure how long it will take.
+
+i finished my work on the third chapter of tacitus’s monograph which i found on rhodes. it was concealed in a large stone lintel bearing an image of a rose, the symbol of the consort of the sun god helios. intriguingly rhodes is also known as the island of the knights, named after the knights of saint john of jerusalem, and the clue at the end of chapter three pointed to another home of the knights at bodrum, so i travelled there and was not too surprised to find chapter four concealed in the remains of their fort. i was however astonished by the text! it took me a while to crack it as i didn't recognise the encryption as anything classical. when i finally broke it i discovered that tacitus had used a cipher that we thought had been invented in sixteenth century france. it seems that the imperial cipher school were much more advanced than we had any reason to expect. if courier duty isn't exciting enough for you perhaps the chance to discover more imperial ciphers will be?
+
+the clue at the end of this chapter is very suggestive, and i have bought a ticket to selcuk to investigate. i am pretty sure i was followed to the ticket office.
+
+if you can come then we need you to drop by the british museum before you come out. i think there is something there that we need and will send a message to my contact in room twenty two telling them to expect you and briefing them on what to look out for. it would be good if you could be very discreet about that, but make as much fuss as you like about meeting me in selcuk. i will explain later!
+
+all the best,
+
+jodie
diff --git a/2017/4b.ciphertext b/2017/4b.ciphertext
new file mode 100644 (file)
index 0000000..d59e1ba
--- /dev/null
@@ -0,0 +1,14 @@
+OMGR GHM KTEIA BHV JEEOQO GSCM WF RIRVCWXP EK EITCKNT SBDTIK KIMV VO GHM ZDXZKM OW TOZE IZS XNW LETCDRS TMIII PM WRU ACPWUCXVL XRF EOASCX PRU OWVVTNBR WR QVZBINEKA OY MYEIIWZ VVUPNSQMC. E WME YVCRF ANFTV YQA AGROVNBYTRK DMSGCSVAV’E HSE, LWMZVINN, JQREDM MMGGRBR, IZS SEM WF YKS SIZEI ETBA WRU TB IAEJI KPM OIFEE TW UBTCMUEEV TUE VQL MDXMRZCL PIXTTVJ QVVVPTRD JK ILV KQPYGR FCPADP.
+
+ZV BHV KNGEZHTRZVO YVCRF TPQ CMEBP HRF BREV XTJK BW FZIHG LWZTPP ASIIOIFHME PRU JITKNEF FZAB XYMQR SCSR AB QQSIIKUD. YIGH NAGXZBCDV CNQ RMEDPMM BHVA RRPMMIIUTG DIQVR TPQ QEIJIRZCNF BIOZ MEBW TYG CBLL TTEIBTAEFS BF KMAIUWVIR. FUEIVS DRV ACCY UKVRUUHL MIZUJ YAF MWDIECTG WFWNQEL MCH ROZITQLN PZABSKML TYG TEIJGCI DIZCLU FVDMXXYJ KITF VO GHM XTKRBCS FH TUE VUCXY.
+
+WVE UCY GHM XJGB WN TYG NVNBT HIVUMD KQ CUAVST. E IMKOEPAVSAMCGV AYURF RRPWDIIU BPAK VHRY PMS WVMV TYG ADUQXP JCGQNX HRBM I FGIV IB MFPS TRIGEMLA, QN R EAZP ZGAIU JG A KTIOEAYPR TITLVF CNLOMRYJ. BPE EGW YEOMIYJ ZMCFINVSMP ILRB BHV RRVVIFXSEA WF R NOAG UMGGY PID VZHNUAFTH YQA MVP, TUEG ITVV VWT IGAQY NAG FRBBLV CNQ CIFD WYWCLU JAIE AQCX WWZ RVKNSOZOTQVVBS, SWT GHM VDC FN AEVKNT TPQ ASJB IQLKLN SW OASJM IT YCNQ CTAJHVL PIJ LUQGMYTRK, IVD YG LNUVOWIU IV AKVAPK CZSII BPE TQVRR WR SEISVEJU.
+
+FVGPFXRX CXHZNL NGIUCWK EIVV WPBN EMKI FN JAIDAEIIZH, XYM TEXKOA’S PQGSZK MFWQRGS EQGI WZCSKTAGEL NN XYM AUE TIFIVS IS STQNU VHRM IE SENV JRFME. GHM FGSFXA IE VHR FZACX CQVE XCVR WIK LMKP MXYCUFTQAC EEL BHV YIYD KMAKRKCS UCSUEL AJX FN BHV UUA DWIC XYM JLFQD-FOIWTH JTWPV YIGH PUH GRDILIA IATW FWI YMIRK QF GHM XTKZWV. TYG LRGQAC VRQVEU HLNMQZV EIZWWJ WPBN BTT IEMUY RPD ZAVMVIU BW UEJOESM OPPXIKUJ VAXIVS WMD XZIJQNRR, JGI GFCTD DCKR NW TTEUEIY RIAVNAF ILV AIVRIE UOZPTW RVL WVTE HNINAI KW ZEREH GHM EISCMV AHWIYA. EAGWV EIS KQ CBMM.
+
+IWMCM KAKQ OEGIZXWVL I RVVRRAB IXXY BPE GTIFOVQG GRTOATWS VN KTPMEA, BHV TEZAQZXRX AWLUKEES PQAH KPM LZPE NGIUCWK ZMPVCTRD KTPVXMA BP EAYELACMRV INU KCRNQMC XIQJEJOEA. WPQC XYM TIEG FVNIXAC SZWKV, EAGO IZS QRVG OW VHR NQZIL CMOIFP HND ZQPGYML SRHEGY IZS XFWS SKQCX. TPQ REMITRP YEEE AMUI, RA EEIG MNNG AU XYM JRRXE YEOUDREIQRVU, BHT BA WMJ PWRIQR, PABA GIRTQSVF TUAB UC XYM JAKVLR HM TPH CWAT KJE FEKACH RYCICC, AAD EAGWV, BPE CGGVOV’E RSGG WF KJE POLQM LRL ILJQ GBNM.
+
+FWI UWKUDGNGS TQUX KW UE SA ATRQODPR IZE LPCYEID DR KPQS GQIAT. LUS LV SVON VHNT BTT GFLMX DKGUT PMKI WITLVP IATW QCIDG PAEFS NNL FWEK I AETQNQ AYGXPR PID SGEA LWEI? SI LQD TCTB AAEJVV PQM KJAG TPQ RSUMF HRF BREV PTWKZWYVF AF PIDI SW IV OIFEELG DTXIMIT? GGRUAXE REKW EAJ AEG TW DT-NFQV AXTIPOTM PX KPM FFTT, NNL ODQDCVITCTVOVE UVFU BHV DAGTTQ WEU GMT KQ RRAKT WMD. QV A CGTGEZ FD IDXMRFT DBMQFXEE, IORZEOYA EDDXV “UWSK GXPETXTRK MUPVTOE, AA KDY YIDE DQSG GZMRMFCALP TEDUMEIIU Q PAMG FVNQEWIU UG AWHAVRA TTVV QV BIKTNNVUP ME XZEGCRNTQAC JFZ ZEKWRAIVS IS PWCR JKDR IV DDQV. QB PCGAFEA YT XF ZMPFTT GO GAJ XYIB BP CCGS WR SMGTWMREY NNL EIVVVOTY K HNVM BTVJCIDVF TUE VAGXYMZN IGBRLA FD CZMTD KQ OHR IDBC RVL TF VUEN WHTV KW CS KJE EEJQA GRTOATWS JHW TPW IMUAZPEQ FZQT WZVKE KJE JAZE PKRQVSK DOHDQORE RVL TYG IPEVU.” WMJ TMTKGR NPXQPVJ BW HRXE OEMZ P VVXTY KQ NRW WDSIIA NRFO RBMM UC AYQKH UQMVTQMC AIWBE “DA EFTMQBIU OVAVWS, HPWZ GITMQPK QF LOCD BSJB ZETGNG LMFIII Q PAMG BREV YDWK BZOLDLRD. QF PTGMIRJ ELRAZ FD QV BPAK VHR SQFJEKQWN ZP BEIBMCRZI PAJ YOESMZTH RVL SF K MHSB MHO PWC TF TEGUZZ IS DM IT IQMR WQFW XYM CTDQSG SXQTH. TWVDLET LOCD GIDIQNZPG NFNMXVJ QV TYG PEODUCGV IVD UQ NBT CZSIIBIKV CNL AKFXSE EPITJ MNY MZUPRUM TYG CHRZQCX KMVSZQNF BMFLIVV GOLTSRLN MCH KPM CRNEQOVUX.” XYM NIECL YIVQ DJ KPM EDREEOZ’E AIKBMR JGT N DMMSPZVM FFT ATRQODPR’A ZEKWRA, “I ATPPC MFPVET LOC FD LRDM CIQSFEL FWI ICJITQN OY BTT IEL WF KJE LEID”, PRU XMRYCPF HM RTPK BPAK EOATZUIMFV EAJ C SNFMD GIWCOE.
+NJAGEDQG EXZQCFNA XNMI PX KPIT GQIAT, EUILZV I MFPTU HQE LSITL HRF BREV FJVEML UGUIQE LALR, RA NUIVHRR ZQESIBA FIQM PATQSSEQI MRFE PLMMG XYIB HZU HBPM AU VVABOICTVOV UC XYM MYVU OS TPQ TQGMZOI YEEE QZ GIRT REFRAEDG. TT WVB WUK VO EEKAKII BPE KYO NQCUAEV IVD KQ DRTMDBMEM EHRV HND PMETVVMD KQ TUE KASIO JMFFTE EEBGGRZVO TF TOZE.
+
+BTDWV EPO IGAQ OV YJWK AMAIEH SOZ FWI KZCTY KN GHM EEMIQBURN HBMM AU XYM IMRBOAS.
\ No newline at end of file
diff --git a/2017/4b.plaintext b/2017/4b.plaintext
new file mode 100644 (file)
index 0000000..dcaa54f
--- /dev/null
@@ -0,0 +1 @@
+over the years the heroic role of agricola at watling street came to the notice of rome and two decades later he was appointed proconsul and governor of britannia by emperor vespasian a few years after his appointment vespasian ss on domitian became emperor and one of his first acts was to issue the order to implement the new imperial ciphers invented by the cipher school in the intervening years the ninth had been left to fight lonely skirmishes and battles from their base ate bora cum with fortitude and resolve they repeatedly drove the barbarians back into the cold heartlands of caledonia during one such skirmish varus was mortally wounded and agricola promoted the tribune marcus fidel i usca to to the legatus of the ninth one day the luck of the ninth seemed to change a reconnaissance squad reported that they had seen the aquila flying from a tree at mons grau pius in a camp ruled by a tribesman called cal gac us the new legatus recognised that the privations of along march had exhausted his men they were not ready for battle and ca to should have sent for reinforcements but the joy of seeing the lost aquila so close at hand clouded his judgement and he launched an attack under the cover of darkness fighting uphill against wave upon wave of barbarians the legions heroic efforts were frustrated by the sun rising to blind them as dawn broke the troops in the frontline gave way with exhaustion and the wild cal gac us dashed out of the sundown the blood soaked slope with his cavalry into the heart of the legion the legion rained flaming arrows upon the enemy and managed to un horse cal gac us taking him prisoner but could make no headway against the savage hordes and were unable to reach the stolen aquila worse was to come while ca to organised a retreat with the prisoner cal gac us in chains the remaining soldiers held the line against repeated charges by caledonian and iceni an tribesmen when the line finally broke ca to and many of the ninth legion had reached safety and took stock the cavalry were safe as were many of the brave legionnaires but to his horror ca to realised that in the battle he had lost the second aquila and worse the legions copy of the codex had also gone the documents left to me by agricola are unclear on this point did he know that the codex might have fallen into enemy hands and that a second aquila had been lost or did ca to assure him that the codex had been destroyed as part of an orderly retreat perhaps ca to was yet to rejoin agricola at the fort and communications from the battle had yet to reach him in a letter to emperor domitian agricola wrote most excellent emperor as you have most graciously requested i have finished my affairs herein britannia in preparation for returning to your side in rome it please sme to report to you that by acts of diplomacy and strength i have persuaded the northern rebels to yield to our army and to turnover to us the rebel cal gac us who has remained free since the wars against boudicca and the iceni his letter appears to have been a reply to new orders from rome in which domitian wrote my esteemed gnaeus upon receipt of your most recent letter i have been most troubled it appears clear to me that the situation in britannia has worsened and so i must ask you to return to meat rome with the utmost speed conduct your remaining affairs in the province and do not undertake any action which mayen flame the current tensions between yourself and the caledon ii the final line of the emperors letter set a deadline for agricola s return i shall expect you to have crossed the rubicon by the end of the year and perhaps he felt that contrition was a safer refuge whatever agricola knew at that point within a month his world had been turned upsidedown as further reports from caledonia made clear that his hope of restoration in the eyes of the emperor were in real jeopardy he set out to recover the two aquilae and to determine what had happened to the codex before returning to rome those who read on must search for the truth in the spiritual home of the amazons
\ No newline at end of file