Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save lukecampbell/bee23b7539dbaaff21ef7c03eebba5c5 to your computer and use it in GitHub Desktop.
Save lukecampbell/bee23b7539dbaaff21ef7c03eebba5c5 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So what we know about this substitution cipher is that it is a substitution cipher, and it contains the word liberty. \n",
"\n",
"Luckily for us \"LIBERTY\" contains two of the most frequent characters in the English language, \"E\" and \"T\". So theoretically... the two most frequent characters in the cipher text should translate to \"E\" and \"T\" respectively."
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"\n",
"sns.set(style=\"white\", palette=\"muted\", color_codes=True)"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from collections import Counter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First let's get the frequencies of the characters"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"buf = 'TNFOS FOZSW PZLOC GQAOZ WAGQR PJZPN ABCZP QDOGR AMTHA RAXTB AGZJO GMTHA RAVAP ZW'\n",
"spaceless = buf.replace(' ', '')\n",
"labels, values = zip(*Counter(spaceless).items())\n",
"indexes = np.arange(len(labels))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__Letter Frequencies in the English Language__\n",
"\n",
"![Letter Frequencies](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/English_letter_frequency_%28alphabetic%29.svg/760px-English_letter_frequency_%28alphabetic%29.svg.png)"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAewAAAHsCAYAAAAQKp5gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGthJREFUeJzt3XuQlQX5wPFnYVm8sHhNNrEfODsa02Q1gRNIOhil2KBZ\nQiDjLl4aMyslNFExiazMC9XUmGJaY+jkqGHyR+WkxhhqUI6JUZG3VZBY8Q4rurf394ey4QXlnH2R\nffTz+cs98j77nLNnz3fPu7tna4qiKAIA6NP6be8FAIC3J9gAkIBgA0ACgg0ACQg2ACQg2ACQwFYF\n+/7774+mpqaIiHj88cdj2rRpcdxxx8XcuXO36XIAwCveNthXXXVVnHfeedHR0RERERdeeGHMnDkz\nrr322uju7o7bbrttmy8JAO91bxvsYcOGxWWXXdbz9ooVK2LUqFEREXHIIYfEPffcs+22AwAiYiuC\n/ZnPfCb69+/f8/bmL4y28847x/r167fNZgBAj9pKD+jX73+Nb2tri8GDB5e6ENA7Dz/8cEyfuzjq\n6ht6Pat9/dq4Zs64aGxsLGEzoDcqDvaHPvSh+Otf/xoHHnhg3HnnnTF69OhtsRfQC3X1DTFw8NDt\nvQZQooqDPWvWrPjWt74VHR0d0djYGBMmTNgWewEAm9mqYA8dOjSuv/76iIgYPnx4LFiwYJsuBQC8\nlhdOAYAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAE\nBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBs\nAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBsAEhAsAEg\nAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBsAEhAsAEgAcEGgAQE\nGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwA\nSECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASAB\nwQaABAQbABIQbABIQLABIIHaag4qiiJmz54djz76aPTv3z8uuOCC2HfffcveDQB4VVXPsJcsWRIb\n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\nW69nvZtvJ4BsUgU7IqKuviEGDh7aqxntG1pL2qZvKuM2inj3304AmfgeNgAkINgAkIBgA0ACgg0A\nCQg2ACQg2ACQgGADQAKCDQAJCDYAJCDYAJCAYANAAoINAAkINgAkINgAkIBgA0ACgg0ACQg2ACQg\n2ACQgGADQAKCDQAJCDYAJCDYAJCAYANAAoINAAkINgAkINgAkIBgA0ACgg0ACQg2ACQg2ACQgGAD\nQAKCDQAJCDYAJCDYAJCAYANAAoINAAkINgAkINgAkIBgA0ACtdUc1NnZGeeee2488cQT0dHREaec\nckp86lOfKns3AOBVVQV70aJFsdtuu8XFF18czz//fBx99NGCDQDbUFXBPuKII2LChAkREdHd3R21\ntVWNAQC2UlWl3XHHHSMiYsOGDXH66afHN77xjbf89w8//HA17+YNVq1aVcqcMhVFdyl79cXrxjur\nL96Xytqpq6srampqol+/3v3YTFlzIsq7ncq6jSLKvX7Dhw+P/v37l7AVfUXVT43/+9//xte+9rU4\n7rjj4rOf/exb/tvpcxdHXX1Dte+qR1vrP2LnIR/u9ZwydbSti/N+8WTU1bf1ak5fvG68s/rifanM\nnQbstGevHwfKmrNpVhm3U1m30aadyrh+7evXxjVzxkVjY2Ovd6LvqCrYTz31VJx00klx/vnnx+jR\no9/239fVN8TAwUOreVev0b6htdcztoUyrl9fvW68s/rifamsneoGDekzczbNKkuZj3FlXT/efao6\n7zJ//vx44YUX4mc/+1k0NTVFc3NztLe3l70bAPCqqp5hz549O2bPnl32LgDAFnjhFABIQLABIAHB\nBoAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsA\nEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBsAEhA\nsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsAEhBsAEigdnsvwLtf\nUXTHqlWrSpnV1dUVNTU10a9f777WLGtOWdcLylTW55z7d98i2GxzHW3r4rxfPBl19W29ntXW+o8Y\nsNOeUVff0Gfm7Dzkw72aAWUr63PO/btvEWzeEXX1DTFw8NBez2nf0Bp1g4b0elaZc6AvKuNzzv27\nb/E9bABIQLABIAHBBoAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABI\nQLABIAHBBoAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHB\nBoAEBBsAEhBsAEhAsAEgAcEGgAQEGwASEGwASECwASABwQaABAQbABIQbABIQLABIAHBBoAEBBsA\nEqit5qCiKOLb3/52rFy5Murq6uJ73/tefOADHyh7NwDgVVU9w77tttuivb09rr/++jjjjDPiwgsv\nLHsvAGAzVQX73nvvjYMPPjgiIj760Y/GP/7xj1KXAgBeq6pT4hs2bIj6+vr/Damtje7u7ujX7439\n7+zsjI1PrYzOjc9Uv+WrXnr2keh66blezyprTl/c6d183friTu/m69YXd3o3X7e+uFOZ162jbV20\ntu4WAwcO7PWsd7uGhoaorX1jnqsK9qBBg6Ktra3n7S3FOiJi7dq18czf51fzbgB4FznhBC3YGrff\nfnvss88+b7i8qmB//OMfjz/96U8xYcKE+Pvf/x7777//Fv9tQ0ND3H777dW8GwB4z2loaHjTy2uK\noigqHbb5T4lHRFx44YWx77779m5DAGCLqgo2APDO8sIpAJCAYANAAoINAAls92AvW7YsDjrooGhu\nbo6mpqaYOnVq/Pvf/97q448//vh44IEHIiKio6MjRo0aFb/4xS96/n9TU1NF8yIiVq9eHaeddlo0\nNzfHtGnT4jvf+c5rfo1tayxbtixGjBgRv/vd715z+ZFHHhnnnHNOxbM23UbNzc3xhS98IWbMmBGd\nnZ0VzSnT63eaOnVqXHvttVXPmjlzZqk7NTU1xbHHHhu///3vK57T1NQUS5cufc1l3/ve9+Kmm26q\neNZFF10UTU1NccQRR8Shhx4azc3NMWPGjIrnvNmOjz76aK9m/PznP49PfvKT0d7eXvWMJ554IkaO\nHNlzmzc3N8fPfvazimYsW7YsRo0aFa2trT2XzZs3L377299WvM+b3ZeqmfXXv/615/o0NzfHYYcd\nFlOmTKl4n4iIBx98ML785S/H9OnTY/LkyfHTn/60qjkREVdeeWWccMIJ0dTUFNOnT48VK1ZUPOPu\nu++Oo446qufj3traGkceeWQ8+eSTFc9atWpVnHbaaTF16tSYPn16nHLKKfHQQw9VPIetVGxnS5cu\nLWbOnNnz9pIlS4ovf/nLW338lVdeWfzyl78siqIo7r777mLGjBlFc3NzURRF8fLLLxfjx4+vaJ+X\nXnqpmDhxYrF8+fKey26++eaKdiqKV67XEUccUXz1q1/tuWzlypXFpz/96eLss8+ueNbmt1FRFMXM\nmTOLW2+9taI5RVEUDzzwQHHiiScW06ZNK6ZOnVr86Ec/Ktrb2yue8/qdXn755eLQQw8t1q9f3+tZ\n1Xr9nLa2tuLzn/988a9//auiOYsWLXrNx6i9vb349Kc/XWzcuLHq3RYuXFjMmzev6uNf77jjjise\neeSRXs048sgjiwsvvLBYuHBh1TNWr15dTJkypVd7LF26tBgzZkxxwgkn9Fx26aWXFjfffHNVs15/\nX6p21iZPPfVUcdhhhxX33Xdfxce+8MILxcSJE4vHH3+8KIqi6O7uLr7+9a8X119/fcWzHnroodfc\n1v/617+Kz33ucxXPKYqiuOSSS4o5c+YUHR0dxbRp04q777674hkbN24sJk6cWNx///09ly1fvrxo\namqqaife3nZ/hh3xyq+JbfL888/HHnvssdXHHnTQQfG3v/0tIiLuvPPOmDx5cqxfvz42bNgQ9913\nXxx44IEV7bJ48eL4xCc+EQcccEDPZUcffXQ899xz8cQTT1Q0a8SIEbFmzZrYsGFDREQsWrQojjrq\nqIpmbLL5bdTe3h7r1q2LwYMHVzSjtbU1zjrrrJgzZ05cd9118etf/zoGDBhQ9WvBb77Thg0bora2\nNvr371/VrG1hp512iqlTp8att95a0XGHH354LF26NF5++eWIeOVFDMaOHRs77LDDtlhzu1i2bFkM\nGzYspk6dGtddd12vZhUl/KLJ6NGjY5dddun1LmXts0lnZ2ecdtpp8aUvfSk+9rGPVXz87bffHmPG\njOn540g1NTVx0UUXxTHHHFPxrEGDBsXatWvjpptuitbW1hgxYkTceOONFc+JiJgxY0asWLEivvKV\nr8TYsWNjzJgxFc+44447YvTo0fGRj3yk57IDDjggfvWrX1W1E2+vqhdOKdtf/vKXaG5ujvb29li5\ncmVcdtllW33shz70oXjkkUci4pXTWDNnzowxY8bE3XffHStXrux5zfOttWrVqjf9y2NDhw6NNWvW\nxNChQyuad9hhh8Uf//jH+PznPx/Lly+Pk08+OdasWVPRjIj/3UZPP/109OvXL6ZMmRKjR4+uaMYt\nt9wSX/ziF+P//u//ei776le/GuPHj4/29vaoq6uraqeampoYMGBAnHfeebHjjjtWNGNb22OPPeKf\n//xnRcfU1dXF+PHj449//GNMnDgxFi5cWMop+77kxhtvjEmTJsXw4cOjrq4uli9f/poH3ko89NBD\n0dzcHEVRRE1NTVx66aWx1157VTSjpqYm5syZE5MnT674c/b1Nt0vI16J9xNPPBGnnXZaVbO++93v\nxn777ReTJ0+u6vgnn3zyDY8n1X6ODBkyJC6//PJYsGBBXHbZZbHjjjvGjBkz4rDDDqt4Vm1tbXzx\ni1+MuXPnxgUXXFDVPqtXr45hw4b1vH3qqafG+vXrY926dXHNNdfEkCFDqprLlvWJYI8ZMybmzZsX\nEREtLS0xZcqU+POf/7xVAampqYkRI0bEnXfeGe973/tiwIABcfDBB8fixYtj5cqVMX369Ip2GTJk\nSCxfvvwNlz/22GPx/ve/v6JZNTU1MXHixJgzZ07ss88+ceCBB1b91f+m2+i5556LE0888U1ftu7t\nrF69Og455JA3XL7nnnvGunXrKv5iZPOPW1+1Zs2aLb5q0FuZPHlyXHzxxXHggQfGCy+8ECNGjNgG\n21XmxRdfjIEDB/acxaipqalqzgsvvBB33nlnPPPMM7FgwYLYsGFDXHfddVUHe7/99ivlWdUuu+wS\n55xzTsyaNStGjhxZ9ZzX3y+rvY/+5je/iYceeqhX123vvfd+w/eZV69eHWvXro1Ro0ZVNOvxxx+P\nQYMGxfe///2IiFixYkV86UtfitGjR1d8tm316tVx9dVXxze/+c0488wzY8GCBRXfn97//ve/5g8/\nbfrZhSlTpkRXV1dFs9g6fe6U+O67717x8WPGjIn58+f3xGjkyJGxYsWK6O7urviOPH78+Ljnnnt6\nfpAt4pVnI7vvvntVkdxnn31i48aNsWDBgqpPh29u1113jUsuuSRmz54dTz31VEXH7r333rFq1arX\nXNbd3R1r1qyp6nYvU1mnMV9/mv6GG26ICRMmVDxn//33j7a2tliwYEFVpy+3hbPPPjvuvffe6O7u\njmeffbbqj9ktt9wSkyZNiquvvjquuuqquOGGG2LJkiXx7LPPVjWvzFPQhx56aOy7776xcOHC0mZW\nY/ny5XHllVfGT37yky3+nYStMW7cuFiyZEnP511HR0f84Ac/iAcffLDiWStXroy5c+dGR0dHREQM\nGzYsBg8eXPF+7e3tMXPmzJg9e3ZMnz499t5776p+EG7TY+XmT3Aee+yxaG1trfqLSd5an3iGvXTp\n0mhubo5+/frFiy++GOecc05Fp2fHjh0b559/flxyySURETFgwIDYZZddqnpWtNNOO8Xll18e3//+\n9+P555+Prq6u+OAHPxg//OEPK561yWc/+9lYtGhRDBs2LB5//PGq52zS2NgYzc3N8d3vfjd+/OMf\nb/VxRx99dJx00kkxfvz42HXXXeMb3/hGDBkyJMaOHbvdT2XfddddMWnSpJ7TqvPmzXvN6battfl9\nqaurK04//fQYPnx4VTsdc8wxcckll8TixYurOr5sJ554YlxwwQVRU1MTEyZMqPiL0U1+85vfxMUX\nX9zz9g477BCHH3543HjjjXHyySdXPK/sB+dzzz03/vKXv5Q2r5r9fvzjH0dRFD0/0V8URey8885x\nxRVXVDRn0KBBcdFFF8V5550XRVFEW1tbfOpTn4pjjz224p0+85nPxCOPPBKTJk2KnXfeObq7u2PW\nrFkxaNCgiuZcfPHFMWrUqJ5vPZx//vlxzDHHxJgxYyr6mZ+ddtoprrjiirj00ktj3bp10dnZGbW1\ntXHuuedWfDaSreOlSd9j/vnPf8a8efNi48aN8dJLL8Wee+4Z9fX1cf7558cuu+yyvdcDYAsEm/jP\nf/4TH/jAB7b7s2wAtkywASCBPvFDZwDAWxNsAEhAsAEgAcEGgAQEGwASEGwASOD/ARTE6jERSkz/\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1150cf2e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Set up the matplotlib figure\n",
"f, ax = plt.subplots(1, 1, figsize=(7, 7), sharex=True)\n",
"sns.despine(left=True)\n",
"ax.bar(indexes, values, 1)\n",
"ax.set_xticks(indexes + 0.5)\n",
"ax.set_xticklabels(labels)\n",
"plt.setp(axes, yticks=[])\n",
"plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.core.display import display, HTML"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's set up a decryption function so we can see our progress"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def decrypt(buf, descryption_map):\n",
"\n",
" out_buf = []\n",
" for char in buf:\n",
" if char in decryption_map:\n",
" char = '<font color=\"blue\">{}</font>'.format(decryption_map[char])\n",
" if char == '\\n':\n",
" char = '<p>'\n",
" out_buf.append(char)\n",
" return ''.join(out_buf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The letters with the highest frequencies are 'A' and 'Z'. What happens if we substitute those?"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"TNFOS FO<font color=\"blue\">T</font>SW P<font color=\"blue\">T</font>LOC GQ<font color=\"blue\">E</font>O<font color=\"blue\">T</font> W<font color=\"blue\">E</font>GQR PJ<font color=\"blue\">T</font>PN <font color=\"blue\">E</font>BC<font color=\"blue\">T</font>P QDOGR <font color=\"blue\">E</font>MTH<font color=\"blue\">E</font> R<font color=\"blue\">E</font>XTB <font color=\"blue\">E</font>G<font color=\"blue\">T</font>JO GMTH<font color=\"blue\">E</font> R<font color=\"blue\">E</font>V<font color=\"blue\">E</font>P <font color=\"blue\">T</font>W"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"decryption_map = {\n",
" 'A': 'E',\n",
" 'Z': 'T'\n",
"}\n",
"HTML(decrypt(buf, decryption_map))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The other clue we have to work with is we know LIBERTY appears in the plaintext. Well there are two possible places in this half-translated ciphertext where LIBERTY could exist because of the distance between E and T which are\n",
"\n",
"CGQ<font color=\"blue\">E</font>O<font color=\"blue\">T</font>W\n",
"\n",
"and\n",
"\n",
"XTB<font color=\"blue\">E</font>G<font color=\"blue\">T</font>J\n",
"\n",
"Let's try to attack the first."
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"TNF<font color=\"blue\">R</font>S F<font color=\"blue\">R</font><font color=\"blue\">T</font>S<font color=\"blue\">Y</font> P<font color=\"blue\">T</font>L<font color=\"blue\">R</font><font color=\"blue\">L</font> <font color=\"blue\">I</font><font color=\"blue\">B</font><font color=\"blue\">E</font><font color=\"blue\">R</font><font color=\"blue\">T</font> <font color=\"blue\">Y</font><font color=\"blue\">E</font><font color=\"blue\">I</font><font color=\"blue\">B</font>R PJ<font color=\"blue\">T</font>PN <font color=\"blue\">E</font>B<font color=\"blue\">L</font><font color=\"blue\">T</font>P <font color=\"blue\">B</font>D<font color=\"blue\">R</font><font color=\"blue\">I</font>R <font color=\"blue\">E</font>MTH<font color=\"blue\">E</font> R<font color=\"blue\">E</font>XTB <font color=\"blue\">E</font><font color=\"blue\">I</font><font color=\"blue\">T</font>J<font color=\"blue\">R</font> <font color=\"blue\">I</font>MTH<font color=\"blue\">E</font> R<font color=\"blue\">E</font>V<font color=\"blue\">E</font>P <font color=\"blue\">T</font><font color=\"blue\">Y</font>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"decryption_map = {\n",
" 'C': 'L',\n",
" 'G': 'I',\n",
" 'Q': 'B',\n",
" 'A': 'E',\n",
" 'O': 'R',\n",
" 'Z': 'T',\n",
" 'W': 'Y'\n",
"}\n",
"HTML(decrypt(buf, decryption_map))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Yeah not quite making sense... what about the other one."
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<font color=\"blue\">I</font>NFOS FO<font color=\"blue\">T</font>SW P<font color=\"blue\">T</font>LOC <font color=\"blue\">R</font>Q<font color=\"blue\">E</font>O<font color=\"blue\">T</font> W<font color=\"blue\">E</font><font color=\"blue\">R</font>QR P<font color=\"blue\">Y</font><font color=\"blue\">T</font>PN <font color=\"blue\">E</font><font color=\"blue\">B</font>C<font color=\"blue\">T</font>P QDO<font color=\"blue\">R</font>R <font color=\"blue\">E</font>M<font color=\"blue\">I</font>H<font color=\"blue\">E</font> R<font color=\"blue\">E</font><font color=\"blue\">L</font><font color=\"blue\">I</font><font color=\"blue\">B</font> <font color=\"blue\">E</font><font color=\"blue\">R</font><font color=\"blue\">T</font><font color=\"blue\">Y</font>O <font color=\"blue\">R</font>M<font color=\"blue\">I</font>H<font color=\"blue\">E</font> R<font color=\"blue\">E</font>V<font color=\"blue\">E</font>P <font color=\"blue\">T</font>W"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"decryption_map = {\n",
" 'X': 'L',\n",
" 'T': 'I',\n",
" 'B': 'B',\n",
" 'A': 'E',\n",
" 'G': 'R',\n",
" 'Z': 'T',\n",
" 'J': 'Y'\n",
"}\n",
"\n",
"HTML(decrypt(buf, decryption_map))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's looking better. There's a famous line in American History from Patrick Henry: _Give me liberty or give me death._ That last bit has the same characters as the phrase. Let's attack it!"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<font color=\"blue\">I</font>NF<font color=\"blue\">O</font>S F<font color=\"blue\">O</font><font color=\"blue\">T</font>S<font color=\"blue\">H</font> <font color=\"blue\">A</font><font color=\"blue\">T</font>L<font color=\"blue\">O</font>C <font color=\"blue\">R</font>Q<font color=\"blue\">E</font><font color=\"blue\">O</font><font color=\"blue\">T</font> <font color=\"blue\">H</font><font color=\"blue\">E</font><font color=\"blue\">R</font>Q<font color=\"blue\">M</font> <font color=\"blue\">A</font><font color=\"blue\">Y</font><font color=\"blue\">T</font><font color=\"blue\">A</font>N <font color=\"blue\">E</font><font color=\"blue\">B</font>C<font color=\"blue\">T</font><font color=\"blue\">A</font> QD<font color=\"blue\">O</font><font color=\"blue\">R</font><font color=\"blue\">M</font> <font color=\"blue\">E</font><font color=\"blue\">G</font><font color=\"blue\">I</font><font color=\"blue\">V</font><font color=\"blue\">E</font> <font color=\"blue\">M</font><font color=\"blue\">E</font><font color=\"blue\">L</font><font color=\"blue\">I</font><font color=\"blue\">B</font> <font color=\"blue\">E</font><font color=\"blue\">R</font><font color=\"blue\">T</font><font color=\"blue\">Y</font><font color=\"blue\">O</font> <font color=\"blue\">R</font><font color=\"blue\">G</font><font color=\"blue\">I</font><font color=\"blue\">V</font><font color=\"blue\">E</font> <font color=\"blue\">M</font><font color=\"blue\">E</font><font color=\"blue\">D</font><font color=\"blue\">E</font><font color=\"blue\">A</font> <font color=\"blue\">T</font><font color=\"blue\">H</font>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"decryption_map = {\n",
" 'X': 'L',\n",
" 'T': 'I',\n",
" 'B': 'B',\n",
" 'A': 'E',\n",
" 'G': 'R',\n",
" 'Z': 'T',\n",
" 'J': 'Y',\n",
" 'O': 'O',\n",
" 'M': 'G',\n",
" 'H': 'V',\n",
" 'R': 'M',\n",
" 'V': 'D',\n",
" 'P': 'A',\n",
" 'W': 'H'\n",
"}\n",
"\n",
"HTML(decrypt(buf, decryption_map))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The full decryption is"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<font color=\"blue\">I</font><font color=\"blue\">K</font><font color=\"blue\">N</font><font color=\"blue\">O</font><font color=\"blue\">W</font> <font color=\"blue\">N</font><font color=\"blue\">O</font><font color=\"blue\">T</font><font color=\"blue\">W</font><font color=\"blue\">H</font> <font color=\"blue\">A</font><font color=\"blue\">T</font><font color=\"blue\">C</font><font color=\"blue\">O</font><font color=\"blue\">U</font> <font color=\"blue\">R</font><font color=\"blue\">S</font><font color=\"blue\">E</font><font color=\"blue\">O</font><font color=\"blue\">T</font> <font color=\"blue\">H</font><font color=\"blue\">E</font><font color=\"blue\">R</font><font color=\"blue\">S</font><font color=\"blue\">M</font> <font color=\"blue\">A</font><font color=\"blue\">Y</font><font color=\"blue\">T</font><font color=\"blue\">A</font><font color=\"blue\">K</font> <font color=\"blue\">E</font><font color=\"blue\">B</font><font color=\"blue\">U</font><font color=\"blue\">T</font><font color=\"blue\">A</font> <font color=\"blue\">S</font><font color=\"blue\">F</font><font color=\"blue\">O</font><font color=\"blue\">R</font><font color=\"blue\">M</font> <font color=\"blue\">E</font><font color=\"blue\">G</font><font color=\"blue\">I</font><font color=\"blue\">V</font><font color=\"blue\">E</font> <font color=\"blue\">M</font><font color=\"blue\">E</font><font color=\"blue\">L</font><font color=\"blue\">I</font><font color=\"blue\">B</font> <font color=\"blue\">E</font><font color=\"blue\">R</font><font color=\"blue\">T</font><font color=\"blue\">Y</font><font color=\"blue\">O</font> <font color=\"blue\">R</font><font color=\"blue\">G</font><font color=\"blue\">I</font><font color=\"blue\">V</font><font color=\"blue\">E</font> <font color=\"blue\">M</font><font color=\"blue\">E</font><font color=\"blue\">D</font><font color=\"blue\">E</font><font color=\"blue\">A</font> <font color=\"blue\">T</font><font color=\"blue\">H</font>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"decryption_map = {\n",
" 'A': 'E',\n",
" 'Z': 'T',\n",
" 'X': 'L',\n",
" 'T': 'I',\n",
" 'B': 'B',\n",
" 'G': 'R',\n",
" 'J': 'Y',\n",
" 'O': 'O',\n",
" 'M': 'G',\n",
" 'H': 'V',\n",
" 'R': 'M',\n",
" 'V': 'D',\n",
" 'P': 'A',\n",
" 'W': 'H',\n",
" 'D': 'F',\n",
" 'Q': 'S',\n",
" 'C': 'U',\n",
" 'N': 'K',\n",
" 'L': 'C',\n",
" 'F': 'N',\n",
" 'S': 'W'\n",
"}\n",
"\n",
"HTML(decrypt(buf, decryption_map))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" I KNOW NOT WHAT COURSE OTHERS MAY TAKE BUT AS FOR ME GIVE ME LIBERTY OR GIVE ME DEATH"
]
}
],
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment