{ "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) \n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "from cipher.caesar import *\n", "from cipher.affine import *\n", "from support.utilities import *\n", "from support.text_prettify import *\n", "\n", "c2a = open('2a.ciphertext').read()\n", "c2b = open('2b.ciphertext').read()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6, -1833.0297785667572)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_a, score = caesar_break(c2a)\n", "key_a, score" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CHARLIE\n", "THE NOTE YOU SENT OVER WAS TRICKIER THAN I EXPECTED. JAMELIA DIDN'T JUST REVERSE THE WHOLE MESSAGE BEFORE ENCRYPTING IT, SHE PUT ALL THE PUNCTUATION AND SPACING BACK IN THE ORIGINAL PLACES TO THROW THE CASUAL READER OFF THE SCENT. IT WASN'T VERY SOPHISTICATED, BUT IT WAS DEVIOUS, AND TELLS US SOMETHING ABOUT THE WAY SHE THINKS. ONE THING I AM CERTAIN ABOUT, THIS DOESN'T READ LIKE A SUICIDE NOTE. WHO WRITES ONE OF THOSE IN CODE?\n", "\n", "OUR FIELD AGENT ASKED AROUND AT THE UNIVERSITY AND WAS TOLD THAT JAMELIA'S BOYFRIEND WORKED IN THE SAME LAB AS HER FOR A WHILE. HIS NAME IS MARTIN TRAYNOR AND THEY BOTH DID AN INTERNSHIP IN THEIR SECOND YEAR AT A SPINOUT COMPANY CALLED DYNAMIX. THAT IS A SMALL STARTUP WHICH WORKS ON THE FRINGES OF THE ARMS INDUSTRY, BUT NO-ONE SEEMS TO KNOW MUCH ABOUT IT.\n", "\n", "I AM NOT SURE WHY DYNAMIX WOULD HAVE HIRED JAMELIA; YOU SAID THAT SHE WAS WORKING ON GRAVITY WAVES, WHICH ARE A SEISMOLOGICAL PHENOMENON. I READ AN INTERESTING PAPER CALLED \"GRAVITY WAVES IN EARTHQUAKES\" WHICH SUGGESTED THAT THEY MIGHT BE RESPONSIBLE FOR THE DESTRUCTION OF HIGH RISE BLOCKS DURING SOME TREMORS. BUT UNLESS DYNAMIX ARE PLANNING TO TRY TO WEAPONISE EARTHQUAKES I AM NOT SURE WHY THIS WOULD BE OF INTEREST TO THEM. WE NEED TO KNOW MORE ABOUT HER WORK AND WHAT THEY HIRED HER TO DO.\n", "\n", "THERE ARE A LOT OF QUESTIONS EVEN IN THE FIRST NOTE:\n", "\n", "WHY DID MARTIN LEAVE?\n", "WHERE IS HE?\n", "WHY COULDN'T SHE GET HOLD OF HIM?\n", "WHAT WAS TOO BIG FOR JAMELIA TO HANDLE ALONE?\n", "WHAT MADE JAMELIA FEEL GUILTY?\n", "HOW WAS SHE PLANNING TO FIX IT?\n", "\n", "I AM HOPING THAT THE ATTACHED DOCUMENT WILL ANSWER SOME OF THESE QUESTIONS BUT IT WILL PROBABLY JUST RAISE OTHERS. I FOUND IT PASTED UNDER THE COVER OF THE NOTEBOOK THAT THE PREVIOUS MESSAGE WAS TAKEN FROM. I CAN SEE WHY THE POLICE MISSED IT, THOUGH IT WASN'T A VERY PROFESSIONAL JOB.\n", "\n", "HARRY\n", "\n" ] } ], "source": [ "print(caesar_decipher(c2a, key_a))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(17, -1552.2481210949848)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_b, score = caesar_break(c2b)\n", "key_b, score" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NHFXCZDYX KDS TLSCZY,\n", "\n", "RUB LSF VZCLAFOOF ZYCFSFXCFA ZY ABYLTZW?\n", "UDR AZA ABYLTZW PFC TB VDAF-QLXF?\n", "RULC LSF ABYLTZW IOLYYZYP CD AD RZCU ZC?\n", "RUB ZX UF XCZOO ZYMDOMFA RZCU CUFT?\n", "RUD LSF CUF IAX XBYAZVLCF?\n", "\n", "Z CUZYJ Z JYDR CUF LYXRFSX, LYA Z LT ISFCCB XHSF UF THXC AD CDD. CUF CUSFF TDYCUX RF XIFYC RDSJZYP LC ABYLTZW RFSF XDTF DK CUF TDXC FWVZCZYP Z ULMF FMFS FWIFSZFYVFA, QHC XHSFOB, JYDRZYP RULC RF JYDR YDR, FMFY TLSCZY THXC ULMF XDTF SFXFSMLCZDYX LQDHC RDSJZYP RZCU CUFXF IFDIOF.\n", "\n", "Z LT YDC XHSF RUD CD CLOJ CD LQDHC CUZX. Z LT VFSCLZY CULC XDTF TFTQFSX DK CUF QDLSA LC ABYLTZW LSF VDTIOFCFOB ZY CUF ALSJ LQDHC ZC, YD VDYXIZSLVB RZCU CULC TLYB TFTQFSX VDHOA ULMF XHSMZMFA TDSF CULY L RFFJ, QHC Z ULMF YD ZAFL RUZVU DK CUFT Z VLY CSHXC. Z CUDHPUC Z VDHOA CSHXC TLSCZY, QHC CULC RLX QFKDSF CUF IAX ULVJ.\n", "\n", "Z VLY’C CLOJ CD CUF IDOZVF; XIFVZLO QSLYVU LSF VFSCLZY CD KOLP ZC PZMFY CUF YLTFX DK XDTF DK CUF IFDIOF DY CUF QDLSA. RZCU CUFZS VDYYFVCZDYX RUD JYDRX RULC TZPUC ULIIFY. CUF IAX XBYAZVLCF LSF CDD QZP KDS TF CD ULYAOF LODYF. CUFB JYDR LOTDXC FMFSBCUZYP LQDHC TF, LYA Z JYDR YFWC CD YDCUZYP LQDHC CUFT. ZK Z XCLB UFSF CD KZPUC, CUFY ZC ZX DYOB L TLCCFS DK CZTF HYCZO CUFB SFLOZXF Z LT DY CD CUFT. ZK Z ULMFY’C AZXLIIFLSFA QFKDSF CUFY, CUFY Z ULMF L KFFOZYP CUFB RZOO TLJF TF AZXLIIFLS.\n", "\n" ] } ], "source": [ "print(c2b)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WQOGLIMHG TMB CUBLIH,\n", "\n", "ADK UBO EILUJOXXO IHLOBOGLOJ IH JKHUCIF?\n", "DMA JIJ JKHUCIF YOL CK EMJO-ZUGO?\n", "ADUL UBO JKHUCIF RXUHHIHY LM JM AILD IL?\n", "ADK IG DO GLIXX IHVMXVOJ AILD LDOC?\n", "ADM UBO LDO RJG GKHJIEULO?\n", "\n", "I LDIHS I SHMA LDO UHGAOBG, UHJ I UC RBOLLK GQBO DO CQGL JM LMM. LDO LDBOO CMHLDG AO GROHL AMBSIHY UL JKHUCIF AOBO GMCO MT LDO CMGL OFEILIHY I DUVO OVOB OFROBIOHEOJ, ZQL GQBOXK, SHMAIHY ADUL AO SHMA HMA, OVOH CUBLIH CQGL DUVO GMCO BOGOBVULIMHG UZMQL AMBSIHY AILD LDOGO ROMRXO.\n", "\n", "I UC HML GQBO ADM LM LUXS LM UZMQL LDIG. I UC EOBLUIH LDUL GMCO COCZOBG MT LDO ZMUBJ UL JKHUCIF UBO EMCRXOLOXK IH LDO JUBS UZMQL IL, HM EMHGRIBUEK AILD LDUL CUHK COCZOBG EMQXJ DUVO GQBVIVOJ CMBO LDUH U AOOS, ZQL I DUVO HM IJOU ADIED MT LDOC I EUH LBQGL. I LDMQYDL I EMQXJ LBQGL CUBLIH, ZQL LDUL AUG ZOTMBO LDO RJG DUES.\n", "\n", "I EUH'L LUXS LM LDO RMXIEO; GROEIUX ZBUHED UBO EOBLUIH LM TXUY IL YIVOH LDO HUCOG MT GMCO MT LDO ROMRXO MH LDO ZMUBJ. AILD LDOIB EMHHOELIMHG ADM SHMAG ADUL CIYDL DURROH. LDO RJG GKHJIEULO UBO LMM ZIY TMB CO LM DUHJXO UXMHO. LDOK SHMA UXCMGL OVOBKLDIHY UZMQL CO, UHJ I SHMA HOFL LM HMLDIHY UZMQL LDOC. IT I GLUK DOBO LM TIYDL, LDOH IL IG MHXK U CULLOB MT LICO QHLIX LDOK BOUXIGO I UC MH LM LDOC. IT I DUVOH'L JIGURROUBOJ ZOTMBO LDOH, LDOH I DUVO U TOOXIHY LDOK AIXX CUSO CO JIGURROUB.\n", "\n" ] } ], "source": [ "print(caesar_decipher(c2b, key_b))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((5, 7, True), -1275.2927860232996)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_b, score = affine_break(c2b)\n", "key_b, score" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "QUESTIONS FOR MARTIN,\n", "\n", "WHY ARE CITADELLE INTERESTED IN DYNAMIX?\n", "HOW DID DYNAMIX GET MY CODE-BASE?\n", "WHAT ARE DYNAMIX PLANNING TO DO WITH IT?\n", "WHY IS HE STILL INVOLVED WITH THEM?\n", "WHO ARE THE PDS SYNDICATE?\n", "\n", "I THINK I KNOW THE ANSWERS, AND I AM PRETTY SURE HE MUST DO TOO. THE THREE MONTHS WE SPENT WORKING AT DYNAMIX WERE SOME OF THE MOST EXCITING I HAVE EVER EXPERIENCED, BUT SURELY, KNOWING WHAT WE KNOW NOW, EVEN MARTIN MUST HAVE SOME RESERVATIONS ABOUT WORKING WITH THESE PEOPLE.\n", "\n", "I AM NOT SURE WHO TO TALK TO ABOUT THIS. I AM CERTAIN THAT SOME MEMBERS OF THE BOARD AT DYNAMIX ARE COMPLETELY IN THE DARK ABOUT IT, NO CONSPIRACY WITH THAT MANY MEMBERS COULD HAVE SURVIVED MORE THAN A WEEK, BUT I HAVE NO IDEA WHICH OF THEM I CAN TRUST. I THOUGHT I COULD TRUST MARTIN, BUT THAT WAS BEFORE THE PDS HACK.\n", "\n", "I CAN’T TALK TO THE POLICE; SPECIAL BRANCH ARE CERTAIN TO FLAG IT GIVEN THE NAMES OF SOME OF THE PEOPLE ON THE BOARD. WITH THEIR CONNECTIONS WHO KNOWS WHAT MIGHT HAPPEN. THE PDS SYNDICATE ARE TOO BIG FOR ME TO HANDLE ALONE. THEY KNOW ALMOST EVERYTHING ABOUT ME, AND I KNOW NEXT TO NOTHING ABOUT THEM. IF I STAY HERE TO FIGHT, THEN IT IS ONLY A MATTER OF TIME UNTIL THEY REALISE I AM ON TO THEM. IF I HAVEN’T DISAPPEARED BEFORE THEN, THEN I HAVE A FEELING THEY WILL MAKE ME DISAPPEAR.\n", "\n" ] } ], "source": [ "print(affine_decipher(c2b, key_b[0], key_b[1], key_b[2]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.3" } }, "nbformat": 4, "nbformat_minor": 1 }