From 5ebfd5a5a0551ce92fbf8dc23594b4575e373561 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Mon, 13 Oct 2014 10:53:20 +0100 Subject: [PATCH] Solved 2014 challenges 1 and 2 --- challenge6.ipynb => 2013-challenge6.ipynb | 0 challenge7.ipynb => 2013-challenge7.ipynb | 0 2014-challenge1.ipynb | 136 ++++++++++++++++ 2014-challenge2.ipynb | 188 ++++++++++++++++++++++ 4 files changed, 324 insertions(+) rename challenge6.ipynb => 2013-challenge6.ipynb (100%) rename challenge7.ipynb => 2013-challenge7.ipynb (100%) create mode 100644 2014-challenge1.ipynb create mode 100644 2014-challenge2.ipynb diff --git a/challenge6.ipynb b/2013-challenge6.ipynb similarity index 100% rename from challenge6.ipynb rename to 2013-challenge6.ipynb diff --git a/challenge7.ipynb b/2013-challenge7.ipynb similarity index 100% rename from challenge7.ipynb rename to 2013-challenge7.ipynb diff --git a/2014-challenge1.ipynb b/2014-challenge1.ipynb new file mode 100644 index 0000000..00f9ccc --- /dev/null +++ b/2014-challenge1.ipynb @@ -0,0 +1,136 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:238ee41cd65ee30b21b8e31cf8256253cda5ffb52bd978fe39c5c022b8eaa509" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "from cipherbreak import *\n", + "\n", + "c1a = open('2014/1a.ciphertext').read()\n", + "c1b = open('2014/1b.ciphertext').read()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "key_a, score = caesar_break(c1a)\n", + "key_a, score" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "(4, -728.156672407534)" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print(caesar_decipher(c1a, key_a))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "MARK, \n", + "\n", + "THANKS FOR BRINGING ME IN ON THIS ONE, SEEMS LIKE A FASCINATING CASE. \n", + "\n", + "I HAVE THREE QUESTIONS: \n", + "WHY WOULD THE FLAG DAY ASSOCIATES WANT A SHIP? \n", + "WHY WOULD THEY WANT THIS SHIP? \n", + "WHY WOULD THEY WANT THIS SHIP NOW? \n", + "\n", + "HAVING READ THE ATTACHED DOCUMENT I SUSPECT THAT THE ANSWERS ARE ALL RELATED TO THE QUESTION OF WHAT EXACTLY SHE AND HER FLAG DAY ASSOCIATE CREW WERE TRYING TO SURVEY. \n", + "\n", + "I AM GUESSING THAT YOU ALREADY CHECKED OUT THE ONBOARD GPS SYSTEM FOR INFORMATION ABOUT HER MOVEMENTS, BUT IF YOU DID FIND ANYTHING I WOULD BE FASCINATED TO HEAR ABOUT IT. IN THE MEANTIME I AM PRETTY SURE THAT YOU KNOW MORE ABOUT THE FLAG DAY ASSOCIATES THAN YOU HAVE TOLD ME, SO A BRIEFING WOULD BE MUCH APPRECIATED. \n", + "\n", + "ALL THE BEST, \n", + "\n", + "HARRY \n", + "\n" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "key_b, score = caesar_break(c1b)\n", + "key_b, score" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 10, + "text": [ + "(22, -637.7038880633795)" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "report on the trojan project having drugged the crew we were able to take the ship with essentially no resistance the crew were handed to the somali pirates at the deepwater rendezvous as planned and we began the survey just after midnight the radar showed an approaching vessel which our database identified as a coastguard cutter we headed south to avoid detection with all ship lights off we then completed the survey in the new location afterdawn with the listening post installed we began assembling the equipment for phase two of the operation keeping a watch for further patrols in the sky and on the water\n" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/2014-challenge2.ipynb b/2014-challenge2.ipynb new file mode 100644 index 0000000..4e5eeff --- /dev/null +++ b/2014-challenge2.ipynb @@ -0,0 +1,188 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:95cdf1235b4fe6238989ec008feb03cf628e9bfb2e2d10e7949b2aaa237928c4" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import collections\n", + "import string\n", + "%matplotlib inline\n", + "\n", + "from cipherbreak import *\n", + "\n", + "c2a = open('2014/2a.ciphertext').read()\n", + "c2b = open('2014/2b.ciphertext').read()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 18 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "freqs = pd.Series(english_counts)\n", + "freqs.plot(kind='bar')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 26, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 26 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "key_a, score = affine_break(c2a)\n", + "key_a, score" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 5, + "text": [ + "((5, 25, True), -761.8388033231918)" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print(affine_decipher(c2a, key_a[0], key_a[1]))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "DEAR MARK, \n", + "\n", + "THANKS FOR THE LATEST REPORT FROM THE ON-SITE TEAM. IT SHOWS THAT THE SHIPBOARD GPS SYSTEM WAS COMPLETELY SCRAMBLED SO WE ARE NOT GOING TO BE ABLE TO TRACE HER MOVEMENTS FROM THAT. DO WE HAVE ANY ODD TRACES FROM ONSHORE RADAR THAT GIVE A HINT OF WHERE SHE MIGHT HAVE BEEN? \n", + "\n", + "THE COMMENT IN THE LAST MESSAGE THAT THE PIRATES COMPLETED THE SURVEY EVEN THOUGH THEY HAD MOVED SOUTH TO AVOID DETECTION SHOULD HAVE TOLD ME THAT THE SURVEY WAS NOT GEOGRAPHIC. AT FIRST I THOUGHT IT MIGHT HAVE BEEN REFERRING TO A TELECOMS SURVEY SINCE YOU MENTIONED THE LONG AERIAL, BUT ACTUALLY THE ATTACHED MESSAGE IS VERY REVEALING. STILL NOT SURE WHAT THE SURVEY WAS FOR THOUGH, AND HOW THAT IS CONNECTED TO THE MISSING SUPERSTRUCTURE. CAN YOU GET ME ANY PICTURES? \n", + "\n", + "HARRY \n", + "\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "key_b, score = keyword_break_mp(c2b)\n", + "key_b, score" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "(('flag', ), -367.81492429457404)" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "print(' '.join(segment(sanitise(keyword_decipher(c2b, key_b[0], key_b[1])))))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "calm weather allowed us to complete the hull survey and establish its integrity no major remedial works were required and the pumps and extra bulkheads were installed out in deep waters over the next five days we are now testing the system for reliability and safety before moving on to phase three of the operation operation trojan remains on target\n" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "freqs_2b = pd.Series(collections.Counter([l.lower() for l in c2b if l in string.ascii_letters]))\n", + "freqs_2b.plot(kind='bar')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 24, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file -- 2.34.1