Done challenges 1 and 2
[cipher-tools.git] / 2020-early / 2020-a-challenge1.ipynb
diff --git a/2020-early/2020-a-challenge1.ipynb b/2020-early/2020-a-challenge1.ipynb
new file mode 100644 (file)
index 0000000..4834440
--- /dev/null
@@ -0,0 +1,173 @@
+{
+ "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 *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "challenge_number = 1\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": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ca = open(ciphertext_a_filename).read()\n",
+    "cb = open(ciphertext_b_filename).read()\n"
+   ]
+  },
+  {
+   "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_a = caesar_break(ca)\n",
+    "print(k_a, '\\n')\n",
+    "pa = caesar_decipher(ca, k_a)\n",
+    "print(pa)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1466"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open(plaintext_a_filename, 'w').write(pa)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "8 \n",
+      "\n",
+      "PHIL, IT IS GOOD TO HEAR FROM YOU. THINGS ARE HECTIC HERE TOO, BUT IT IS MAINLY BUREAUCRACY AS WE TRY TO MAKE SURE ALL THE BOSS FIELD AGENTS HAVE SECURE CHANNELS OF COMMUNICATION AND ROUTES OUT OF TROUBLE IF THEY NEED THEM. IT IS ESSENTIAL WORK, BUT I HAVE BEEN ITCHING TO GET OUT THERE WITH THEM AND YOUR LETTER CAME AT THE RIGHT TIME.\n",
+      "I HAVEN'T HEARD OF DIE ALCHEMISTEN BEFORE, BUT IT DOES REMIND ME OF SOMETHING THAT I CAN'T QUITE PLACE. I WILL GET BACK TO YOU IF I REMEMBER. THE NUMBER IS SLIGHTLY EASIER. THIS LOOKS LIKE THE BOTTOM RIGHT CORNER OF A BLUEPRINT AND I ASSUME THE NUMBER IS RELATED TO THE DESIGN. THE X-RAY TEAM TOOK A SNAP WHICH INCREASED THE CONTRAST AND I THINK I CAN MAKE OUT THE LETTERS GB AT THE START, WHICH IS SUGGESTIVE. THE NEXT TWO DIGITS ARE NOT CLEAR, BUT THEY COULD BE EIGHT-THREE OR EIGHT-FIVE. I HAVE SENT A REQUEST TO THE UK MILITARY ATTACHE TO SEE IF HE RECOGNISES THE FORMAT.\n",
+      "I WILL BE IN TOUCH IN SEVEN DAYS.\n",
+      "HARRY\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "k_b, score_b = caesar_break(cb)\n",
+    "print(k_b, '\\n')\n",
+    "pb = caesar_decipher(cb, k_b)\n",
+    "print(pb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "953"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open(plaintext_b_filename, 'w').write(pb)"
+   ]
+  },
+  {
+   "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
+}