e9594884612e48d83b6debeb099343d5e3a7e47c
[cipher-tools.git] / 2014 / 2014-challenge3.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 2,
6 "metadata": {
7 "collapsed": false
8 },
9 "outputs": [],
10 "source": [
11 "import os,sys,inspect\n",
12 "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
13 "parentdir = os.path.dirname(currentdir)\n",
14 "sys.path.insert(0,parentdir) \n",
15 "\n",
16 "import matplotlib.pyplot as plt\n",
17 "import pandas as pd\n",
18 "import collections\n",
19 "import string\n",
20 "%matplotlib inline\n",
21 "\n",
22 "from cipherbreak import *\n",
23 "\n",
24 "c3a = open('3a.ciphertext').read()\n",
25 "c3b = open('3b.ciphertext').read()"
26 ]
27 },
28 {
29 "cell_type": "code",
30 "execution_count": 3,
31 "metadata": {
32 "collapsed": false
33 },
34 "outputs": [
35 {
36 "data": {
37 "text/plain": [
38 "<matplotlib.axes._subplots.AxesSubplot at 0x7f809e4fc208>"
39 ]
40 },
41 "execution_count": 3,
42 "metadata": {},
43 "output_type": "execute_result"
44 },
45 {
46 "data": {
47 "image/png": "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\n",
48 "text/plain": [
49 "<matplotlib.figure.Figure at 0x7f809e51ea58>"
50 ]
51 },
52 "metadata": {},
53 "output_type": "display_data"
54 }
55 ],
56 "source": [
57 "freqs = pd.Series(english_counts)\n",
58 "freqs.plot(kind='bar')"
59 ]
60 },
61 {
62 "cell_type": "code",
63 "execution_count": 4,
64 "metadata": {
65 "collapsed": false
66 },
67 "outputs": [
68 {
69 "data": {
70 "text/plain": [
71 "((11, 1, True), -839.4977013876568)"
72 ]
73 },
74 "execution_count": 4,
75 "metadata": {},
76 "output_type": "execute_result"
77 }
78 ],
79 "source": [
80 "key_a, score = affine_break(c3a)\n",
81 "key_a, score"
82 ]
83 },
84 {
85 "cell_type": "code",
86 "execution_count": 5,
87 "metadata": {
88 "collapsed": false
89 },
90 "outputs": [
91 {
92 "name": "stdout",
93 "output_type": "stream",
94 "text": [
95 "harry you asked me about the flag day associates they area transnational hacking group dedicated to the overthrow of western capitalism they have been implicated in several major protests including an attempt to takeover the uk national grid attacks on reservoir systems and interference in bank trading networks it looks like the fda carried out fairly extensive modifications to the ship they did a good job too we hadnt noticed the added bulkheads until we compared the layout with the plans from lloyds register they seem to be there to add rigidity though there is one additional panel at the stern that doesnt fit the pattern and we will be removing that tonight to see what it is there for we would have done it this afternoon but decided we should conduct our own hull survey in case there is a booby trap\n"
96 ]
97 }
98 ],
99 "source": [
100 "print(' '.join(segment(affine_decipher(sanitise(c3a), key_a[0], key_a[1]))))"
101 ]
102 },
103 {
104 "cell_type": "code",
105 "execution_count": 6,
106 "metadata": {
107 "collapsed": false
108 },
109 "outputs": [
110 {
111 "data": {
112 "text/plain": [
113 "(('seahorse', <KeywordWrapAlphabet.from_last: 2>), -681.3308426043137)"
114 ]
115 },
116 "execution_count": 6,
117 "metadata": {},
118 "output_type": "execute_result"
119 }
120 ],
121 "source": [
122 "key_b, score = keyword_break_mp(c3b)\n",
123 "key_b, score"
124 ]
125 },
126 {
127 "cell_type": "code",
128 "execution_count": 7,
129 "metadata": {
130 "collapsed": false
131 },
132 "outputs": [
133 {
134 "name": "stdout",
135 "output_type": "stream",
136 "text": [
137 "phase three the nautilus system was fully tested last night with complete success we sailed within four hundred metres of the target and monitored all radio traffic for two hours with no sign that we were being watched or were even noticed we then conducted a full radar sweep of the area and found three dead spots where we could work on the ship without detection as planned we converted the two adjacent empty containers in the middle of the stack into a large workshop area and carried out a full inspection drill now even if we are boarded our work should remain undetected we retrieved seahorse from the third container and carried out stage one of the assembly\n"
138 ]
139 }
140 ],
141 "source": [
142 "print(' '.join(segment(sanitise(keyword_decipher(c3b, key_b[0], key_b[1])))))"
143 ]
144 },
145 {
146 "cell_type": "code",
147 "execution_count": 8,
148 "metadata": {
149 "collapsed": false
150 },
151 "outputs": [
152 {
153 "data": {
154 "text/plain": [
155 "<matplotlib.axes._subplots.AxesSubplot at 0x7f809e35e438>"
156 ]
157 },
158 "execution_count": 8,
159 "metadata": {},
160 "output_type": "execute_result"
161 },
162 {
163 "data": {
164 "image/png": "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\nRK5CYII=\n",
165 "text/plain": [
166 "<matplotlib.figure.Figure at 0x7f809e35e4e0>"
167 ]
168 },
169 "metadata": {},
170 "output_type": "display_data"
171 }
172 ],
173 "source": [
174 "freqs_3b = pd.Series(collections.Counter([l.lower() for l in c3b if l in string.ascii_letters]))\n",
175 "freqs_3b.plot(kind='bar')"
176 ]
177 },
178 {
179 "cell_type": "code",
180 "execution_count": null,
181 "metadata": {
182 "collapsed": false
183 },
184 "outputs": [],
185 "source": []
186 }
187 ],
188 "metadata": {
189 "kernelspec": {
190 "display_name": "Python 3",
191 "language": "python",
192 "name": "python3"
193 },
194 "language_info": {
195 "codemirror_mode": {
196 "name": "ipython",
197 "version": 3
198 },
199 "file_extension": ".py",
200 "mimetype": "text/x-python",
201 "name": "python",
202 "nbconvert_exporter": "python",
203 "pygments_lexer": "ipython3",
204 "version": "3.4.3"
205 }
206 },
207 "nbformat": 4,
208 "nbformat_minor": 0
209 }