Skip to content

Instantly share code, notes, and snippets.

@renxida
Created March 30, 2019 18:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save renxida/ee7ee2cfc0619137411f20bd91d4f13f to your computer and use it in GitHub Desktop.
Save renxida/ee7ee2cfc0619137411f20bd91d4f13f to your computer and use it in GitHub Desktop.
HW4 Netsec Xida Ren
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import numpy as np\nfrom matplotlib import pyplot as plt",
"execution_count": 1,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 1A Implementing OTP"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "# Encoding & decoding one-time-pad with unicode support\ndef crypt(msg, pad):\n duped_pad = pad\n while len(msg) > len(duped_pad):\n duped_pad = duped_pad + pad\n return ''.join(\n chr(ord(s) ^ ord(p))\n for s, p\n in zip(msg, duped_pad))",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "message = '打倒地主富农and some more stuff to create a healthy mix of english and non-ascii characters'\npad = '创建小康社会 plus some english'",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "cypher = crypt(message, pad)\nprint('cypher:')\nprint('\\n\\n', cypher, '\\n\\n')\nplain = crypt(cypher, pad)\nprint('decrypted:\\n\\n')\nprint(plain)",
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": "cypher:\n\n\n え໨ିႌ⋲ẆA\u001e\bU\u0000O\u001e\nM\bO\u0017\u000bG\u001f\u001d\u0006\u000e剽廚屻廘礞佹R\u0015\r\u0001\u0016\u0000\u0012O\u0005\u0000A\t\u001a\u000f\u0015I\u001e\u0001剣廚屠廑礞使N\u0017\u0000\u001c\u0000HS\u000e\u0003\u0001\u0000\u000b\u0001\tA\b\u0000\u000b割库尯廔祖佻R\u0011\u000f\u0001\u0016R\u0000 \n\n\ndecrypted:\n\n\n打倒地主富农and some more stuff to create a healthy mix of english and non-ascii characters\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "And now for the assigned task"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "pad = 'avxjdsldkfjehsdfjlsdkrlhnvsfdojsldfsifysdfjosduhfpofjpwehjbksdjfbksf'\nmessage = 'Xida Ren, xren@email.wm.edu'\ncypher = crypt(message, pad)\nprint('cypher:')\nprint('\\n\\n', cypher, '\\n\\n')\nplain = crypt(cypher, pad)\nprint('decrypted:\\n\\n')\nprint(plain)",
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": "cypher:\n\n\n 9\u001f\u001c\u000bD!\t\nGF\u0012\u0017\r\u001d$\u0003\u0007\r\u001a\bE\u0005\u0001F\u000b\u0012\u0006 \n\n\ndecrypted:\n\n\nXida Ren, xren@email.wm.edu\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 1B security of public pad"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "no. Anyone in the class would be able to read my message. \n\nAdditionally, the same pad is used by all the students, which might generate enough cyphertext for an attacker to figure out the pad.\n\nWorse, the message is predictable. It's name-email for everyone. If an attacker knows who sent a message, she may easily use the sender's name and email to reverse out the pad.\n\nA better scheme also using one-time pads would be to use a different pad for each student. Or, best, to use an actual public-private key system."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 2 reversing the custom constant-key many-time pad"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 2A Reversing by brute-forcing the 256 key possibilities"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We try all 256 possible keys, and then see if the result looks like english."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# cyphertext\nct_b64 = b'HFV3eno2e3M2X2V+e3dzejg2NkV5e3M2b3N3ZGU2d3F5NjZ4c2BzZDZ7f3hyNn55YTZ6eXhxHGZkc3V/ZXN6bzY2fndgf3hxNnp/YmJ6czZ5ZDZ4eTZ7eXhzbzZ/eDZ7bzZmY2Rlczo2d3hyNnh5Yn5/eHEcZndkYn91Y3p3ZDZieTZ/eGJzZHNlYjZ7czZ5eDZlfnlkczo2XzZifnljcX5iNl82YXljenI2ZXd/ejZ3dHljYjZ3HHp/YmJ6czZ3eHI2ZXNzNmJ+czZhd2JzZG82ZndkYjZ5cDZifnM2YXlkenI4NjZfYjZ/ZTZ3NmF3bzZfNn53YHM2eXAccmR/YH94cTZ5cHA2Yn5zNmVmenNzeDZ3eHI2ZHNxY3p3Yn94cTZifnM2dX9kdWN6d2J/eXg4NjZBfnN4c2BzZDZfHHB/eHI2e29lc3pwNnFkeWF/eHE2cWR/ezZ3dHljYjZifnM2e3ljYn4tNmF+c3hzYHNkNn9iNn9lNnc2cnd7ZjoccmR/bGx6bzZYeWBze3RzZDZ/eDZ7bzZleWN6LTZhfnN4c2BzZDZfNnB/eHI2e29lc3pwNn94YHl6Y3hid2R/em8cZndjZX94cTZ0c3B5ZHM2dXlwcH94NmF3ZHN+eWNlc2U6Nnd4cjZ0ZH94cX94cTZjZjZifnM2ZHN3ZDZ5cDZzYHNkbxxwY3hzZHd6Nl82e3NzYi02d3hyNnNlZnN1f3d6em82YX5zeHNgc2Q2e282fm9meWU2cXNiNmVjdX42d3g2Y2Zmc2Qcfnd4cjZ5cDZ7czo2Yn53YjZ/YjZkc2djf2RzZTZ3NmViZHl4cTZ7eWR3ejZmZH94dX9menM2Ynk2ZmRzYHN4YjZ7cxxwZHl7NnJzen90c2R3YnN6bzZlYnNmZn94cTZ/eGJ5NmJ+czZlYmRzc2I6Nnd4cjZ7c2J+eXJ/dXd6em82fXh5dX1/eHEcZnN5ZnpzMWU2fndiZTZ5cHA2NmJ+c3g6Nl82d3V1eWN4YjZ/YjZ+f3F+NmJ/e3M2Ynk2cXNiNmJ5NmVzdzZ3ZTZleXl4HHdlNl82dXd4ODY2Qn5/ZTZ/ZTZ7bzZlY3RlYn9iY2JzNnB5ZDZmf2VieXo2d3hyNnR3eno4NjZBf2J+NnccZn5/enlleWZ+f3V3ejZwenljZH9lfjZVd2J5NmJ+ZHlhZTZ+f3tlc3pwNmNmeXg2fn9lNmVheWRyLTZfNmdjf3Niem8cYnd9czZieTZifnM2ZX5/Zjg2NkJ+c2RzNn9lNnh5Yn5/eHE2ZWNkZmR/ZX94cTZ/eDZifn9lODY2X3A2Yn5zbzZ0Y2IcfXhzYTZ/Yjo2d3p7eWViNnd6ejZ7c3g2f3g2Yn5zf2Q2cnNxZHNzOjZleXtzNmJ/e3M2eWQ2eWJ+c2Q6NnV+c2R/ZX4cYHNkbzZ4c3dkem82Yn5zNmV3e3M2cHNzen94cWU2Ynlhd2RyZTZifnM2eXVzd3g2YX9ifjZ7czgcHEJ+c2RzNnh5YTZ/ZTZveWNkNn94ZWN6d2Q2dX9ibzZ5cDZifnM2W3d4fndiYnlzZTo2dHN6YnNyNmR5Y3hyNnRvHGF+d2Rgc2U2d2U2X3hyf3d4Nn9lenNlNnRvNnV5ZHd6NmRzc3BlNjZ1eXt7c2R1czZlY2RkeWN4cmU2f2I2YX9ifhx+c2Q2ZWNkcDg2NkR/cX5iNnd4cjZ6c3BiOjZifnM2ZWJkc3NiZTZid31zNm95YzZhd2JzZGF3ZHI4NjZfYmUcc25iZHN7czZyeWF4YnlheDZ/ZTZifnM2dHdiYnNkbzo2YX5zZHM2Yn53YjZ4eXR6czZ7eXpzNn9lNmF3ZX5zcjZ0bxxhd2BzZTo2d3hyNnV5eXpzcjZ0bzZ0ZHNzbHNlOjZhfn91fjZ3NnBzYTZ+eWNkZTZmZHNgf3ljZTZhc2RzNnljYjZ5cBxlf3F+YjZ5cDZ6d3hyODY2Wnl5fTZ3YjZifnM2dWR5YXJlNnlwNmF3YnNkNnF3bHNkZTZifnNkczgcHFV/ZHVje3d7dGN6d2JzNmJ+czZ1f2JvNnlwNnc2cmRzd3tvNkV3dHR3Yn42d3Bic2R4eXl4ODY2UXk2cGR5exxVeWR6c3dkZTZeeXl9NmJ5NlV5c3hif3NlNkV6f2Y6Nnd4cjZwZHl7NmJ+c3h1czo2dG82QX5/YnN+d3p6Ohx4eWRifmF3ZHI4NjZBfndiNnJ5Nm95YzZlc3MpNjZGeWVic3I2en99czZlf3pzeGI2ZXN4Yn94c3plNnd6ejZ3ZHljeHIcYn5zNmJ5YXg6NmVid3hyNmJ+eWNld3hyZTZjZnl4NmJ+eWNld3hyZTZ5cDZ7eWRid3o2e3N4NnB/bnNyNn94Nnl1c3d4HGRzYHNkf3NlODY2RXl7czZ6c3d4f3hxNndxd394ZWI2Yn5zNmVmf3pzZS02ZXl7czZlc3dic3I2Y2Z5eDZifnMcZn9zZDZ+c3dyZS02ZXl7czZ6eXl9f3hxNnlgc2Q2Yn5zNnRjemF3ZH1lNnlwNmV+f2ZlNnBkeXs2VX5/eHctNmV5e3Mcfn9xfjZ3enlwYjZ/eDZifnM2ZH9xcX94cTo2d2U2f3A2ZWJkf2B/eHE2Ynk2cXNiNnc2ZWJ/eno2dHNiYnNkHGVzd2F3ZHI2ZnNzZjg2NlRjYjZifnNlczZ3ZHM2d3p6Nnp3eHJle3N4LTZ5cDZhc3N9NnJ3b2U2ZnN4YjZjZjZ/eBx6d2J+Nnd4cjZmendlYnNkNjZif3NyNmJ5NnV5Y3hic2RlOjZ4d396c3I2Ynk2dHN4dX5zZTo2dXp/eHV+c3I2YnkccnNlfWU4NjZeeWE2Yn5zeDZ/ZTZifn9lKTY2V2RzNmJ+czZxZHNzeDZwf3N6cmU2cXl4cyk2NkF+d2I2cnk2Yn5zbxx+c2RzKRwcVGNiNnp5eX03Nn5zZHM2dXl7czZ7eWRzNnVkeWFyZTo2Znd1f3hxNmViZHd/cX5iNnB5ZDZifnM2YXdic2Q6Nnd4chxlc3N7f3hxem82dHljeHI2cHlkNnc2cn9gczg2NkViZHd4cXM3NjZYeWJ+f3hxNmF/eno2dXl4YnN4YjZifnN7NnRjYhxifnM2c25iZHN7c2ViNnp/e39iNnlwNmJ+czZ6d3hyLTZ6eX9ic2R/eHE2Y3hyc2Q2Yn5zNmV+d3JvNnpzczZ5cBxveXhyc2Q2YXdkc355Y2VzZTZhf3p6Nnh5YjZlY3Bwf3VzODY2WHk4NjZCfnNvNntjZWI2cXNiNnxjZWI2d2U2eH9xfhxifnM2YXdic2Q2d2U2Yn5zbzZmeWVlf3R6bzZ1d3g2YX9ifnljYjZwd3p6f3hxNn94ODY2V3hyNmJ+c2RzNmJ+c28cZWJ3eHI2Nnt/enNlNnlwNmJ+c3s2Nnpzd3Fjc2U4NjZfeHp3eHJzZGU2d3p6OjZifnNvNnV5e3M2cGR5ezZ6d3hzZRx3eHI2d3p6c29lOjZlYmRzc2JlNnd4cjZ3YHN4Y3NlNjZ4eWRifjo2c3dlYjo2ZXljYn46Nnd4cjZhc2ViODY2T3NiHH5zZHM2Yn5zbzZ3eno2Y3h/YnM4NjZCc3p6NntzOjZyeXNlNmJ+czZ7d3F4c2J/dTZgf2RiY3M2eXA2Yn5zHHhzc3J6c2U2eXA2Yn5zNnV5e2Z3ZWVzZTZ5cDZ3eno2Yn55ZXM2ZX5/ZmU2d2JiZHd1YjZifnN7NmJ+f2J+c2QpHBxZeHVzNnt5ZHM4NjZFd282b3ljNndkczZ/eDZifnM2dXljeGJkby02f3g2ZXl7czZ+f3F+Nnp3eHI2eXA2end9c2U4HEJ3fXM2d3p7eWViNnd4bzZmd2J+Nm95YzZmenN3ZXM6Nnd4cjZic3g2Ynk2eXhzNn9iNnV3ZGR/c2U2b3ljNnJ5YXgcf3g2dzZyd3pzOjZ3eHI2enN3YHNlNm95YzZifnNkczZ0bzZ3NmZ5eXo2f3g2Yn5zNmViZHN3ezg2NkJ+c2RzNn9lHHt3cX91Nn94Nn9iODY2WnNiNmJ+czZ7eWViNnd0ZXN4YjZ7f3hyc3I2eXA2e3N4NnRzNmZ6Y3hxc3I2f3g2fn9lHHJzc2ZzZWI2ZHNgc2R/c2U2NmVid3hyNmJ+d2I2e3d4Nnl4Nn5/ZTZ6c3FlOjZlc2I2fn9lNnBzc2I2dzZxeX94cTocd3hyNn5zNmF/eno2f3hwd3p6f3R6bzZ6c3dyNm95YzZieTZhd2JzZDo2f3A2YXdic2Q2Yn5zZHM2dHM2f3g2d3p6HGJ+d2I2ZHNxf3l4ODY2RX55Y3pyNm95YzZzYHNkNnRzNndifn9kZWI2f3g2Yn5zNnFkc3diNld7c2R/dXd4HHJzZXNkYjo2YmRvNmJ+f2U2c25mc2R/e3N4Yjo2f3A2b3ljZDZ1d2R3YHd4Nn53ZmZzeDZieTZ0czZlY2Zmen9zchxhf2J+Nnc2e3Nid2Z+b2V/dXd6NmZkeXBzZWV5ZDg2Nk9zZTo2d2U2c2BzZG82eXhzNn14eWFlOjZ7c3J/Yndif3l4HHd4cjZhd2JzZDZ3ZHM2YXNycnNyNnB5ZDZzYHNkOBwcVGNiNn5zZHM2f2U2d3g2d2Rif2ViODY2XnM2cnNlf2RzZTZieTZmd394YjZveWM2Yn5zNnJkc3d7f3NlYjocZX53cn9zZWI6Nmdjf3Nic2ViOjZ7eWViNnN4dX53eGJ/eHE2dH9iNnlwNmR5e3d4Yn91Nnp3eHJldXdmczZ/eDZ3enocYn5zNmB3enpzbzZ5cDZifnM2RXd1eTg2NkF+d2I2f2U2Yn5zNnV+f3NwNnN6c3tzeGI2fnM2c3tmenlvZSk2NkJ+c2RzHGVid3hyNn5/ZTZiZHNzZTo2c3d1fjZhf2J+Nnc2fnl6enlhNmJkY3h9OjZ3ZTZ/cDZ3Nn5zZHt/YjZ3eHI2dxx1ZGN1f3B/bjZhc2RzNmF/Yn5/eC02d3hyNn5zZHM2ZXpzc2ZlNn5/ZTZ7c3dyeWE6Nnd4cjZifnNkczZlenNzZjZ+f2UcdXdiYnpzLTZ3eHI2Y2Y2cGR5ezZveXhyc2Q2dXliYndxczZxeXNlNnc2ZXpzc2ZvNmV7eX1zODY2UnNzZjZ/eGJ5HHJ/ZWJ3eGI2YXl5cnp3eHJlNmF/eHJlNnc2e3dsbzZhd286NmRzd3V+f3hxNmJ5Nnlgc2R6d2Zmf3hxNmVmY2RlNnlwHHt5Y3hid394ZTZ0d2J+c3I2f3g2Yn5zf2Q2fn96ejZlf3JzNnR6Y3M4NjZUY2I2Yn55Y3F+NmJ+czZmf3ViY2RzHHp/c2U2Yn5jZTZiZHd4dXNyOjZ3eHI2Yn55Y3F+NmJ+f2U2Zn94czZiZHNzNmV+d31zZTZyeWF4Nn9iZTZlf3F+ZRx6f31zNnpzd2BzZTZjZnl4NmJ+f2U2ZX5zZn5zZHIxZTZ+c3dyOjZvc2I2d3p6NmFzZHM2YHd/eDo2Y3h6c2VlNmJ+cxxlfnNmfnNkcjFlNnNvczZhc2RzNnB/bnNyNmNmeXg2Yn5zNnt3cX91NmViZHN3ezZ0c3B5ZHM2fn97ODY2UXk2YH9lf2IcYn5zNkZkd39kf3NlNn94NlxjeHM6NmF+c3g2cHlkNmV1eWRzZTZ5eDZldXlkc2U2eXA2e396c2U2b3ljNmF3cnMcfXhzczZyc3NmNnd7eXhxNkJ/cXNkNnp/en9zZTY2YX53YjZ/ZTZifnM2eXhzNnV+d2R7HGF3eGJ/eHEpNjZBd2JzZDY2Yn5zZHM2f2U2eHliNnc2cmR5ZjZ5cDZhd2JzZDZifnNkczc2NkFzZHM2WH93cXdkdxx0Y2I2dzZ1d2J3ZHd1YjZ5cDZld3hyOjZheWN6cjZveWM2YmR3YHN6Nm95Y2Q2Yn55Y2V3eHI2e396c2U2Ynk2ZXNzHH9iKTY2QX5vNnJ/cjZifnM2Znl5ZDZmeXNiNnlwNkJzeHhzZWVzczo2Y2Z5eDZlY3Jyc3h6bzZkc3Vzf2B/eHE2YmF5HH53eHJwY3plNnlwNmV/emBzZDo2cnN6f3RzZHdiczZhfnNifnNkNmJ5NnRjbzZ+f3s2dzZ1eXdiOjZhfn91fjZ+cxxld3J6bzZ4c3Nyc3I6NnlkNn94YHNlYjZ+f2U2e3l4c282f3g2dzZmc3JzZWJkf3d4NmJkf2Y2Ynk2RHl1fXdhd28cVHN3dX4pNjZBfm82f2U2d3p7eWViNnNgc2RvNmR5dGNlYjZ+c3d6Yn5vNnR5bzZhf2J+Nnc2ZHl0Y2ViNn5zd3pifm8cZXljejZ/eDZ+f3s6NndiNmV5e3M2Yn97czZ5ZDZ5Yn5zZDZ1ZHdsbzZieTZxeTZieTZlc3cpNjZBfm82Y2Z5eDZveWNkHHB/ZGViNmB5b3dxczZ3ZTZ3NmZ3ZWVzeHFzZDo2cn9yNm95YzZveWNkZXN6cDZwc3N6NmVjdX42dzZ7b2Vif3V3ehxgf3Rkd2J/eXg6NmF+c3g2cH9kZWI2Ynl6cjZifndiNm95YzZ3eHI2b3ljZDZlfn9mNmFzZHM2eHlhNnljYjZ5cBxlf3F+YjZ5cDZ6d3hyKTY2QX5vNnJ/cjZifnM2eXpyNkZzZGV/d3hlNn55enI2Yn5zNmVzdzZ+eXpvKTY2QX5vNnJ/chxifnM2UWRzc31lNnF/YHM2f2I2dzZlc2Z3ZHdiczZyc39ibzo2d3hyNnlheDZ0ZHlifnNkNnlwNlx5YHMpNjZFY2Rzem8cd3p6NmJ+f2U2f2U2eHliNmF/Yn55Y2I2e3N3eH94cTg2Nld4cjZlYn96ejZyc3Nmc2Q2Yn5zNntzd3h/eHE2eXAcYn53YjZlYnlkbzZ5cDZYd2R1f2VlY2U6NmF+eTZ0c3V3Y2VzNn5zNnV5Y3pyNnh5YjZxZHdlZjZifnMcYnlke3N4Yn94cTo2e396cjZ/e3dxczZ+czZld2E2f3g2Yn5zNnB5Y3hid394OjZmemN4cXNyNn94Ynk2f2I2d3hyHGF3ZTZyZHlheHNyODY2VGNiNmJ+d2I2ZXd7czZ/e3dxczo2YXM2eWNkZXN6YHNlNmVzczZ/eDZ3eno2ZH9gc2RlNnd4chx5dXN3eGU4NjZfYjZ/ZTZifnM2f3t3cXM2eXA2Yn5zNmN4cWR3ZWZ3dHpzNmZ+d3hieXs2eXA2en9wcy02d3hyNmJ+f2Ucf2U2Yn5zNn1zbzZieTZ/YjZ3eno4HBxYeWE6NmF+c3g2XzZld282Yn53YjZfNnd7Nn94NmJ+czZ+d3R/YjZ5cDZxeX94cTZieTZlc3c2YX5zeHNgc2Q2Xxx0c3F/eDZieTZxZHlhNn53bG82d3R5Y2I2Yn5zNnNvc2U6Nnd4cjZ0c3F/eDZieTZ0czZ5YHNkNnV5eGV1f3ljZTZ5cBx7bzZ6Y3hxZTo2XzZyeTZ4eWI2e3N3eDZieTZ+d2BzNn9iNn94cHNkZHNyNmJ+d2I2XzZzYHNkNnF5NmJ5NmVzdzZ3ZRx3NmZ3ZWVzeHFzZDg2NlB5ZDZieTZxeTZ3ZTZ3NmZ3ZWVzeHFzZDZveWM2e2NlYjZ4c3NyZTZ+d2BzNnc2ZmNkZXM6HHd4cjZ3NmZjZGVzNn9lNnRjYjZ3NmR3cTZjeHpzZWU2b3ljNn53YHM2ZXl7c2J+f3hxNn94Nn9iODY2VHNlf3JzZTocZndlZXN4cXNkZTZxc2I2ZXN3NmV/dX02NnFkeWE2Z2N3ZGRzemV5e3M2NnJ5eDFiNmV6c3NmNnlwNnh/cX5iZTY2cnkceHliNnN4fHlvNmJ+c3tlc3pgc2U2e2N1fjo2d2U2dzZxc3hzZHd6NmJ+f3hxLTY2eHk6Nl82eHNgc2Q2cXk2d2U2dxxmd2Vlc3hxc2QtNnh5ZDo2Yn55Y3F+Nl82d3s2ZXl7c2J+f3hxNnlwNnc2ZXd6Yjo2cnk2XzZzYHNkNnF5NmJ5NmVzdxx3ZTZ3NlV5e3t5cnlkczo2eWQ2dzZVd2Zid394OjZ5ZDZ3NlV5eX04NjZfNnd0d3hyeXg2Yn5zNnF6eWRvNnd4chxyf2Vif3h1Yn95eDZ5cDZlY3V+NnlwcH91c2U2Ynk2Yn55ZXM2YX55Nnp/fXM2Yn5zezg2NlB5ZDZ7bzZmd2RiOjZfHHd0eXt/eHdiczZ3eno2fnl4eWNkd3R6czZkc2Vmc3Vid3R6czZieX96ZTo2YmR/d3plOjZ3eHI2YmR/dGN6d2J/eXhlHHlwNnNgc2RvNn1/eHI2YX53YmV5c2BzZDg2Nl9iNn9lNmdjf2JzNndlNntjdX42d2U2XzZ1d3g2cnk2Ynk2Ynd9cxx1d2RzNnlwNntvZXN6cDo2YX9ifnljYjZid31/eHE2dXdkczZ5cDZlfn9mZTo2dHdkZ2NzZTo2dGR/cWU6HGV1fnl5eHNkZTo2d3hyNmF+d2I2eHliODY2V3hyNndlNnB5ZDZxeX94cTZ3ZTZ1eXl9OjY2Yn55Y3F+Nl82dXl4cHNlZRxifnNkczZ/ZTZ1eXhlf3JzZHd0enM2cXp5ZG82f3g2Yn53Yjo2dzZ1eXl9NnRzf3hxNnc2ZXlkYjZ5cDZ5cHB/dXNkHHl4NmV+f2Y2dHl3ZHI2Nm9zYjo2ZXl7c355YTo2XzZ4c2BzZDZwd3h1f3NyNnRkeX96f3hxNnB5YXplLTY2Yn55Y3F+HHl4dXM2dGR5f3pzcjo2fGNyf3V/eWNlem82dGNiYnNkc3I6Nnd4cjZ8Y3Jxe3dif3V3enpvNmV3emJzcjZ3eHIcZnNmZnNkc3I6NmJ+c2RzNn9lNnh5Nnl4czZhfnk2YX96ejZlZnN3fTZ7eWRzNmRzZWZzdWJwY3p6bzo2eHliNmJ5HGV3bzZkc2BzZHN4Yn93enpvOjZ5cDZ3NnRkeX96c3I2cHlhejZifnd4Nl82YX96ejg2Nl9iNn9lNnljYjZ5cDZifnMcf3J5endiZHljZTZyeWJ/eHFlNnlwNmJ+czZ5enI2U3FvZmJ/d3hlNmNmeXg2dGR5f3pzcjZ/dH9lNnd4cjZkeXdlYnNyHGR/YHNkNn55ZGVzOjZifndiNm95YzZlc3M2Yn5zNntje3t/c2U2eXA2Yn55ZXM2dWRzd2JjZHNlNn94NmJ+c39kHH5jcXM2dHd9czZ+eWNlc2U2Yn5zNmZvZHd7f3JlOBwcWHk6NmF+c3g2XzZxeTZieTZlc3c6Nl82cXk2d2U2dzZlf3tmenM2ZXd/enlkOjZkf3F+YjZ0c3B5ZHM2Yn5zNnt3ZWI6HGZ6Y3t0NnJ5YXg2f3hieTZifnM2cHlkc3V3ZWJ6czo2d3p5cGI2Yn5zZHM2Ynk2Yn5zNmR5b3d6Nnt3ZWI2fnN3cjgcQmRjczo2Yn5zbzZkd2J+c2Q2eWRyc2Q2e3M2d3R5Y2I2ZXl7czo2d3hyNnt3fXM2e3M2fGN7ZjZwZHl7NmVmd2Q2YnkcZWZ3ZDo2en99czZ3NnFkd2VlfnlmZnNkNn94Nnc2W3dvNntzd3J5YTg2Nld4cjZ3YjZwf2RlYjo2Yn5/ZTZleWRiNnlwHGJ+f3hxNn9lNmN4Znpzd2V3eGI2c3h5Y3F+ODY2X2I2YnljdX5zZTZ5eHMxZTZlc3hlczZ5cDZ+eXh5Y2Q6HGZ3ZGJ/dWN6d2R6bzZ/cDZveWM2dXl7czZ5cDZ3eDZ5enI2c2Vid3R6f2V+c3I2cHd7f3pvNn94NmJ+czZ6d3hyOhxifnM2QHd4NkRzeGVlc3p3c2RlOjZ5ZDZEd3hyeXpmfmU6NnlkNl53ZHJ/dXd4Y2JzZTg2Nld4cjZ7eWRzNmJ+d3gcd3p6OjZ/cDZ8Y2ViNmZkc2B/eWNlNmJ5NmZjYmJ/eHE2b3ljZDZ+d3hyNn94Ynk2Yn5zNmJ3ZDZmeWI6Nm95YzZ+d2BzHHRzc3g2enlkcn94cTZ/YjZ3ZTZ3NnV5Y3hiZG82ZXV+eXl6e3dlYnNkOjZ7d31/eHE2Yn5zNmJ3enpzZWI2dHlvZRxlYnd4cjZ/eDZ3YXM2eXA2b3ljODY2Qn5zNmJkd3hlf2J/eXg2f2U2dzZ9c3N4Nnl4czo2XzZ3ZWVjZHM2b3ljOhxwZHl7Nnc2ZXV+eXl6e3dlYnNkNmJ5Nnc2ZXd/enlkOjZ3eHI2ZHNnY39kc2U2dzZlYmR5eHE2cnN1eXVif3l4NnlwHEVzeHN1dzZ3eHI2Yn5zNkVieX91ZTZieTZzeHd0enM2b3ljNmJ5NnFkf3g2d3hyNnRzd2Q2f2I4NjZUY2I2c2BzeBxifn9lNmFzd2RlNnlwcDZ/eDZif3tzOBwcQX53YjZ5cDZ/Yjo2f3A2ZXl7czZ5enI2fmN4fWU2eXA2dzZlc3c2dXdmYnd/eDZ5ZHJzZGU2e3M2Ynk2cXNiNnccdGR5eXs2d3hyNmVhc3NmNnJ5YXg2Yn5zNnJzdX1lKTY2QX53YjZyeXNlNmJ+d2I2f3hyf3F4f2JvNnd7eWN4YjZieTocYXN/cX5zcjo2XzZ7c3d4OjZ/eDZifnM2ZXV3enNlNnlwNmJ+czZYc2E2QnNlYnd7c3hiKTY2Unk2b3ljNmJ+f3h9HGJ+czZ3ZHV+d3hxc3o2UXd0ZH9zejZifn94fWU2d3hvYn5/eHE2Yn5zNnpzZWU2eXA2e3M6NnRzdXdjZXM2XxxmZHl7ZmJ6bzZ3eHI2ZHNlZnN1YnBjenpvNnl0c282Yn53YjZ5enI2fmN4fWU2f3g2Yn53YjZmd2Rif3VjendkHH94ZWJ3eHVzKTY2QX55Nnd/eDFiNnc2ZXp3YHMpNjZCc3p6NntzNmJ+d2I4NjZBc3p6OjZifnN4OjZ+eWFzYHNkNmJ+cxx5enI2ZXN3NnV3ZmJ3f3hlNnt3bzZ5ZHJzZDZ7czZ3dHljYjY2fnlhc2BzZDZifnNvNnt3bzZifmN7ZjZ3eHI2ZmN4dX4ce3M2d3R5Y2I6Nl82fndgczZifnM2ZXdif2Vwd3Vif3l4NnlwNn14eWF/eHE2Yn53YjZ/YjZ/ZTZ3eno2ZH9xfmItHGJ+d2I2c2BzZG90eXJvNnN6ZXM2f2U2eXhzNmF3bzZ5ZDZ5Yn5zZDZlc2Rgc3I2f3g2e2N1fjZifnM2ZXd7cxxhd282NnN/Yn5zZDZ/eDZ3NmZ+b2V/dXd6NnlkNntzYndmfm9lf3V3ejZmeX94YjZ5cDZgf3NhOjZifndiNn9lLTZ3eHIcZXk2Yn5zNmN4f2BzZGV3ejZifmN7ZjZ/ZTZmd2Vlc3I2ZHljeHI6Nnd4cjZ3eno2fnd4cmU2ZX55Y3pyNmRjdDZzd3V+HHlifnNkMWU2ZX55Y3pyc2Q2dHp3cnNlOjZ3eHI2dHM2dXl4YnN4YjgcHFdxd394OjZfNnd6YXdvZTZxeTZieTZlc3c2d2U2dzZld396eWQ6NnRzdXdjZXM2Yn5zbzZ7d31zNnc2Znl/eGI2eXAcZndvf3hxNntzNnB5ZDZ7bzZiZHljdHpzOjZhfnNkc3dlNmJ+c282eHNgc2Q2ZndvNmZ3ZWVzeHFzZGU2dzZlf3hxenMcZnN4eG82Yn53YjZfNnNgc2Q2fnN3ZHI2eXA4NjZZeDZifnM2dXl4YmR3ZG86NmZ3ZWVzeHFzZGU2Yn5ze2VzemBzZRx7Y2ViNmZ3bzg2Nld4cjZifnNkczZ/ZTZ3eno2Yn5zNnJ/cHBzZHN4dXM2f3g2Yn5zNmF5ZHpyNnRzYmFzc3gcZndvf3hxNnd4cjZ0c394cTZmd39yODY2Qn5zNnd1YjZ5cDZmd29/eHE2f2U2ZnNkfndmZTZifnM2e3llYhxjeHV5e3B5ZGJ3dHpzNn94cHp/dWJ/eXg2Yn53YjZifnM2YmF5NnlkdX53ZHI2Yn5/c2BzZTZzeGJ3f3pzcjZjZnl4HGNlODY2VGNiNlRTX1hRNkZXX1I6NjZhfndiNmF/eno2dXl7ZndkczZhf2J+Nn9iKTY2Qn5zNmNkdHd4czZ3dWJ/YH9ibxxhf2J+NmF+f3V+Nnc2e3d4NmRzdXN/YHNlNnt5eHNvNn9lNmRzd3p6bzZ7d2Rgc3p6eWNlOjZ1eXhlf3JzZH94cRxifndiNmFzNmV5NnN3ZHhzZWJ6bzZ0c3p/c2BzNnt5eHNvNmJ5NnRzNmJ+czZkeXliNnlwNnd6ejZzd2RifnpvHH96emU6Nnd4cjZifndiNnl4Nnh5Nnd1dXljeGI2dXd4Nnc2e3l4f3NyNnt3eDZzeGJzZDZ+c3dgc3g4NjZXfjc2fnlhHHV+c3NkcGN6em82YXM2dXl4ZX9xeDZ5Y2Rlc3pgc2U2Ynk2ZnNkcn9if3l4Nxw='\n\nimport base64\n\nct = base64.b64decode(ct_b64)\n\ndef crypt_2(msg, i):\n return ''.join([chr(s^i) for s in msg])\n \nfor i in range(256):\n s = crypt_2(ct, i)\n \n # i'm expecting the text to be in english, so 'the' is a good guess\n if 'the' in s:\n print(s)\n print('key:', i)\n print('########################')",
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": "\u000eGehh$ia$Mwlieah*$$Wkia$}aevw$eck$$jarav$imj`$lks$hkjc\u000etvagmwah}$$lermjc$hmppha$kv$jk$ikja}$mj$i}$tqvwa($ej`$jkplmjc\u000etevpmgqhev$pk$mjpavawp$ia$kj$wlkva($M$plkqclp$M$skqh`$wemh$efkqp$e\u000ehmppha$ej`$waa$pla$sepav}$tevp$kb$pla$skvh`*$$Mp$mw$e$se}$M$lera$kb\u000e`vmrmjc$kbb$pla$wthaaj$ej`$vacqhepmjc$pla$gmvgqhepmkj*$$Slajarav$M\u000ebmj`$i}wahb$cvksmjc$cvmi$efkqp$pla$ikqpl?$slajarav$mp$mw$e$`eit(\u000e`vm~~h}$Jkraifav$mj$i}$wkqh?$slajarav$M$bmj`$i}wahb$mjrkhqjpevmh}\u000eteqwmjc$fabkva$gkbbmj$sevalkqwaw($ej`$fvmjcmjc$qt$pla$vaev$kb$arav}\u000ebqjaveh$M$iaap?$ej`$awtagmehh}$slajarav$i}$l}tkw$cap$wqgl$ej$qttav\u000elej`$kb$ia($plep$mp$vauqmvaw$e$wpvkjc$ikveh$tvmjgmtha$pk$tvarajp$ia\u000ebvki$`ahmfavepah}$wpattmjc$mjpk$pla$wpvaap($ej`$iaplk`mgehh}$ojkgomjc\u000etaktha#w$lepw$kbb$$plaj($M$eggkqjp$mp$lmcl$pmia$pk$cap$pk$wae$ew$wkkj\u000eew$M$gej*$$Plmw$mw$i}$wqfwpmpqpa$bkv$tmwpkh$ej`$fehh*$$Smpl$e\u000etlmhkwktlmgeh$bhkqvmwl$Gepk$plvksw$lmiwahb$qtkj$lmw$wskv`?$M$uqmaph}\u000epeoa$pk$pla$wlmt*$$Plava$mw$jkplmjc$wqvtvmwmjc$mj$plmw*$$Mb$pla}$fqp\u000eojas$mp($ehikwp$ehh$iaj$mj$plamv$`acvaa($wkia$pmia$kv$kplav($glavmwl\u000erav}$jaevh}$pla$weia$baahmjcw$pksev`w$pla$kgaej$smpl$ia*\u000e\u000ePlava$jks$mw$}kqv$mjwqhev$gmp}$kb$pla$Iejleppkaw($fahpa`$vkqj`$f}\u000eslevraw$ew$Mj`mej$mwhaw$f}$gkveh$vaabw$$gkiiavga$wqvvkqj`w$mp$smpl\u000elav$wqvb*$$Vmclp$ej`$habp($pla$wpvaapw$peoa$}kq$sepavsev`*$$Mpw\u000ea|pvaia$`ksjpksj$mw$pla$feppav}($slava$plep$jkfha$ikha$mw$sewla`$f}\u000eseraw($ej`$gkkha`$f}$fvaa~aw($slmgl$e$bas$lkqvw$tvarmkqw$sava$kqp$kb\u000ewmclp$kb$hej`*$$Hkko$ep$pla$gvks`w$kb$sepav$ce~avw$plava*\u000e\u000eGmvgqieifqhepa$pla$gmp}$kb$e$`vaei}$Weffepl$ebpavjkkj*$$Ck$bvki\u000eGkvhaevw$Lkko$pk$Gkajpmaw$Whmt($ej`$bvki$plajga($f}$Slmpalehh(\u000ejkvplsev`*$$Slep$`k$}kq$waa;$$Tkwpa`$hmoa$wmhajp$wajpmjahw$ehh$evkqj`\u000epla$pksj($wpej`$plkqwej`w$qtkj$plkqwej`w$kb$ikvpeh$iaj$bm|a`$mj$kgaej\u000evaravmaw*$$Wkia$haejmjc$ecemjwp$pla$wtmhaw?$wkia$waepa`$qtkj$pla\u000etmav$lae`w?$wkia$hkkomjc$krav$pla$fqhsevow$kb$wlmtw$bvki$Glmje?$wkia\u000elmcl$ehkbp$mj$pla$vmccmjc($ew$mb$wpvmrmjc$pk$cap$e$wpmhh$fappav\u000ewaesev`$taat*$$Fqp$plawa$eva$ehh$hej`wiaj?$kb$saao$`e}w$tajp$qt$mj\u000ehepl$ej`$thewpav$$pma`$pk$gkqjpavw($jemha`$pk$fajglaw($ghmjgla`$pk\u000e`awow*$$Lks$plaj$mw$plmw;$$Eva$pla$cvaaj$bmah`w$ckja;$$Slep$`k$pla}\u000elava;\u000e\u000eFqp$hkko%$lava$gkia$ikva$gvks`w($tegmjc$wpvemclp$bkv$pla$sepav($ej`\u000ewaaimjch}$fkqj`$bkv$e$`mra*$$Wpvejca%$$Jkplmjc$smhh$gkjpajp$plai$fqp\u000epla$a|pvaiawp$hmimp$kb$pla$hej`?$hkmpavmjc$qj`av$pla$wle`}$haa$kb\u000e}kj`av$sevalkqwaw$smhh$jkp$wqbbmga*$$Jk*$$Pla}$iqwp$cap$nqwp$ew$jmcl\u000epla$sepav$ew$pla}$tkwwmfh}$gej$smplkqp$behhmjc$mj*$$Ej`$plava$pla}\u000ewpej`$$imhaw$kb$plai$$haecqaw*$$Mjhej`avw$ehh($pla}$gkia$bvki$hejaw\u000eej`$ehha}w($wpvaapw$ej`$erajqaw$$jkvpl($aewp($wkqpl($ej`$sawp*$$]ap\u000elava$pla}$ehh$qjmpa*$$Pahh$ia($`kaw$pla$iecjapmg$rmvpqa$kb$pla\u000ejaa`haw$kb$pla$gkitewwaw$kb$ehh$plkwa$wlmtw$eppvegp$plai$plmplav;\u000e\u000eKjga$ikva*$$We}$}kq$eva$mj$pla$gkqjpv}?$mj$wkia$lmcl$hej`$kb$heoaw*\u000ePeoa$ehikwp$ej}$tepl$}kq$thaewa($ej`$paj$pk$kja$mp$gevvmaw$}kq$`ksj\u000emj$e$`eha($ej`$haeraw$}kq$plava$f}$e$tkkh$mj$pla$wpvaei*$$Plava$mw\u000eiecmg$mj$mp*$$Hap$pla$ikwp$efwajp$imj`a`$kb$iaj$fa$thqjca`$mj$lmw\u000e`aatawp$varavmaw$$wpej`$plep$iej$kj$lmw$hacw($wap$lmw$baap$e$ckmjc(\u000eej`$la$smhh$mjbehhmfh}$hae`$}kq$pk$sepav($mb$sepav$plava$fa$mj$ehh\u000eplep$vacmkj*$$Wlkqh`$}kq$arav$fa$eplmvwp$mj$pla$cvaep$Eiavmgej\u000e`awavp($pv}$plmw$a|tavmiajp($mb$}kqv$geverej$lettaj$pk$fa$wqtthma`\u000esmpl$e$iapetl}wmgeh$tvkbawwkv*$$]aw($ew$arav}$kja$ojksw($ia`mpepmkj\u000eej`$sepav$eva$sa``a`$bkv$arav*\u000e\u000eFqp$lava$mw$ej$evpmwp*$$La$`awmvaw$pk$temjp$}kq$pla$`vaeimawp(\u000ewle`mawp($uqmapawp($ikwp$ajglejpmjc$fmp$kb$vkiejpmg$hej`wgeta$mj$ehh\u000epla$rehha}$kb$pla$Wegk*$$Slep$mw$pla$glmab$ahaiajp$la$aithk}w;$$Plava\u000ewpej`$lmw$pvaaw($aegl$smpl$e$lkhhks$pvqjo($ew$mb$e$lavimp$ej`$e\u000egvqgmbm|$sava$smplmj?$ej`$lava$whaatw$lmw$iae`ks($ej`$plava$whaat$lmw\u000egeppha?$ej`$qt$bvki$}kj`av$gkppeca$ckaw$e$whaat}$wikoa*$$@aat$mjpk\u000e`mwpejp$skk`hej`w$smj`w$e$ie~}$se}($vaeglmjc$pk$kravhettmjc$wtqvw$kb\u000eikqjpemjw$fepla`$mj$plamv$lmhh$wm`a$fhqa*$$Fqp$plkqcl$pla$tmgpqva\u000ehmaw$plqw$pvejga`($ej`$plkqcl$plmw$tmja$pvaa$wleoaw$`ksj$mpw$wmclw\u000ehmoa$haeraw$qtkj$plmw$wlatlav`#w$lae`($}ap$ehh$sava$remj($qjhaww$pla\u000ewlatlav`#w$a}a$sava$bm|a`$qtkj$pla$iecmg$wpvaei$fabkva$lmi*$$Ck$rmwmp\u000epla$Tvemvmaw$mj$Nqja($slaj$bkv$wgkvaw$kj$wgkvaw$kb$imhaw$}kq$se`a\u000eojaa$`aat$eikjc$Pmcav$hmhmaw$$slep$mw$pla$kja$glevi\u000esejpmjc;$$Sepav$$plava$mw$jkp$e$`vkt$kb$sepav$plava%$$Sava$Jmeceve\u000efqp$e$gepevegp$kb$wej`($skqh`$}kq$pverah$}kqv$plkqwej`$imhaw$pk$waa\u000emp;$$Sl}$`m`$pla$tkkv$tkap$kb$Pajjawwaa($qtkj$wq``ajh}$vagamrmjc$psk\u000elej`bqhw$kb$wmhrav($`ahmfavepa$slaplav$pk$fq}$lmi$e$gkep($slmgl$la\u000ewe`h}$jaa`a`($kv$mjrawp$lmw$ikja}$mj$e$ta`awpvmej$pvmt$pk$Vkgoese}\u000eFaegl;$$Sl}$mw$ehikwp$arav}$vkfqwp$laehpl}$fk}$smpl$e$vkfqwp$laehpl}\u000ewkqh$mj$lmi($ep$wkia$pmia$kv$kplav$gve~}$pk$ck$pk$wae;$$Sl}$qtkj$}kqv\u000ebmvwp$rk}eca$ew$e$tewwajcav($`m`$}kq$}kqvwahb$baah$wqgl$e$i}wpmgeh\u000ermfvepmkj($slaj$bmvwp$pkh`$plep$}kq$ej`$}kqv$wlmt$sava$jks$kqp$kb\u000ewmclp$kb$hej`;$$Sl}$`m`$pla$kh`$Tavwmejw$lkh`$pla$wae$lkh};$$Sl}$`m`\u000epla$Cvaaow$cmra$mp$e$watevepa$`amp}($ej`$ksj$fvkplav$kb$Nkra;$$Wqvah}\u000eehh$plmw$mw$jkp$smplkqp$iaejmjc*$$Ej`$wpmhh$`aatav$pla$iaejmjc$kb\u000eplep$wpkv}$kb$Jevgmwwqw($slk$fageqwa$la$gkqh`$jkp$cvewt$pla\u000epkviajpmjc($imh`$mieca$la$wes$mj$pla$bkqjpemj($thqjca`$mjpk$mp$ej`\u000esew$`vksja`*$$Fqp$plep$weia$mieca($sa$kqvwahraw$waa$mj$ehh$vmravw$ej`\u000ekgaejw*$$Mp$mw$pla$mieca$kb$pla$qjcvewtefha$tlejpki$kb$hmba?$ej`$plmw\u000emw$pla$oa}$pk$mp$ehh*\u000e\u000eJks($slaj$M$we}$plep$M$ei$mj$pla$lefmp$kb$ckmjc$pk$wae$slajarav$M\u000efacmj$pk$cvks$le~}$efkqp$pla$a}aw($ej`$facmj$pk$fa$krav$gkjwgmkqw$kb\u000ei}$hqjcw($M$`k$jkp$iaej$pk$lera$mp$mjbavva`$plep$M$arav$ck$pk$wae$ew\u000ee$tewwajcav*$$Bkv$pk$ck$ew$e$tewwajcav$}kq$iqwp$jaa`w$lera$e$tqvwa(\u000eej`$e$tqvwa$mw$fqp$e$vec$qjhaww$}kq$lera$wkiaplmjc$mj$mp*$$Fawm`aw(\u000etewwajcavw$cap$wae$wmgo$$cvks$uqevvahwkia$$`kj#p$whaat$kb$jmclpw$$`k\u000ejkp$ajnk}$plaiwahraw$iqgl($ew$e$cajaveh$plmjc?$$jk($M$jarav$ck$ew$e\u000etewwajcav?$jkv($plkqcl$M$ei$wkiaplmjc$kb$e$wehp($`k$M$arav$ck$pk$wae\u000eew$e$Gkiik`kva($kv$e$Getpemj($kv$e$Gkko*$$M$efej`kj$pla$chkv}$ej`\u000e`mwpmjgpmkj$kb$wqgl$kbbmgaw$pk$plkwa$slk$hmoa$plai*$$Bkv$i}$tevp($M\u000eefkimjepa$ehh$lkjkqvefha$vawtagpefha$pkmhw($pvmehw($ej`$pvmfqhepmkjw\u000ekb$arav}$omj`$slepwkarav*$$Mp$mw$uqmpa$ew$iqgl$ew$M$gej$`k$pk$peoa\u000egeva$kb$i}wahb($smplkqp$peomjc$geva$kb$wlmtw($fevuqaw($fvmcw(\u000ewglkkjavw($ej`$slep$jkp*$$Ej`$ew$bkv$ckmjc$ew$gkko($$plkqcl$M$gkjbaww\u000eplava$mw$gkjwm`avefha$chkv}$mj$plep($e$gkko$famjc$e$wkvp$kb$kbbmgav\u000ekj$wlmt$fkev`$$}ap($wkialks($M$jarav$bejgma`$fvkmhmjc$bkshw?$$plkqcl\u000ekjga$fvkmha`($nq`mgmkqwh}$fqppava`($ej`$nq`ciepmgehh}$wehpa`$ej`\u000etattava`($plava$mw$jk$kja$slk$smhh$wtaeo$ikva$vawtagpbqhh}($jkp$pk\u000ewe}$varavajpmehh}($kb$e$fvkmha`$bksh$plej$M$smhh*$$Mp$mw$kqp$kb$pla\u000em`khepvkqw$`kpmjcw$kb$pla$kh`$Ac}tpmejw$qtkj$fvkmha`$mfmw$ej`$vkewpa`\u000evmrav$lkvwa($plep$}kq$waa$pla$iqiimaw$kb$plkwa$gvaepqvaw$mj$plamv\u000elqca$feoa$lkqwaw$pla$t}veim`w*\u000e\u000eJk($slaj$M$ck$pk$wae($M$ck$ew$e$wmitha$wemhkv($vmclp$fabkva$pla$iewp(\u000ethqif$`ksj$mjpk$pla$bkvagewpha($ehkbp$plava$pk$pla$vk}eh$iewp$lae`*\u000ePvqa($pla}$veplav$kv`av$ia$efkqp$wkia($ej`$ieoa$ia$nqit$bvki$wtev$pk\u000ewtev($hmoa$e$cvewwlkttav$mj$e$Ie}$iae`ks*$$Ej`$ep$bmvwp($plmw$wkvp$kb\u000eplmjc$mw$qjthaewejp$ajkqcl*$$Mp$pkqglaw$kja#w$wajwa$kb$lkjkqv(\u000etevpmgqhevh}$mb$}kq$gkia$kb$ej$kh`$awpefhmwla`$beimh}$mj$pla$hej`(\u000epla$Rej$Vajwwaheavw($kv$Vej`khtlw($kv$Lev`mgejqpaw*$$Ej`$ikva$plej\u000eehh($mb$nqwp$tvarmkqw$pk$tqppmjc$}kqv$lej`$mjpk$pla$pev$tkp($}kq$lera\u000efaaj$hkv`mjc$mp$ew$e$gkqjpv}$wglkkhiewpav($ieomjc$pla$pehhawp$fk}w\u000ewpej`$mj$esa$kb$}kq*$$Pla$pvejwmpmkj$mw$e$oaaj$kja($M$ewwqva$}kq(\u000ebvki$e$wglkkhiewpav$pk$e$wemhkv($ej`$vauqmvaw$e$wpvkjc$`agkgpmkj$kb\u000eWajage$ej`$pla$Wpkmgw$pk$ajefha$}kq$pk$cvmj$ej`$faev$mp*$$Fqp$araj\u000eplmw$saevw$kbb$mj$pmia*\u000e\u000eSlep$kb$mp($mb$wkia$kh`$lqjow$kb$e$wae$getpemj$kv`avw$ia$pk$cap$e\u000efvkki$ej`$wsaat$`ksj$pla$`agow;$$Slep$`kaw$plep$mj`mcjmp}$eikqjp$pk(\u000esamcla`($M$iaej($mj$pla$wgehaw$kb$pla$Jas$Pawpeiajp;$$@k$}kq$plmjo\u000epla$evglejcah$Cefvmah$plmjow$ej}plmjc$pla$haww$kb$ia($fageqwa$M\u000etvkitph}$ej`$vawtagpbqhh}$kfa}$plep$kh`$lqjow$mj$plep$tevpmgqhev\u000emjwpejga;$$Slk$emj#p$e$whera;$$Pahh$ia$plep*$$Sahh($plaj($lksarav$pla\u000ekh`$wae$getpemjw$ie}$kv`av$ia$efkqp$$lksarav$pla}$ie}$plqit$ej`$tqjgl\u000eia$efkqp($M$lera$pla$wepmwbegpmkj$kb$ojksmjc$plep$mp$mw$ehh$vmclp?\u000eplep$arav}fk`}$ahwa$mw$kja$se}$kv$kplav$wavra`$mj$iqgl$pla$weia\u000ese}$$amplav$mj$e$tl}wmgeh$kv$iapetl}wmgeh$tkmjp$kb$rmas($plep$mw?$ej`\u000ewk$pla$qjmravweh$plqit$mw$tewwa`$vkqj`($ej`$ehh$lej`w$wlkqh`$vqf$aegl\u000ekplav#w$wlkqh`av$fhe`aw($ej`$fa$gkjpajp*\u000e\u000eEcemj($M$ehse}w$ck$pk$wae$ew$e$wemhkv($fageqwa$pla}$ieoa$e$tkmjp$kb\u000ete}mjc$ia$bkv$i}$pvkqfha($slavaew$pla}$jarav$te}$tewwajcavw$e$wmjcha\u000etajj}$plep$M$arav$laev`$kb*$$Kj$pla$gkjpvev}($tewwajcavw$plaiwahraw\u000eiqwp$te}*$$Ej`$plava$mw$ehh$pla$`mbbavajga$mj$pla$skvh`$fapsaaj\u000ete}mjc$ej`$famjc$tem`*$$Pla$egp$kb$te}mjc$mw$tavletw$pla$ikwp\u000eqjgkibkvpefha$mjbhmgpmkj$plep$pla$psk$kvglev`$plmaraw$ajpemha`$qtkj\u000eqw*$$Fqp$FAMJC$TEM@($$slep$smhh$gkiteva$smpl$mp;$$Pla$qvfeja$egpmrmp}\u000esmpl$slmgl$e$iej$vagamraw$ikja}$mw$vaehh}$ievrahhkqw($gkjwm`avmjc\u000eplep$sa$wk$aevjawph}$fahmara$ikja}$pk$fa$pla$vkkp$kb$ehh$aevplh}\u000emhhw($ej`$plep$kj$jk$eggkqjp$gej$e$ikjma`$iej$ajpav$laeraj*$$El%$lks\u000eglaavbqhh}$sa$gkjwmcj$kqvwahraw$pk$tav`mpmkj%\u000e\nkey: 18\n########################\n\nCall me Ishmael. Some years ago never mind how long\nprecisely having little or no money in my purse, and nothing\nparticular to interest me on shore, I thought I would sail about a\nlittle and see the watery part of the world. It is a way I have of\ndriving off the spleen and regulating the circulation. Whenever I\nfind myself growing grim about the mouth; whenever it is a damp,\ndrizzly November in my soul; whenever I find myself involuntarily\npausing before coffin warehouses, and bringing up the rear of every\nfuneral I meet; and especially whenever my hypos get such an upper\nhand of me, that it requires a strong moral principle to prevent me\nfrom deliberately stepping into the street, and methodically knocking\npeople's hats off then, I account it high time to get to sea as soon\nas I can. This is my substitute for pistol and ball. With a\nphilosophical flourish Cato throws himself upon his sword; I quietly\ntake to the ship. There is nothing surprising in this. If they but\nknew it, almost all men in their degree, some time or other, cherish\nvery nearly the same feelings towards the ocean with me.\n\nThere now is your insular city of the Manhattoes, belted round by\nwharves as Indian isles by coral reefs commerce surrounds it with\nher surf. Right and left, the streets take you waterward. Its\nextreme downtown is the battery, where that noble mole is washed by\nwaves, and cooled by breezes, which a few hours previous were out of\nsight of land. Look at the crowds of water gazers there.\n\nCircumambulate the city of a dreamy Sabbath afternoon. Go from\nCorlears Hook to Coenties Slip, and from thence, by Whitehall,\nnorthward. What do you see? Posted like silent sentinels all around\nthe town, stand thousands upon thousands of mortal men fixed in ocean\nreveries. Some leaning against the spiles; some seated upon the\npier heads; some looking over the bulwarks of ships from China; some\nhigh aloft in the rigging, as if striving to get a still better\nseaward peep. But these are all landsmen; of week days pent up in\nlath and plaster tied to counters, nailed to benches, clinched to\ndesks. How then is this? Are the green fields gone? What do they\nhere?\n\nBut look! here come more crowds, pacing straight for the water, and\nseemingly bound for a dive. Strange! Nothing will content them but\nthe extremest limit of the land; loitering under the shady lee of\nyonder warehouses will not suffice. No. They must get just as nigh\nthe water as they possibly can without falling in. And there they\nstand miles of them leagues. Inlanders all, they come from lanes\nand alleys, streets and avenues north, east, south, and west. Yet\nhere they all unite. Tell me, does the magnetic virtue of the\nneedles of the compasses of all those ships attract them thither?\n\nOnce more. Say you are in the country; in some high land of lakes.\nTake almost any path you please, and ten to one it carries you down\nin a dale, and leaves you there by a pool in the stream. There is\nmagic in it. Let the most absent minded of men be plunged in his\ndeepest reveries stand that man on his legs, set his feet a going,\nand he will infallibly lead you to water, if water there be in all\nthat region. Should you ever be athirst in the great American\ndesert, try this experiment, if your caravan happen to be supplied\nwith a metaphysical professor. Yes, as every one knows, meditation\nand water are wedded for ever.\n\nBut here is an artist. He desires to paint you the dreamiest,\nshadiest, quietest, most enchanting bit of romantic landscape in all\nthe valley of the Saco. What is the chief element he employs? There\nstand his trees, each with a hollow trunk, as if a hermit and a\ncrucifix were within; and here sleeps his meadow, and there sleep his\ncattle; and up from yonder cottage goes a sleepy smoke. Deep into\ndistant woodlands winds a mazy way, reaching to overlapping spurs of\nmountains bathed in their hill side blue. But though the picture\nlies thus tranced, and though this pine tree shakes down its sighs\nlike leaves upon this shepherd's head, yet all were vain, unless the\nshepherd's eye were fixed upon the magic stream before him. Go visit\nthe Prairies in June, when for scores on scores of miles you wade\nknee deep among Tiger lilies what is the one charm\nwanting? Water there is not a drop of water there! Were Niagara\nbut a cataract of sand, would you travel your thousand miles to see\nit? Why did the poor poet of Tennessee, upon suddenly receiving two\nhandfuls of silver, deliberate whether to buy him a coat, which he\nsadly needed, or invest his money in a pedestrian trip to Rockaway\nBeach? Why is almost every robust healthy boy with a robust healthy\nsoul in him, at some time or other crazy to go to sea? Why upon your\nfirst voyage as a passenger, did you yourself feel such a mystical\nvibration, when first told that you and your ship were now out of\nsight of land? Why did the old Persians hold the sea holy? Why did\nthe Greeks give it a separate deity, and own brother of Jove? Surely\nall this is not without meaning. And still deeper the meaning of\nthat story of Narcissus, who because he could not grasp the\ntormenting, mild image he saw in the fountain, plunged into it and\nwas drowned. But that same image, we ourselves see in all rivers and\noceans. It is the image of the ungraspable phantom of life; and this\nis the key to it all.\n\nNow, when I say that I am in the habit of going to sea whenever I\nbegin to grow hazy about the eyes, and begin to be over conscious of\nmy lungs, I do not mean to have it inferred that I ever go to sea as\na passenger. For to go as a passenger you must needs have a purse,\nand a purse is but a rag unless you have something in it. Besides,\npassengers get sea sick grow quarrelsome don't sleep of nights do\nnot enjoy themselves much, as a general thing; no, I never go as a\npassenger; nor, though I am something of a salt, do I ever go to sea\nas a Commodore, or a Captain, or a Cook. I abandon the glory and\ndistinction of such offices to those who like them. For my part, I\nabominate all honourable respectable toils, trials, and tribulations\nof every kind whatsoever. It is quite as much as I can do to take\ncare of myself, without taking care of ships, barques, brigs,\nschooners, and what not. And as for going as cook, though I confess\nthere is considerable glory in that, a cook being a sort of officer\non ship board yet, somehow, I never fancied broiling fowls; though\nonce broiled, judiciously buttered, and judgmatically salted and\npeppered, there is no one who will speak more respectfully, not to\nsay reverentially, of a broiled fowl than I will. It is out of the\nidolatrous dotings of the old Egyptians upon broiled ibis and roasted\nriver horse, that you see the mummies of those creatures in their\nhuge bake houses the pyramids.\n\nNo, when I go to sea, I go as a simple sailor, right before the mast,\nplumb down into the forecastle, aloft there to the royal mast head.\nTrue, they rather order me about some, and make me jump from spar to\nspar, like a grasshopper in a May meadow. And at first, this sort of\nthing is unpleasant enough. It touches one's sense of honour,\nparticularly if you come of an old established family in the land,\nthe Van Rensselaers, or Randolphs, or Hardicanutes. And more than\nall, if just previous to putting your hand into the tar pot, you have\nbeen lording it as a country schoolmaster, making the tallest boys\nstand in awe of you. The transition is a keen one, I assure you,\nfrom a schoolmaster to a sailor, and requires a strong decoction of\nSeneca and the Stoics to enable you to grin and bear it. But even\nthis wears off in time.\n\nWhat of it, if some old hunks of a sea captain orders me to get a\nbroom and sweep down the decks? What does that indignity amount to,\nweighed, I mean, in the scales of the New Testament? Do you think\nthe archangel Gabriel thinks anything the less of me, because I\npromptly and respectfully obey that old hunks in that particular\ninstance? Who ain't a slave? Tell me that. Well, then, however the\nold sea captains may order me about however they may thump and punch\nme about, I have the satisfaction of knowing that it is all right;\nthat everybody else is one way or other served in much the same\nway either in a physical or metaphysical point of view, that is; and\nso the universal thump is passed round, and all hands should rub each\nother's shoulder blades, and be content.\n\nAgain, I always go to sea as a sailor, because they make a point of\npaying me for my trouble, whereas they never pay passengers a single\npenny that I ever heard of. On the contrary, passengers themselves\nmust pay. And there is all the difference in the world between\npaying and being paid. The act of paying is perhaps the most\nuncomfortable infliction that the two orchard thieves entailed upon\nus. But BEING PAID, what will compare with it? The urbane activity\nwith which a man receives money is really marvellous, considering\nthat we so earnestly believe money to be the root of all earthly\nills, and that on no account can a monied man enter heaven. Ah! how\ncheerfully we consign ourselves to perdition!\n\nkey: 22\n########################\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "And boom! There it is!"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 2B Finding the most common character"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "from collections import Counter",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "charcounts = Counter(ct)",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "chars = charcounts.most_common()[:3]",
"execution_count": 9,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "chars",
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 10,
"data": {
"text/plain": "[(54, 1629), (115, 904), (98, 630)]"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "I'm guessing these include 'e'."
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "keys_to_try = [\n c[0] ^ ord('e') for c in chars\n]",
"execution_count": 11,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "keys_to_try",
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 12,
"data": {
"text/plain": "[83, 22, 7]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "i = 83\nprint('key: ', i)\nprint(crypt_2(ct, i))",
"execution_count": 13,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "strange! For some reason the text doesn't show. Maybe there's a special character that clears the screen in the decrypted string."
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "i = 22\nprint('key: ', i)\nprint(crypt_2(ct, i))",
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"text": "key: 22\n\nCall me Ishmael. Some years ago never mind how long\nprecisely having little or no money in my purse, and nothing\nparticular to interest me on shore, I thought I would sail about a\nlittle and see the watery part of the world. It is a way I have of\ndriving off the spleen and regulating the circulation. Whenever I\nfind myself growing grim about the mouth; whenever it is a damp,\ndrizzly November in my soul; whenever I find myself involuntarily\npausing before coffin warehouses, and bringing up the rear of every\nfuneral I meet; and especially whenever my hypos get such an upper\nhand of me, that it requires a strong moral principle to prevent me\nfrom deliberately stepping into the street, and methodically knocking\npeople's hats off then, I account it high time to get to sea as soon\nas I can. This is my substitute for pistol and ball. With a\nphilosophical flourish Cato throws himself upon his sword; I quietly\ntake to the ship. There is nothing surprising in this. If they but\nknew it, almost all men in their degree, some time or other, cherish\nvery nearly the same feelings towards the ocean with me.\n\nThere now is your insular city of the Manhattoes, belted round by\nwharves as Indian isles by coral reefs commerce surrounds it with\nher surf. Right and left, the streets take you waterward. Its\nextreme downtown is the battery, where that noble mole is washed by\nwaves, and cooled by breezes, which a few hours previous were out of\nsight of land. Look at the crowds of water gazers there.\n\nCircumambulate the city of a dreamy Sabbath afternoon. Go from\nCorlears Hook to Coenties Slip, and from thence, by Whitehall,\nnorthward. What do you see? Posted like silent sentinels all around\nthe town, stand thousands upon thousands of mortal men fixed in ocean\nreveries. Some leaning against the spiles; some seated upon the\npier heads; some looking over the bulwarks of ships from China; some\nhigh aloft in the rigging, as if striving to get a still better\nseaward peep. But these are all landsmen; of week days pent up in\nlath and plaster tied to counters, nailed to benches, clinched to\ndesks. How then is this? Are the green fields gone? What do they\nhere?\n\nBut look! here come more crowds, pacing straight for the water, and\nseemingly bound for a dive. Strange! Nothing will content them but\nthe extremest limit of the land; loitering under the shady lee of\nyonder warehouses will not suffice. No. They must get just as nigh\nthe water as they possibly can without falling in. And there they\nstand miles of them leagues. Inlanders all, they come from lanes\nand alleys, streets and avenues north, east, south, and west. Yet\nhere they all unite. Tell me, does the magnetic virtue of the\nneedles of the compasses of all those ships attract them thither?\n\nOnce more. Say you are in the country; in some high land of lakes.\nTake almost any path you please, and ten to one it carries you down\nin a dale, and leaves you there by a pool in the stream. There is\nmagic in it. Let the most absent minded of men be plunged in his\ndeepest reveries stand that man on his legs, set his feet a going,\nand he will infallibly lead you to water, if water there be in all\nthat region. Should you ever be athirst in the great American\ndesert, try this experiment, if your caravan happen to be supplied\nwith a metaphysical professor. Yes, as every one knows, meditation\nand water are wedded for ever.\n\nBut here is an artist. He desires to paint you the dreamiest,\nshadiest, quietest, most enchanting bit of romantic landscape in all\nthe valley of the Saco. What is the chief element he employs? There\nstand his trees, each with a hollow trunk, as if a hermit and a\ncrucifix were within; and here sleeps his meadow, and there sleep his\ncattle; and up from yonder cottage goes a sleepy smoke. Deep into\ndistant woodlands winds a mazy way, reaching to overlapping spurs of\nmountains bathed in their hill side blue. But though the picture\nlies thus tranced, and though this pine tree shakes down its sighs\nlike leaves upon this shepherd's head, yet all were vain, unless the\nshepherd's eye were fixed upon the magic stream before him. Go visit\nthe Prairies in June, when for scores on scores of miles you wade\nknee deep among Tiger lilies what is the one charm\nwanting? Water there is not a drop of water there! Were Niagara\nbut a cataract of sand, would you travel your thousand miles to see\nit? Why did the poor poet of Tennessee, upon suddenly receiving two\nhandfuls of silver, deliberate whether to buy him a coat, which he\nsadly needed, or invest his money in a pedestrian trip to Rockaway\nBeach? Why is almost every robust healthy boy with a robust healthy\nsoul in him, at some time or other crazy to go to sea? Why upon your\nfirst voyage as a passenger, did you yourself feel such a mystical\nvibration, when first told that you and your ship were now out of\nsight of land? Why did the old Persians hold the sea holy? Why did\nthe Greeks give it a separate deity, and own brother of Jove? Surely\nall this is not without meaning. And still deeper the meaning of\nthat story of Narcissus, who because he could not grasp the\ntormenting, mild image he saw in the fountain, plunged into it and\nwas drowned. But that same image, we ourselves see in all rivers and\noceans. It is the image of the ungraspable phantom of life; and this\nis the key to it all.\n\nNow, when I say that I am in the habit of going to sea whenever I\nbegin to grow hazy about the eyes, and begin to be over conscious of\nmy lungs, I do not mean to have it inferred that I ever go to sea as\na passenger. For to go as a passenger you must needs have a purse,\nand a purse is but a rag unless you have something in it. Besides,\npassengers get sea sick grow quarrelsome don't sleep of nights do\nnot enjoy themselves much, as a general thing; no, I never go as a\npassenger; nor, though I am something of a salt, do I ever go to sea\nas a Commodore, or a Captain, or a Cook. I abandon the glory and\ndistinction of such offices to those who like them. For my part, I\nabominate all honourable respectable toils, trials, and tribulations\nof every kind whatsoever. It is quite as much as I can do to take\ncare of myself, without taking care of ships, barques, brigs,\nschooners, and what not. And as for going as cook, though I confess\nthere is considerable glory in that, a cook being a sort of officer\non ship board yet, somehow, I never fancied broiling fowls; though\nonce broiled, judiciously buttered, and judgmatically salted and\npeppered, there is no one who will speak more respectfully, not to\nsay reverentially, of a broiled fowl than I will. It is out of the\nidolatrous dotings of the old Egyptians upon broiled ibis and roasted\nriver horse, that you see the mummies of those creatures in their\nhuge bake houses the pyramids.\n\nNo, when I go to sea, I go as a simple sailor, right before the mast,\nplumb down into the forecastle, aloft there to the royal mast head.\nTrue, they rather order me about some, and make me jump from spar to\nspar, like a grasshopper in a May meadow. And at first, this sort of\nthing is unpleasant enough. It touches one's sense of honour,\nparticularly if you come of an old established family in the land,\nthe Van Rensselaers, or Randolphs, or Hardicanutes. And more than\nall, if just previous to putting your hand into the tar pot, you have\nbeen lording it as a country schoolmaster, making the tallest boys\nstand in awe of you. The transition is a keen one, I assure you,\nfrom a schoolmaster to a sailor, and requires a strong decoction of\nSeneca and the Stoics to enable you to grin and bear it. But even\nthis wears off in time.\n\nWhat of it, if some old hunks of a sea captain orders me to get a\nbroom and sweep down the decks? What does that indignity amount to,\nweighed, I mean, in the scales of the New Testament? Do you think\nthe archangel Gabriel thinks anything the less of me, because I\npromptly and respectfully obey that old hunks in that particular\ninstance? Who ain't a slave? Tell me that. Well, then, however the\nold sea captains may order me about however they may thump and punch\nme about, I have the satisfaction of knowing that it is all right;\nthat everybody else is one way or other served in much the same\nway either in a physical or metaphysical point of view, that is; and\nso the universal thump is passed round, and all hands should rub each\nother's shoulder blades, and be content.\n\nAgain, I always go to sea as a sailor, because they make a point of\npaying me for my trouble, whereas they never pay passengers a single\npenny that I ever heard of. On the contrary, passengers themselves\nmust pay. And there is all the difference in the world between\npaying and being paid. The act of paying is perhaps the most\nuncomfortable infliction that the two orchard thieves entailed upon\nus. But BEING PAID, what will compare with it? The urbane activity\nwith which a man receives money is really marvellous, considering\nthat we so earnestly believe money to be the root of all earthly\nills, and that on no account can a monied man enter heaven. Ah! how\ncheerfully we consign ourselves to perdition!\n\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "i = 7\nprint('key: ', i)\nprint(crypt_2(ct, i))",
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"text": "key: 7\n\u001bRp}}1|t1Xby|pt}?11B~|t1htpcb1pv~11tgtc1|xu1y~f1}~v\u001bactrxbt}h11ypgxv1}xee}t1~c1~1|~th1x1|h1adcbt=1pu1~eyxv\u001bapcexrd}pc1e~1xetctbe1|t1~1by~ct=1X1ey~dvye1X1f~d}u1bpx}1ps~de1p\u001b}xee}t1pu1btt1eyt1fpetch1apce1~w1eyt1f~c}u?11Xe1xb1p1fph1X1ypgt1~w\u001bucxgxv1~ww1eyt1ba}tt1pu1ctvd}pexv1eyt1rxcrd}pex~?11Fyttgtc1X\u001bwxu1|hbt}w1vc~fxv1vcx|1ps~de1eyt1|~dey*1fyttgtc1xe1xb1p1up|a=\u001bucxkk}h1_~gt|stc1x1|h1b~d}*1fyttgtc1X1wxu1|hbt}w1xg~}depcx}h\u001bapdbxv1stw~ct1r~wwx1fpcty~dbtb=1pu1scxvxv1da1eyt1ctpc1~w1tgtch\u001bwdtcp}1X1|tte*1pu1tbatrxp}}h1fyttgtc1|h1yha~b1vte1bdry1p1daatc\u001bypu1~w1|t=1eype1xe1ct`dxctb1p1bec~v1|~cp}1acxrxa}t1e~1actgte1|t\u001bwc~|1ut}xstcpet}h1betaaxv1xe~1eyt1bectte=1pu1|tey~uxrp}}h1z~rzxv\u001bat~a}t6b1ypeb1~ww11eyt=1X1prr~de1xe1yxvy1ex|t1e~1vte1e~1btp1pb1b~~\u001bpb1X1rp?11Eyxb1xb1|h1bdsbexedet1w~c1axbe~}1pu1sp}}?11Fxey1p\u001bayx}~b~ayxrp}1w}~dcxby1Rpe~1eyc~fb1yx|bt}w1da~1yxb1bf~cu*1X1`dxte}h\u001bepzt1e~1eyt1byxa?11Eytct1xb1~eyxv1bdcacxbxv1x1eyxb?11Xw1eyth1sde\u001bztf1xe=1p}|~be1p}}1|t1x1eytxc1utvctt=1b~|t1ex|t1~c1~eytc=1rytcxby\u001bgtch1tpc}h1eyt1bp|t1wtt}xvb1e~fpcub1eyt1~rtp1fxey1|t?\u001b\u001bEytct1~f1xb1h~dc1xbd}pc1rxeh1~w1eyt1\\pypee~tb=1st}etu1c~du1sh\u001bfypcgtb1pb1Xuxp1xb}tb1sh1r~cp}1cttwb11r~||tcrt1bdcc~dub1xe1fxey\u001bytc1bdcw?11Cxvye1pu1}twe=1eyt1bectteb1epzt1h~d1fpetcfpcu?11Xeb\u001btiect|t1u~fe~f1xb1eyt1speetch=1fytct1eype1~s}t1|~}t1xb1fpbytu1sh\u001bfpgtb=1pu1r~~}tu1sh1scttktb=1fyxry1p1wtf1y~dcb1actgx~db1ftct1~de1~w\u001bbxvye1~w1}pu?11]~~z1pe1eyt1rc~fub1~w1fpetc1vpktcb1eytct?\u001b\u001bRxcrd|p|sd}pet1eyt1rxeh1~w1p1uctp|h1Bpsspey1pwetc~~?11V~1wc~|\u001bR~c}tpcb1Y~~z1e~1R~textb1B}xa=1pu1wc~|1eytrt=1sh1Fyxetyp}}=\u001b~ceyfpcu?11Fype1u~1h~d1btt.11A~betu1}xzt1bx}te1btext}b1p}}1pc~du\u001beyt1e~f=1bepu1ey~dbpub1da~1ey~dbpub1~w1|~cep}1|t1wxitu1x1~rtp\u001bctgtcxtb?11B~|t1}tpxv1pvpxbe1eyt1bax}tb*1b~|t1btpetu1da~1eyt\u001baxtc1ytpub*1b~|t1}~~zxv1~gtc1eyt1sd}fpczb1~w1byxab1wc~|1Ryxp*1b~|t\u001byxvy1p}~we1x1eyt1cxvvxv=1pb1xw1becxgxv1e~1vte1p1bex}}1steetc\u001bbtpfpcu1atta?11Sde1eytbt1pct1p}}1}pub|t*1~w1fttz1uphb1ate1da1x\u001b}pey1pu1a}pbetc11extu1e~1r~detcb=1px}tu1e~1strytb=1r}xrytu1e~\u001butbzb?11Y~f1eyt1xb1eyxb.11Pct1eyt1vctt1wxt}ub1v~t.11Fype1u~1eyth\u001bytct.\u001b\u001bSde1}~~z01ytct1r~|t1|~ct1rc~fub=1aprxv1becpxvye1w~c1eyt1fpetc=1pu\u001bbtt|xv}h1s~du1w~c1p1uxgt?11Becpvt011_~eyxv1fx}}1r~ete1eyt|1sde\u001beyt1tiect|tbe1}x|xe1~w1eyt1}pu*1}~xetcxv1dutc1eyt1bypuh1}tt1~w\u001bh~utc1fpcty~dbtb1fx}}1~e1bdwwxrt?11_~?11Eyth1|dbe1vte1{dbe1pb1xvy\u001beyt1fpetc1pb1eyth1a~bbxs}h1rp1fxey~de1wp}}xv1x?11Pu1eytct1eyth\u001bbepu11|x}tb1~w1eyt|11}tpvdtb?11X}putcb1p}}=1eyth1r~|t1wc~|1}ptb\u001bpu1p}}thb=1bectteb1pu1pgtdtb11~cey=1tpbe=1b~dey=1pu1ftbe?11Hte\u001bytct1eyth1p}}1dxet?11Et}}1|t=1u~tb1eyt1|pvtexr1gxcedt1~w1eyt\u001bttu}tb1~w1eyt1r~|apbbtb1~w1p}}1ey~bt1byxab1peecpre1eyt|1eyxeytc.\u001b\u001b^rt1|~ct?11Bph1h~d1pct1x1eyt1r~dech*1x1b~|t1yxvy1}pu1~w1}pztb?\u001bEpzt1p}|~be1ph1apey1h~d1a}tpbt=1pu1et1e~1~t1xe1rpccxtb1h~d1u~f\u001bx1p1up}t=1pu1}tpgtb1h~d1eytct1sh1p1a~~}1x1eyt1bectp|?11Eytct1xb\u001b|pvxr1x1xe?11]te1eyt1|~be1psbte1|xutu1~w1|t1st1a}dvtu1x1yxb\u001buttatbe1ctgtcxtb11bepu1eype1|p1~1yxb1}tvb=1bte1yxb1wtte1p1v~xv=\u001bpu1yt1fx}}1xwp}}xs}h1}tpu1h~d1e~1fpetc=1xw1fpetc1eytct1st1x1p}}\u001beype1ctvx~?11By~d}u1h~d1tgtc1st1peyxcbe1x1eyt1vctpe1P|tcxrp\u001butbtce=1ech1eyxb1tiatcx|te=1xw1h~dc1rpcpgp1ypaat1e~1st1bdaa}xtu\u001bfxey1p1|tepayhbxrp}1ac~wtbb~c?11Htb=1pb1tgtch1~t1z~fb=1|tuxepex~\u001bpu1fpetc1pct1ftuutu1w~c1tgtc?\u001b\u001bSde1ytct1xb1p1pcexbe?11Yt1utbxctb1e~1apxe1h~d1eyt1uctp|xtbe=\u001bbypuxtbe=1`dxtetbe=1|~be1trypexv1sxe1~w1c~|pexr1}pubrpat1x1p}}\u001beyt1gp}}th1~w1eyt1Bpr~?11Fype1xb1eyt1ryxtw1t}t|te1yt1t|a}~hb.11Eytct\u001bbepu1yxb1ecttb=1tpry1fxey1p1y~}}~f1ecdz=1pb1xw1p1ytc|xe1pu1p\u001brcdrxwxi1ftct1fxeyx*1pu1ytct1b}ttab1yxb1|tpu~f=1pu1eytct1b}tta1yxb\u001brpee}t*1pu1da1wc~|1h~utc1r~eepvt1v~tb1p1b}ttah1b|~zt?11Utta1xe~\u001buxbepe1f~~u}pub1fxub1p1|pkh1fph=1ctpryxv1e~1~gtc}paaxv1badcb1~w\u001b|~depxb1speytu1x1eytxc1yx}}1bxut1s}dt?11Sde1ey~dvy1eyt1axredct\u001b}xtb1eydb1ecprtu=1pu1ey~dvy1eyxb1axt1ectt1bypztb1u~f1xeb1bxvyb\u001b}xzt1}tpgtb1da~1eyxb1bytaytcu6b1ytpu=1hte1p}}1ftct1gpx=1d}tbb1eyt\u001bbytaytcu6b1tht1ftct1wxitu1da~1eyt1|pvxr1bectp|1stw~ct1yx|?11V~1gxbxe\u001beyt1Acpxcxtb1x1[dt=1fyt1w~c1br~ctb1~1br~ctb1~w1|x}tb1h~d1fput\u001bztt1utta1p|~v1Exvtc1}x}xtb11fype1xb1eyt1~t1rypc|\u001bfpexv.11Fpetc11eytct1xb1~e1p1uc~a1~w1fpetc1eytct011Ftct1_xpvpcp\u001bsde1p1rpepcpre1~w1bpu=1f~d}u1h~d1ecpgt}1h~dc1ey~dbpu1|x}tb1e~1btt\u001bxe.11Fyh1uxu1eyt1a~~c1a~te1~w1Ettbbtt=1da~1bduut}h1ctrtxgxv1ef~\u001bypuwd}b1~w1bx}gtc=1ut}xstcpet1fyteytc1e~1sdh1yx|1p1r~pe=1fyxry1yt\u001bbpu}h1ttutu=1~c1xgtbe1yxb1|~th1x1p1atutbecxp1ecxa1e~1C~rzpfph\u001bStpry.11Fyh1xb1p}|~be1tgtch1c~sdbe1ytp}eyh1s~h1fxey1p1c~sdbe1ytp}eyh\u001bb~d}1x1yx|=1pe1b~|t1ex|t1~c1~eytc1rcpkh1e~1v~1e~1btp.11Fyh1da~1h~dc\u001bwxcbe1g~hpvt1pb1p1apbbtvtc=1uxu1h~d1h~dcbt}w1wtt}1bdry1p1|hbexrp}\u001bgxscpex~=1fyt1wxcbe1e~}u1eype1h~d1pu1h~dc1byxa1ftct1~f1~de1~w\u001bbxvye1~w1}pu.11Fyh1uxu1eyt1~}u1Atcbxpb1y~}u1eyt1btp1y~}h.11Fyh1uxu\u001beyt1Vcttzb1vxgt1xe1p1btapcpet1utxeh=1pu1~f1sc~eytc1~w1[~gt.11Bdct}h\u001bp}}1eyxb1xb1~e1fxey~de1|tpxv?11Pu1bex}}1uttatc1eyt1|tpxv1~w\u001beype1be~ch1~w1_pcrxbbdb=1fy~1strpdbt1yt1r~d}u1~e1vcpba1eyt\u001be~c|texv=1|x}u1x|pvt1yt1bpf1x1eyt1w~depx=1a}dvtu1xe~1xe1pu\u001bfpb1uc~ftu?11Sde1eype1bp|t1x|pvt=1ft1~dcbt}gtb1btt1x1p}}1cxgtcb1pu\u001b~rtpb?11Xe1xb1eyt1x|pvt1~w1eyt1dvcpbaps}t1aype~|1~w1}xwt*1pu1eyxb\u001bxb1eyt1zth1e~1xe1p}}?\u001b\u001b_~f=1fyt1X1bph1eype1X1p|1x1eyt1ypsxe1~w1v~xv1e~1btp1fyttgtc1X\u001bstvx1e~1vc~f1ypkh1ps~de1eyt1thtb=1pu1stvx1e~1st1~gtc1r~brx~db1~w\u001b|h1}dvb=1X1u~1~e1|tp1e~1ypgt1xe1xwtcctu1eype1X1tgtc1v~1e~1btp1pb\u001bp1apbbtvtc?11W~c1e~1v~1pb1p1apbbtvtc1h~d1|dbe1ttub1ypgt1p1adcbt=\u001bpu1p1adcbt1xb1sde1p1cpv1d}tbb1h~d1ypgt1b~|teyxv1x1xe?11Stbxutb=\u001bapbbtvtcb1vte1btp1bxrz11vc~f1`dpcct}b~|t11u~6e1b}tta1~w1xvyeb11u~\u001b~e1t{~h1eyt|bt}gtb1|dry=1pb1p1vttcp}1eyxv*11~=1X1tgtc1v~1pb1p\u001bapbbtvtc*1~c=1ey~dvy1X1p|1b~|teyxv1~w1p1bp}e=1u~1X1tgtc1v~1e~1btp\u001bpb1p1R~||~u~ct=1~c1p1Rpaepx=1~c1p1R~~z?11X1pspu~1eyt1v}~ch1pu\u001buxbexrex~1~w1bdry1~wwxrtb1e~1ey~bt1fy~1}xzt1eyt|?11W~c1|h1apce=1X\u001bps~|xpet1p}}1y~~dcps}t1ctbatreps}t1e~x}b=1ecxp}b=1pu1ecxsd}pex~b\u001b~w1tgtch1zxu1fypeb~tgtc?11Xe1xb1`dxet1pb1|dry1pb1X1rp1u~1e~1epzt\u001brpct1~w1|hbt}w=1fxey~de1epzxv1rpct1~w1byxab=1spc`dtb=1scxvb=\u001bbry~~tcb=1pu1fype1~e?11Pu1pb1w~c1v~xv1pb1r~~z=11ey~dvy1X1r~wtbb\u001beytct1xb1r~bxutcps}t1v}~ch1x1eype=1p1r~~z1stxv1p1b~ce1~w1~wwxrtc\u001b~1byxa1s~pcu11hte=1b~|ty~f=1X1tgtc1wprxtu1sc~x}xv1w~f}b*11ey~dvy\u001b~rt1sc~x}tu=1{duxrx~db}h1sdeetctu=1pu1{duv|pexrp}}h1bp}etu1pu\u001bataatctu=1eytct1xb1~1~t1fy~1fx}}1batpz1|~ct1ctbatrewd}}h=1~e1e~\u001bbph1ctgtctexp}}h=1~w1p1sc~x}tu1w~f}1eyp1X1fx}}?11Xe1xb1~de1~w1eyt\u001bxu~}pec~db1u~exvb1~w1eyt1~}u1Tvhaexpb1da~1sc~x}tu1xsxb1pu1c~pbetu\u001bcxgtc1y~cbt=1eype1h~d1btt1eyt1|d||xtb1~w1ey~bt1rctpedctb1x1eytxc\u001bydvt1spzt1y~dbtb1eyt1ahcp|xub?\u001b\u001b_~=1fyt1X1v~1e~1btp=1X1v~1pb1p1bx|a}t1bpx}~c=1cxvye1stw~ct1eyt1|pbe=\u001ba}d|s1u~f1xe~1eyt1w~ctrpbe}t=1p}~we1eytct1e~1eyt1c~hp}1|pbe1ytpu?\u001bEcdt=1eyth1cpeytc1~cutc1|t1ps~de1b~|t=1pu1|pzt1|t1{d|a1wc~|1bapc1e~\u001bbapc=1}xzt1p1vcpbby~aatc1x1p1\\ph1|tpu~f?11Pu1pe1wxcbe=1eyxb1b~ce1~w\u001beyxv1xb1da}tpbpe1t~dvy?11Xe1e~drytb1~t6b1btbt1~w1y~~dc=\u001bapcexrd}pc}h1xw1h~d1r~|t1~w1p1~}u1tbeps}xbytu1wp|x}h1x1eyt1}pu=\u001beyt1Gp1Ctbbt}ptcb=1~c1Cpu~}ayb=1~c1Ypcuxrpdetb?11Pu1|~ct1eyp\u001bp}}=1xw1{dbe1actgx~db1e~1adeexv1h~dc1ypu1xe~1eyt1epc1a~e=1h~d1ypgt\u001bstt1}~cuxv1xe1pb1p1r~dech1bry~~}|pbetc=1|pzxv1eyt1ep}}tbe1s~hb\u001bbepu1x1pft1~w1h~d?11Eyt1ecpbxex~1xb1p1ztt1~t=1X1pbbdct1h~d=\u001bwc~|1p1bry~~}|pbetc1e~1p1bpx}~c=1pu1ct`dxctb1p1bec~v1utr~rex~1~w\u001bBttrp1pu1eyt1Be~xrb1e~1tps}t1h~d1e~1vcx1pu1stpc1xe?11Sde1tgt\u001beyxb1ftpcb1~ww1x1ex|t?\u001b\u001bFype1~w1xe=1xw1b~|t1~}u1ydzb1~w1p1btp1rpaepx1~cutcb1|t1e~1vte1p\u001bsc~~|1pu1bftta1u~f1eyt1utrzb.11Fype1u~tb1eype1xuxvxeh1p|~de1e~=\u001bftxvytu=1X1|tp=1x1eyt1brp}tb1~w1eyt1_tf1Etbep|te.11U~1h~d1eyxz\u001beyt1pcrypvt}1Vpscxt}1eyxzb1pheyxv1eyt1}tbb1~w1|t=1strpdbt1X\u001bac~|ae}h1pu1ctbatrewd}}h1~sth1eype1~}u1ydzb1x1eype1apcexrd}pc\u001bxbeprt.11Fy~1px6e1p1b}pgt.11Et}}1|t1eype?11Ft}}=1eyt=1y~ftgtc1eyt\u001b~}u1btp1rpaepxb1|ph1~cutc1|t1ps~de11y~ftgtc1eyth1|ph1eyd|a1pu1adry\u001b|t1ps~de=1X1ypgt1eyt1bpexbwprex~1~w1z~fxv1eype1xe1xb1p}}1cxvye*\u001beype1tgtchs~uh1t}bt1xb1~t1fph1~c1~eytc1btcgtu1x1|dry1eyt1bp|t\u001bfph11txeytc1x1p1ayhbxrp}1~c1|tepayhbxrp}1a~xe1~w1gxtf=1eype1xb*1pu\u001bb~1eyt1dxgtcbp}1eyd|a1xb1apbbtu1c~du=1pu1p}}1ypub1by~d}u1cds1tpry\u001b~eytc6b1by~d}utc1s}putb=1pu1st1r~ete?\u001b\u001bPvpx=1X1p}fphb1v~1e~1btp1pb1p1bpx}~c=1strpdbt1eyth1|pzt1p1a~xe1~w\u001baphxv1|t1w~c1|h1ec~ds}t=1fytctpb1eyth1tgtc1aph1apbbtvtcb1p1bxv}t\u001bath1eype1X1tgtc1ytpcu1~w?11^1eyt1r~ecpch=1apbbtvtcb1eyt|bt}gtb\u001b|dbe1aph?11Pu1eytct1xb1p}}1eyt1uxwwtctrt1x1eyt1f~c}u1steftt\u001baphxv1pu1stxv1apxu?11Eyt1pre1~w1aphxv1xb1atcypab1eyt1|~be\u001bdr~|w~ceps}t1xw}xrex~1eype1eyt1ef~1~crypcu1eyxtgtb1tepx}tu1da~\u001bdb?11Sde1STX_V1APXU=11fype1fx}}1r~|apct1fxey1xe.11Eyt1dcspt1prexgxeh\u001bfxey1fyxry1p1|p1ctrtxgtb1|~th1xb1ctp}}h1|pcgt}}~db=1r~bxutcxv\u001beype1ft1b~1tpctbe}h1st}xtgt1|~th1e~1st1eyt1c~~e1~w1p}}1tpcey}h\u001bx}}b=1pu1eype1~1~1prr~de1rp1p1|~xtu1|p1tetc1ytpgt?11Py01y~f\u001bryttcwd}}h1ft1r~bxv1~dcbt}gtb1e~1atcuxex~0\u001b\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "So, again, the key is 22."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 3 A Many-time pad"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 3.1\n\nTo find the length of the key, we compute `ct^shift(ct, i)` for different `i` and look for results with the most `\\x00` bytes.\n\nThis is because collisions between the plaintext and a shifted version is much more likely than collisions in two random strings. There are only some 52 symbols in English ASCII, but 256 possible bytes in total. So if we can cancel the pad out, we will find a lot more collisions compared to when we are examining a string that's computed with `M_1 (xor) (pad) (xor) shift(i, M_2) (xor) shift(i, pad)` .\n\n\nTo find the key itself, we examine this guys work:\nhttp://www.thecrowned.org/the-one-time-pad-and-the-many-time-pad-vulnerability\n\nHe says that the space character, because it is in a different range compared to the ascii letters, can be exploited to crack TTPs.\n\nMore specifically, consider the following ascii numbers:"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "ord('A'), ord('Z'), ord('a'), ord('z'), ord(' ')",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 16,
"data": {
"text/plain": "(65, 90, 97, 122, 32)"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "lowers = np.array(range(ord('a'), ord('z')+1))\nuppers = np.array(range(ord('A'), ord('Z')+1))\nletters = np.concatenate((lowers, uppers))",
"execution_count": 17,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "(letters.reshape((len(letters), 1)) ^letters.reshape((1, len(letters)))).flatten().max()\n\nletters_xors = (letters.reshape((len(letters), 1)) ^letters.reshape((1, len(letters)))).flatten()\n\nletters_xors.min(),letters_xors.max()",
"execution_count": 18,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 18,
"data": {
"text/plain": "(0, 63)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "space_letters_xors = ord(' ') ^ letters\n\nspace_letters_xors.min(),space_letters_xors.max()",
"execution_count": 19,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 19,
"data": {
"text/plain": "(65, 122)"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "When you xor a letter and a letter, you get something in `range(0, 64)`; when a space and a letter is xor-ed, the result is within `range(65, 123)`"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "If there are a lot of spaces in the cyphertext, which there should, we can abuse this to find where the spaces are and then find the key."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Getting the key"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "b64ct = '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'",
"execution_count": 20,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "ct = base64.b64decode(b64ct)",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "def xor_text(m, n):\n ret = []\n for i in range(max(len(m), len(n))):\n ret.append(m[i%len(m)] ^ n[i%len(n)])\n return bytes(ret)",
"execution_count": 22,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "def shift_text(m, shift):\n return b'\\x00'*shift + m",
"execution_count": 23,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "def shifted_xor(shift):\n ret = xor_text(b'\\x00' * shift + ct, ct+b'\\x00'*shift)\n return ret[shift:-shift]\n\ndef count_00(m):\n count = 0\n for c in m:\n if c == 0:\n count += 1\n return count",
"execution_count": 24,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "zcounts = []\nfor i in range(100):\n zcounts.append(count_00(shifted_xor(i)))",
"execution_count": 25,
"outputs": []
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "plt.plot(zcounts)\nplt.show()",
"execution_count": 26,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f8dba1f2cc0>",
"image/png": "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\nNEXO/w+rL0Dxuwx3bgAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "np.argmax(zcounts)",
"execution_count": 27,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 27,
"data": {
"text/plain": "32"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "It looks like there's another one around 20. Let's check"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "zcounts[10:20]",
"execution_count": 28,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 28,
"data": {
"text/plain": "[215, 153, 216, 128, 157, 132, 742, 150, 146, 141]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "np.argmax(zcounts[:31])",
"execution_count": 29,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 29,
"data": {
"text/plain": "16"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "So the key length is likely 16."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Cracking the cypher"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "KL = 16",
"execution_count": 30,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "cts = [\n ct[i:i+KL] for i in range(0, len(ct), KL)\n] # treating each segment encrypted with the same pad as an individual ciphertext",
"execution_count": 31,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "len(cts)",
"execution_count": 32,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 32,
"data": {
"text/plain": "706"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "look for positions that are likely to be spaces, by looking for positions in xor(m1, m2) that are within the letter-xor-space range"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "table = [None] * len(cts)",
"execution_count": 33,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "for i in range(len(cts)):\n ct1 = cts[i]\n row = [0]*16\n for ct2 in cts:\n for j in range(16):\n if ct1[j] ^ ct2[j] in range(65, 123):\n row[j] += 1\n table[i] = row",
"execution_count": 34,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "table[0]",
"execution_count": 35,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 35,
"data": {
"text/plain": "[139,\n 156,\n 543,\n 116,\n 126,\n 135,\n 557,\n 151,\n 569,\n 143,\n 152,\n 135,\n 125,\n 143,\n 142,\n 561]"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "set(np.argmax(row) for row in table)",
"execution_count": 36,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 36,
"data": {
"text/plain": "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "So we probably have space characters in every single position over all the 706 ciphertexts. Good"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "spacepos = [None] * len(cts)",
"execution_count": 37,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "spacepos = np.array([np.argmax(row) for row in table])",
"execution_count": 38,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "For each position `j` in the key, use majority voting to determine a guess for `key[j]^ord(' ')'"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "from collections import Counter",
"execution_count": 39,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "key_guess = [None] * 16\nfor j in range(16):\n candidate_cts = [cts[i.item()]\n for i\n in np.argwhere(spacepos == j)] # all cts where position j is likely a space\n \n candidate_characters = [c[j] for c in candidate_cts] ## extract jth position char\n \n key_xor_space_guess = Counter(candidate_characters).most_common()[0][0] # extract most common char\n key_guess[j] = ord(' ') ^ key_xor_space_guess",
"execution_count": 40,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "key_guess",
"execution_count": 41,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 41,
"data": {
"text/plain": "[83, 112, 111, 110, 103, 101, 32, 66, 111, 98, 32, 82, 111, 99, 107, 115]"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "key = bytes(key_guess)",
"execution_count": 42,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "xor_text(key, ct)",
"execution_count": 43,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 43,
"data": {
"text/plain": "b\"It was a bright cold day in April, and the clocks were striking thirteen.\\nWinston Smith, his chin nuzzled into his breast in an effort to escape the\\nvile wind, slipped quickly through the glass doors of Victory Mansions,\\nthough not quickly enough to prevent a swirl of gritty dust from entering\\nalong with him.\\n\\nThe hallway smelt of boiled cabbage and old rag mats. At one end of it a\\ncoloured poster, too large for indoor display, had been tacked to the wall.\\nIt depicted simply an enormous face, more than a metre wide: the face of a\\nman of about forty-five, with a heavy black moustache and ruggedly handsome\\nfeatures. Winston made for the stairs. It was no use trying the lift. Even\\nat the best of times it was seldom working, and at present the electric\\ncurrent was cut off during daylight hours. It was part of the economy drive\\nin preparation for Hate Week. The flat was seven flights up, and Winston,\\nwho was thirty-nine and had a varicose ulcer above his right ankle, went\\nslowly, resting several times on the way. On each landing, opposite the\\nlift-shaft, the poster with the enormous face gazed from the wall. It was\\none of those pictures which are so contrived that the eyes follow you about\\nwhen you move. BIG BROTHER IS WATCHING YOU, the caption beneath it ran.\\n\\nInside the flat a fruity voice was reading out a list of figures which had\\nsomething to do with the production of pig-iron. The voice came from an\\noblong metal plaque like a dulled mirror which formed part of the surface\\nof the right-hand wall. Winston turned a switch and the voice sank\\nsomewhat, though the words were still distinguishable. The instrument\\n(the telescreen, it was called) could be dimmed, but there was no way of\\nshutting it off completely. He moved over to the window: a smallish, frail\\nfigure, the meagreness of his body merely emphasized by the blue overalls\\nwhich were the uniform of the party. His hair was very fair, his face\\nnaturally sanguine, his skin roughened by coarse soap and blunt razor\\nblades and the cold of the winter that had just ended.\\n\\nOutside, even through the shut window-pane, the world looked cold. Down in\\nthe street little eddies of wind were whirling dust and torn paper into\\nspirals, and though the sun was shining and the sky a harsh blue, there\\nseemed to be no colour in anything, except the posters that were plastered\\neverywhere. The black-moustachio'd face gazed down from every commanding\\ncorner. There was one on the house-front immediately opposite. BIG BROTHER\\nIS WATCHING YOU, the caption said, while the dark eyes looked deep into\\nWinston's own. Down at street level another poster, torn at one corner,\\nflapped fitfully in the wind, alternately covering and uncovering the\\nsingle word INGSOC. In the far distance a helicopter skimmed down between\\nthe roofs, hovered for an instant like a bluebottle, and darted away again\\nwith a curving flight. It was the police patrol, snooping into people's\\nwindows. The patrols did not matter, however. Only the Thought Police\\nmattered.\\n\\nBehind Winston's back the voice from the telescreen was still babbling away\\nabout pig-iron and the overfulfilment of the Ninth Three-Year Plan. The\\ntelescreen received and transmitted simultaneously. Any sound that Winston\\nmade, above the level of a very low whisper, would be picked up by it,\\nmoreover, so long as he remained within the field of vision which the metal\\nplaque commanded, he could be seen as well as heard. There was of course\\nno way of knowing whether you were being watched at any given moment. How\\noften, or on what system, the Thought Police plugged in on any individual\\nwire was guesswork. It was even conceivable that they watched everybody all\\nthe time. But at any rate they could plug in your wire whenever they wanted\\nto. You had to live--did live, from habit that became instinct--in the\\nassumption that every sound you made was overheard, and, except in\\ndarkness, every movement scrutinized.\\n\\nWinston kept his back turned to the telescreen. It was safer; though, as he\\nwell knew, even a back can be revealing. A kilometre away the Ministry of\\nTruth, his place of work, towered vast and white above the grimy landscape.\\nThis, he thought with a sort of vague distaste--this was London, chief\\ncity of Airstrip One, itself the third most populous of the provinces of\\nOceania. He tried to squeeze out some childhood memory that should tell him\\nwhether London had always been quite like this. Were there always these\\nvistas of rotting nineteenth-century houses, their sides shored up with\\nbaulks of timber, their windows patched with cardboard and their roofs\\nwith corrugated iron, their crazy garden walls sagging in all directions?\\nAnd the bombed sites where the plaster dust swirled in the air and the\\nwillow-herb straggled over the heaps of rubble; and the places where the\\nbombs had cleared a larger patch and there had sprung up sordid colonies\\nof wooden dwellings like chicken-houses? But it was no use, he could not\\nremember: nothing remained of his childhood except a series of bright-lit\\ntableaux occurring against no background and mostly unintelligible.\\n\\nThe Ministry of Truth--Minitrue, in Newspeak [Newspeak was the official\\nlanguage of Oceania. For an account of its structure and etymology see\\nAppendix.]--was startlingly different from any other object in sight. It\\nwas an enormous pyramidal structure of glittering white concrete, soaring\\nup, terrace after terrace, 300 metres into the air. From where Winston\\nstood it was just possible to read, picked out on its white face in\\nelegant lettering, the three slogans of the Party:\\n\\n\\n WAR IS PEACE\\n FREEDOM IS SLAVERY\\n IGNORANCE IS STRENGTH\\n\\n\\nThe Ministry of Truth contained, it was said, three thousand rooms above\\nground level, and corresponding ramifications below. Scattered about London\\nthere were just three other buildings of similar appearance and size. So\\ncompletely did they dwarf the surrounding architecture that from the roof\\nof Victory Mansions you could see all four of them simultaneously. They\\nwere the homes of the four Ministries between which the entire apparatus\\nof government was divided. The Ministry of Truth, which concerned itself\\nwith news, entertainment, education, and the fine arts. The Ministry of\\nPeace, which concerned itself with war. The Ministry of Love, which\\nmaintained law and order. And the Ministry of Plenty, which was responsible\\nfor economic affairs. Their names, in Newspeak: Minitrue, Minipax, Miniluv,\\nand Miniplenty.\\n\\nThe Ministry of Love was the really frightening one. There were no windows\\nin it at all. Winston had never been inside the Ministry of Love, nor\\nwithin half a kilometre of it. It was a place impossible to enter except\\non official business, and then only by penetrating through a maze of\\nbarbed-wire entanglements, steel doors, and hidden machine-gun nests. Even\\nthe streets leading up to its outer barriers were roamed by gorilla-faced\\nguards in black uniforms, armed with jointed truncheons.\\n\\nWinston turned round abruptly. He had set his features into the\\nexpression of quiet optimism which it was advisable to wear when facing\\nthe telescreen. He crossed the room into the tiny kitchen. By leaving\\nthe Ministry at this time of day he had sacrificed his lunch in the\\ncanteen, and he was aware that there was no food in the kitchen except\\na hunk of dark-coloured bread which had got to be saved for tomorrow's\\nbreakfast. He took down from the shelf a bottle of colourless liquid\\nwith a plain white label marked VICTORY GIN. It gave off a sickly, oily\\nsmell, as of Chinese rice-spirit. Winston poured out nearly a teacupful,\\nnerved himself for a shock, and gulped it down like a dose of medicine.\\n\\nInstantly his face turned scarlet and the water ran out of his eyes. The\\nstuff was like nitric acid, and moreover, in swallowing it one had the\\nsensation of being hit on the back of the head with a rubber club. The\\nnext moment, however, the burning in his belly died down and the world\\nbegan to look more cheerful. He took a cigarette from a crumpled packet\\nmarked VICTORY CIGARETTES and incautiously held it upright, whereupon the\\ntobacco fell out on to the floor. With the next he was more successful.\\nHe went back to the living-room and sat down at a small table that stood\\nto the left of the telescreen. From the table drawer he took out a\\npenholder, a bottle of ink, and a thick, quarto-sized blank book with a\\nred back and a marbled cover.\\n\\nFor some reason the telescreen in the living-room was in an unusual\\nposition. Instead of being placed, as was normal, in the end wall, where\\nit could command the whole room, it was in the longer wall, opposite the\\nwindow. To one side of it there was a shallow alcove in which Winston\\nwas now sitting, and which, when the flats were built, had probably been\\nintended to hold bookshelves. By sitting in the alcove, and keeping well\\nback, Winston was able to remain outside the range of the telescreen, so\\nfar as sight went. He could be heard, of course, but so long as he stayed\\nin his present position he could not be seen. It was partly the unusual\\ngeography of the room that had suggested to him the thing that he was now\\nabout to do.\\n\\nBut it had also been suggested by the book that he had just taken out of\\nthe drawer. It was a peculiarly beautiful book. Its smooth creamy paper,\\na little yellowed by age, was of a kind that had not been manufactured for\\nat least forty years past. He could guess, however, that the book was much\\nolder than that. He had seen it lying in the window of a frowsy little\\njunk-shop in a slummy quarter of the town (just what quarter he did not\\nnow remember) and had been stricken immediately by an overwhelming desire\\nto possess it. Party members were supposed not to go into ordinary shops\\n('dealing on the free market', it was called), but the rule was not\\nstrictly kept, because there were various things, such as shoelaces and\\nrazor blades, which it was impossible to get hold of in any other way. He\\nhad given a quick glance up and down the street and then had slipped inside\\nand bought the book for two dollars fifty. At the time he was not conscious\\nof wanting it for any particular purpose. He had carried it guiltily home\\nin his briefcase. Even with nothing written in it, it was a compromising\\npossession.\\n\\nThe thing that he was about to do was to open a diary. This was not illegal\\n(nothing was illegal, since there were no longer any laws), but if detected\\nit was reasonably certain that it would be punished by death, or at least\\nby twenty-five years in a forced-labour camp. Winston fitted a nib into\\nthe penholder and sucked it to get the grease off. The pen was an archaic\\ninstrument, seldom used even for signatures, and he had procured one,\\nfurtively and with some difficulty, simply because of a feeling that the\\nbeautiful creamy paper deserved to be written on with a real nib instead\\nof being scratched with an ink-pencil. Actually he was not used to writing\\nby hand. Apart from very short notes, it was usual to dictate everything\\ninto the speak-write which was of course impossible for his present\\npurpose. He dipped the pen into the ink and then faltered for just a\\nsecond. A tremor had gone through his bowels. To mark the paper was the\\ndecisive act. In small clumsy letters he wrote: April fourth, ninghteen-eighty-four.\\n \""
},
"metadata": {}
}
]
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.3",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"gist": {
"id": "",
"data": {
"description": "HW4 Netsec Xida Ren",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment