Done challenges 1 and 2
[cipher-tools.git] / 2020-early / 2020-a-challenge2.ipynb
diff --git a/2020-early/2020-a-challenge2.ipynb b/2020-early/2020-a-challenge2.ipynb
new file mode 100644 (file)
index 0000000..20c5da5
--- /dev/null
@@ -0,0 +1,185 @@
+{
+ "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",
+    "\n",
+    "from support.text_prettify import *\n",
+    "from support.utilities import *\n",
+    "from support.plot_frequency_histogram import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "challenge_number = 2\n",
+    "plaintext_a_filename = f'{challenge_number}a.plaintext'\n",
+    "plaintext_b_filename = f'{challenge_number}b.plaintext'\n",
+    "ciphertext_a_filename = f'{challenge_number}a.ciphertext'\n",
+    "ciphertext_b_filename = f'{challenge_number}b.ciphertext'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ca = open(ciphertext_a_filename).read()\n",
+    "cb = open(ciphertext_b_filename).read()\n",
+    "\n",
+    "sca = sanitise(ca)\n",
+    "pca = letters(ca)\n",
+    "pta = depunctuate(ca)\n",
+    "\n",
+    "scb = sanitise(cb)\n",
+    "pcb = letters(cb)\n",
+    "ptb = depunctuate(cb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "(3, 6, True) \n",
+      "\n",
+      "PHIL I HEARD BACK FROM THE BRITISH MILITARY ATTACHE STOP HE SAID THAT THE NUMBER LOOKS LIKE THE FORMAT USED BY THE PATENT OFFICE STOP HE SUGGESTED THAT THE DOCUMENT MIGHT HAVE BEEN A DESIGN DRAWING FOR AN INVENTION STOP ONE OF OUR FIELD AGENTS TRIED TO FIND OUT WHICH ONE BUT THE NUMBERS LOOKED WRONG STOP PATENT NUMBERS STARTING GB EIGHT HAVE NOT BEEN ISSUED YET STOP THE AGENT HAD NOT SEEN THE PHOTO YOU SENT BUT SHE SHOWED INITIATIVE AND TRIED SOME OTHER NUMBERS STOP GB-SIX-THREE-ZERO-SEVEN-TWO-SIX-A WAS THE MOST PROMISING STOP CHECKED WITH OUR EXPERTS AND THEY WERE CONFUSED STOP ACCORDING TO COCKCROFT THE INVENTION IS IMPRACTICAL STOP SOMEONE POINTED OUT THAT IT FITS WITH THE NAME DIE ALCHEMISTEN STOP SEE ATTACHED STOP WILL INVESTIGATE FURTHER STOP NEXT COMMUNICATION IN SEVEN DAYS STOP\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "(ma, ca, za), score_a = affine_break(sca)\n",
+    "print((ma, ca, za), '\\n')\n",
+    "pa = repunctuate(affine_decipher(sca, ma, ca, za), pta)\n",
+    "print(pa)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "797"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open(plaintext_a_filename, 'w').write(pa)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "(3, 6, True) \n",
+      "\n",
+      "PHIL I HEARD BACK FROM THE BRITISH MILITARY ATTACHE STOP HE SAID THAT THE NUMBER LOOKS LIKE THE FORMAT USED BY THE PATENT OFFICE STOP HE SUGGESTED THAT THE DOCUMENT MIGHT HAVE BEEN A DESIGN DRAWING FOR AN INVENTION STOP ONE OF OUR FIELD AGENTS TRIED TO FIND OUT WHICH ONE BUT THE NUMBERS LOOKED WRONG STOP PATENT NUMBERS STARTING GB EIGHT HAVE NOT BEEN ISSUED YET STOP THE AGENT HAD NOT SEEN THE PHOTO YOU SENT BUT SHE SHOWED INITIATIVE AND TRIED SOME OTHER NUMBERS STOP GB-SIX-THREE-ZERO-SEVEN-TWO-SIX-A WAS THE MOST PROMISING STOP CHECKED WITH OUR EXPERTS AND THEY WERE CONFUSED STOP ACCORDING TO COCKCROFT THE INVENTION IS IMPRACTICAL STOP SOMEONE POINTED OUT THAT IT FITS WITH THE NAME DIE ALCHEMISTEN STOP SEE ATTACHED STOP WILL INVESTIGATE FURTHER STOP NEXT COMMUNICATION IN SEVEN DAYS STOP\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "(mb, cb, zb), score_a = affine_break(scb)\n",
+    "print((mb, cb, z) '\\n')\n",
+    "pa = repunctuate(affine_decipher(sca, ma, ca, za), pta)\n",
+    "print(pa)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "21 \n",
+      "\n",
+      "HARRY,\n",
+      "I AM REALLY SORRY TO BOTHER YOU, BUT SOMETHING HAS COME UP AND THE SIS ARE TOO BUSY TO HELP. I AM HOPING YOU CAN.\n",
+      "FOLLOWING THE INVASION OF POLAND, WE ARE ALL ON DOUBLE DUTY, TRAWLING THROUGH OLD FILES FOR ANYTHING THAT MIGHT BE USEFUL TO OUR FRIENDS IN EUROPE. MY TEAM HAS BEEN ASKED TO LOOK AT INTELLIGENCE FILES CONNECTED WITH AIR TRANSPORT AND I WAS GIVEN THE HINDENBURG DISASTER TO CHECK OUT.\n",
+      "THERE ISN'T MUCH TO GO ON AS MOST OF THE PAPERS RECOVERED FROM THE WRECKAGE WERE BADLY DAMAGED. WE DO HAVE A LARGE NUMBER OF FRAGMENTS OF TRAVEL DOCUMENTS WHICH I HAVE SENT TO THE STATE DEPARTMENT FOR ID CHECKS, BUT THAT WILL TAKE A WHILE, AND IN THE MEANTIME, I HAVE BEEN EXAMINING SOME OF THE MORE UNUSUAL ITEMS.\n",
+      "THE MOST INTERESTING ONE IS A CHARRED ENVELOPE CARRYING A SWASTIKA AND MARKED DIE ALCHEMISTEN. I THINK THAT MIGHT BE WORTH INVESTIGATING.\n",
+      "THE CONTENTS WERE MISSING, BUT IN THE SAME EVIDENCE BAG I FOUND A FRAGMENT OF TORN BLUE PAPER WITH A NUMBER IN THE BOTTOM CORNER. THERE IS NO DESCRIPTION WITH IT, BUT I AM GUESSING THAT THEY MUST HAVE BEEN FOUND TOGETHER. WATER HAS DISSOLVED AND OBSCURED THE NUMBER SO I CAN'T READ IT AND I DON'T RECOGNISE THE FORMAT. ON THE OTHER HAND, THE WATER MUST HAVE PROTECTED IT FROM THE HEAT OF THE FLAMES AS THERE ARE NO BURN MARKS AND I WONDERED IF YOUR X-RAY TEAM MIGHT BE ABLE TO ASSIST.\n",
+      "HAVE YOU SEEN ANYTHING LIKE IT BEFORE, OR HAVE YOU HEARD OF DIE ALCHEMISTEN? ANYTHING YOU HAVE WOULD BE GREAT. THANKS\n",
+      "PHIL\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "k_a, score_b = caesar_break(ca)\n",
+    "print(k_a, '\\n')\n",
+    "pa = caesar_decipher(ca, k_a)\n",
+    "print(pa)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.4"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}