{ "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": 8, "metadata": {}, "outputs": [], "source": [ "from cipher.caesar import *\n", "from cipher.affine import *\n", "from support.text_prettify import *" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "c2a = open('2a.ciphertext').read()\n", "c2b = open('2b.ciphertext').read()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LIFE HAD BEEN RELATIVELY DULL SINCE RETURNING FROM MY WORK WITH HARRY IN THE MIDDLE EAST. THE BRITISH LIBRARY WAS DELIGHTED TO GET ITS HANDS ON THE ROMAN DIARY AND THE COLLECTOR SEEMED TO HAVE FORGOTTEN ABOUT ME, MAYBE BECAUSE HARRY'S TEAM MADE IT TOO DANGEROUS TO HANG AROUND. I WAS HAPPY TO SETTLE BACK IN TO MY WORK AT THE LIBRARY AND WAS INVOLVED IN A PROJECT TO TRACK DOWN AND CATALOGUE MISSING DOCUMENTS FROM THE LATE NINETEENTH CENTURY. THEY DETAILED FOREIGN POLICY, WHICH SOUNDS DULL, BUT WITH VICTORIA TAKING AN ACTIVE INTEREST THERE WERE A LOT OF LETTERS BETWEEN DOWNING STREET AND THE PALACE AND I WAS ENJOYING SPYING ON FAMOUS CHARACTERS FROM HISTORY. I REALLY FELT LIKE I WAS GETTING SOME INSIGHT INTO HOW THEY THOUGHT AND HOW THE MODERN WORLD CAME INTO BEING IN THAT TUMULTUOUS PERIOD.\n", "\n", "WHILE I WAS MAINLY THERE TO CHECK THE LETTERS FOR AUTHENTICITY, I GOT REALLY INVOLVED IN TRYING TO UNDERSTAND HOW THEY ALL FITTED TOGETHER, AND PART OF THE JOB WAS TO CROSS CHECK STATEMENTS IN THE LETTERS WITH WHAT WE KNOW ACTUALLY HAPPENED. THERE ARE A LOT OF PEOPLE WHO WILL PAY A LOT OF MONEY TO OWN A LETTER FROM A ROYAL, SO THE ARCHIVE IS PLAGUED WITH FORGERIES. SOME OF THEM YOU CAN DETECT BY ANALYSING THE PAPER, OTHERS BY THE WRITING STYLE. SOME JUST FALL OVER BECAUSE THE CONTENT IS OUT OF LINE WITH OTHER DOCUMENTS, BUT AS I STUDIED THEM I BEGAN TO REALISE THAT A NUMBER OF THEM HINTED AT EVENTS THAT I COULDN'T FIND IN THE HISTORICAL RECORD. CERTAIN NAMES APPEARED AND WERE CLEARLY IMPORTANT, AND THEN DISAPPEARED COMPLETELY FROM TRACE. DIPLOMATIC INCIDENTS WERE MENTIONED THAT NEVER HAPPENED ACCORDING TO THE HISTORY BOOKS. ONE THING YOU LEARN IN THIS BUSINESS IS THAT THE CIVIL SERVICE NEVER LETS ANY DECISION, HOWEVER SECRET, GO UNRECORDED. OF COURSE THAT MIGHT JUST HAVE MEANT THOSE LETTERS AND DOCUMENTS WERE FAKE, BUT I PRIDE MYSELF ON BEING AN EXCELLENT FORGER, AND I WOULD NOT HAVE BEEN ABLE TO PRODUCE THEM. THE PAPER WAS RIGHT, THE INK WAS CHEMICALLY CORRECT AND AGED JUST THE RIGHT AMOUNT, AND THE STYLE OF WRITING WAS TOTALLY CONVINCING. AND I WAS CONVINCED. CONVINCED THAT SOMEWHERE THERE MUST BE AN ARCHIVE OF GOVERNMENT DOCUMENTS FROM THE PERIOD THAT RECORDED ALL OF THESE MISSING STORIES IN FULL.\n", "\n", "THEN I RECEIVED THE MESSAGE ABOUT THE SHADOW ARCHIVE. SOMEONE ELSE KNEW ABOUT IT, AND HAD WORKED OUT THAT I WAS HUNTING FOR IT TOO. THE POSTCARD DIDN'T HELP MUCH, BUT THE EMAILS DID. THE FIRST ONE HAD THE SUBJECT LINE JEKYLL AND HYDE AND WAS ENCRYPTED USING A SIMPLE CAESAR SHIFT TO DISCOURAGE CASUAL INTEREST. IT DIDN'T TAKE ME LONG TO CRACK IT, AND THE NAMES AND DETAILS IT CONTAINED MATCHED THE GROWING LIST OF MYSTERIOUS REFERENCES FROM MY OWN RESEARCH. DOUGLAS BLACK WAS CLEARLY AN IMPORTANT FIGURE, AND I HAD A FEELING THAT HE HAD SOMETHING TO DO WITH THE ARCHIVE. THAT FEELING WAS CONFIRMED BY THE SECOND EMAIL, BLACK HEART, THAT I RECEIVED LATER THAT WEEK. AGAIN IT WAS ENCRYPTED BUT THIS TIME USING AN AFFINE SHIFT CIPHER. IT WAS CLEARLY FROM THE SAME INDIVIDUAL - AT THE VERY LEAST WHOEVER WAS SENDING ME THE EMAILS HAD A HABIT OF MISSING THE LETTER R FROM THE WORD \"YOUR\".\n", "\n", "SOMEONE WAS PLAYING GAMES WITH ME, AND I WAS MORE THAN HAPPY TO JOIN IN.\n" ] } ], "source": [ "key_a, score_a = caesar_break(c2a)\n", "print(caesar_decipher(c2a, key_a))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3183" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open('2a.plaintext', 'w').write(caesar_decipher(c2a, key_a))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LDS TKHSIFL,\n", "\n", "DE DL JDEK SFRSFE EKHE D YDUM BVLFIY DU MDLHRSFFBFUE JDEK VNX WXMRFBFUE. DE DL TIFHS EN BF EKHE VNX HSF SDRKE DU NUF SFRHSM, DE DL EDBF EN FLEHAIDLK EKF NYYDTF NY LFTSFE LFTSFEHSV, HUM EN EHPF EKF LFTSFE JHS EN NXS FUFBDFL. NU NUF LDRUDYDTHUE GNDUE KNJFQFS, D MN UNE HRSFF. EKDL SNIF DL UNE LXDEFM EN RNNM BFU JDEK H SFGXEHEDNU YNS KNUNXS. VNXS LXRRFLEDNUL JNXIM AF THGDEHI DY D JFSF INNPDUR EN HGGNDUE H TKDFY NY LEHYY NS H UFJ YNSFDRU LFTSFEHSV, KNJFQFS EKF EHLPL EKHE JF ANEK PUNJ HSF UFTFLLHSV DY JF HSF EN GSNEFTE HUM FCGHUM EKF FBGDSF JDII SFZXDSF H BHU NY HIENRFEKFS MDYYFSFUE TKHSHTEFS. H SFM AINNMFM BHU JDEK H AIHTP KFHSE.\n", "\n", "EKFSF DL NUF BHU JF ANEK PUNJ JKN DL FUEDSFIV LXDEFM EN EKF IFLL TNURFUDHI HLGFTEL NY BNMFSU LEHEFTSHYE, HUM D HB LXSGSDLFM EKHE VNX MDM UNE HMM KDL UHBF EN EKF IDLE - VNX HBFSDTHU TNXLDU MNXRIHL AIHTP. AIHTP DL H BHU NY LDURXIHS EHIFUEL HUM D JNXIM LXRRFLE EKHE VNX HTE JDEK XEBNLE LGFFM EN ASDUR KDB EN INUMNU. D AFIDFQF EKHE KF DL TXE YSNB EKF LHBF TINEK HL VNX, HUM D HB TNUYDMFUE EKHE VNX JDII AF HAIF EN GFSLXHMF KDB EN EHPF XG EKF GNLE NY LFTSFE LFTSFEHSV. D HB SHEKFS INNPDUR YNSJHSM EN BV YDSLE BFFEDUR JDEK BS. AIHTP HUM D ESXLE VNX JDII UNE MDLHGGNDUE BF DU EKDL, AXE DY VNX YDUM EKHE KF DL UNE HBFUHAIF EN SFHLNU EKFU D JDII YDUM HUNEKFS JHV EN GFSLXHMF KDB. H BHU IDPF AIHTP HIJHVL KHL H LPFIFENU NS EJN DU KDL TINLFE!\n", "\n", "Q.\n" ] } ], "source": [ "key_b, score_b = caesar_break(c2b)\n", "print(caesar_decipher(c2b, key_b))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SIR CHARLES,\n", "\n", "IT IS WITH REGRET THAT I FIND MYSELF IN DISAGREEMENT WITH YOU JUDGEMENT. IT IS CLEAR TO ME THAT YOU ARE RIGHT IN ONE REGARD, IT IS TIME TO ESTABLISH THE OFFICE OF SECRET SECRETARY, AND TO TAKE THE SECRET WAR TO OUR ENEMIES. ON ONE SIGNIFICANT POINT HOWEVER, I DO NOT AGREE. THIS ROLE IS NOT SUITED TO GOOD MEN WITH A REPUTATION FOR HONOUR. YOUR SUGGESTIONS WOULD BE CAPITAL IF I WERE LOOKING TO APPOINT A CHIEF OF STAFF OR A NEW FOREIGN SECRETARY, HOWEVER THE TASKS THAT WE BOTH KNOW ARE NECESSARY IF WE ARE TO PROTECT AND EXPAND THE EMPIRE WILL REQUIRE A MAN OF ALTOGETHER DIFFERENT CHARACTER. A RED BLOODED MAN WITH A BLACK HEART.\n", "\n", "THERE IS ONE MAN WE BOTH KNOW WHO IS ENTIRELY SUITED TO THE LESS CONGENIAL ASPECTS OF MODERN STATECRAFT, AND I AM SURPRISED THAT YOU DID NOT ADD HIS NAME TO THE LIST - YOU AMERICAN COUSIN DOUGLAS BLACK. BLACK IS A MAN OF SINGULAR TALENTS AND I WOULD SUGGEST THAT YOU ACT WITH UTMOST SPEED TO BRING HIM TO LONDON. I BELIEVE THAT HE IS CUT FROM THE SAME CLOTH AS YOU, AND I AM CONFIDENT THAT YOU WILL BE ABLE TO PERSUADE HIM TO TAKE UP THE POST OF SECRET SECRETARY. I AM RATHER LOOKING FORWARD TO MY FIRST MEETING WITH MR. BLACK AND I TRUST YOU WILL NOT DISAPPOINT ME IN THIS, BUT IF YOU FIND THAT HE IS NOT AMENABLE TO REASON THEN I WILL FIND ANOTHER WAY TO PERSUADE HIM. A MAN LIKE BLACK ALWAYS HAS A SKELETON OR TWO IN HIS CLOSET!\n", "\n", "V.\n" ] } ], "source": [ "(m_b, s_b, o_b), score_b = affine_break(c2b)\n", "print(affine_decipher(c2b, m_b, s_b, o_b))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1383" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open('2b.plaintext', 'w').write(affine_decipher(c2b, m_b, s_b, o_b))" ] }, { "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 }