{ "metadata": { "name": "", "signature": "sha256:c4879f550d49d776eff31ee9f3296756aab1dcd81e1e5aad61ade46d9b29600d" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from cipher import *" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_encipherl('hellothere', 3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "'horeltee lh '" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "message = 'hellothere'\n", "height = 2" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 169 }, { "cell_type": "code", "collapsed": false, "input": [ "sections = chunks(message, (height - 1) * 2, fillvalue='!')\n", "sections" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 170, "text": [ "['he', 'll', 'ot', 'he', 're']" ] } ], "prompt_number": 170 }, { "cell_type": "code", "collapsed": false, "input": [ "rows = [s[0] for s in sections]\n", "rows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 171, "text": [ "['h', 'l', 'o', 'h', 'r']" ] } ], "prompt_number": 171 }, { "cell_type": "code", "collapsed": false, "input": [ "for r in range(1, height - 1):\n", " rows += [s[r] + s[-r] for s in sections]\n", "rows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 172, "text": [ "['h', 'l', 'o', 'h', 'r']" ] } ], "prompt_number": 172 }, { "cell_type": "code", "collapsed": false, "input": [ "rows += [s[height - 1] for s in sections]\n", "rows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 173, "text": [ "['h', 'l', 'o', 'h', 'r', 'e', 'l', 't', 'e', 'e']" ] } ], "prompt_number": 173 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext = ''.join(rows)\n", "ciphertext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 174, "text": [ "'hlohreltee'" ] } ], "prompt_number": 174 }, { "cell_type": "code", "collapsed": false, "input": [ "def railfence_encipherl(message, height, fillvalue=' '):\n", " \"\"\"Railfence cipher\n", " \"\"\"\n", " sections = chunks(message, (height - 1) * 2, fillvalue=fillvalue)\n", " # Add the top row\n", " rows = [s[0] for s in sections]\n", " # process the middle rows of the grid\n", " for r in range(1, height - 1):\n", " rows += [s[r] + s[-r] for s in sections]\n", " # process the bottom row\n", " rows += [s[height - 1] for s in sections]\n", " return ''.join(rows)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext = railfence_encipherl(message, height, fillvalue='!')\n", "ciphertext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 175, "text": [ "'hlohreltee'" ] } ], "prompt_number": 175 }, { "cell_type": "code", "collapsed": false, "input": [ "len(ciphertext)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 176, "text": [ "10" ] } ], "prompt_number": 176 }, { "cell_type": "code", "collapsed": false, "input": [ "n_secs = len(ciphertext) // ((height - 1) * 2)\n", "n_secs" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 177, "text": [ "5" ] } ], "prompt_number": 177 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext[:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 109, "text": [ "'hhaes'" ] } ], "prompt_number": 109 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext[5:15]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 110, "text": [ "'etevshae!!'" ] } ], "prompt_number": 110 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext[15:25]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 111, "text": [ "'lorateri!!'" ] } ], "prompt_number": 111 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext[25:]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 112, "text": [ "'lemt!'" ] } ], "prompt_number": 112 }, { "cell_type": "code", "collapsed": false, "input": [ "downrows = [ciphertext[:n_secs]]\n", "uprows = []\n", "downrows, uprows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 180, "text": [ "(['hlohr'], [])" ] } ], "prompt_number": 180 }, { "cell_type": "code", "collapsed": false, "input": [ "for r in range(1, height, 2):\n", " midrow = ciphertext[r * n_secs:(r+2)*n_secs]\n", " downrows += [''.join([midrow[i] for i in range(0, len(midrow), 2)])]\n", " uprows = [''.join([midrow[i] for i in range(1, len(midrow), 2)])] + uprows\n", "downrows, uprows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 179, "text": [ "(['hlohr', 'ete'], ['le'])" ] } ], "prompt_number": 179 }, { "cell_type": "code", "collapsed": false, "input": [ "downrows += [ciphertext[-n_secs:]]\n", "downrows, uprows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 181, "text": [ "(['hlohr', 'eltee'], [])" ] } ], "prompt_number": 181 }, { "cell_type": "code", "collapsed": false, "input": [ "rows = downrows + uprows\n", "rows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 182, "text": [ "['hlohr', 'eltee']" ] } ], "prompt_number": 182 }, { "cell_type": "code", "collapsed": false, "input": [ "midrow = rows[1]\n", "midrow" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 64, "text": [ "'elteevsmhate!!'" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "mid_down = ''.join([midrow[i] for i in range(0, len(midrow), 2)])\n", "mid_down" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "'etesht!'" ] } ], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "mid_up = ''.join([midrow[i] for i in range(1, len(midrow), 2)])\n", "mid_up" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "'levmae!'" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "rows = downrows + uprows\n", "rows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 139, "text": [ "['hhaesspfoilcs',\n", " 'eesataitrnfi!',\n", " 'lrtrhleetgep!',\n", " 'lemtiocxernh!',\n", " 'oaeisnetsace!',\n", " 'tvheigoftier!']" ] } ], "prompt_number": 139 }, { "cell_type": "code", "collapsed": false, "input": [ "''.join(letter for section in zip(*rows) for letter in section)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 183, "text": [ "'hellothere'" ] } ], "prompt_number": 183 }, { "cell_type": "code", "collapsed": false, "input": [ "def railfence_decipherl(message, height):\n", " n_secs = len(message) // ((height - 1) * 2)\n", " downrows = [message[:n_secs]]\n", " uprows = []\n", " for r in range(height-2):\n", " midrow = ciphertext[(2 * r + 1) * n_secs:(2 * r + 1) * n_secs + n_secs * 2]\n", " downrows += [''.join([midrow[i] for i in range(0, len(midrow), 2)])]\n", " uprows = [''.join([midrow[i] for i in range(1, len(midrow), 2)])] + uprows\n", " downrows += [message[-n_secs:]]\n", " rows = downrows + uprows\n", " return ''.join(letter for section in zip(*rows) for letter in section)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 249 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 154, "text": [ "'hhaesetevshae!!lorateri!!lemt!'" ] } ], "prompt_number": 154 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_decipherl(ciphertext, 4)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 155, "text": [ "''" ] } ], "prompt_number": 155 }, { "cell_type": "code", "collapsed": false, "input": [ "plaintext = sanitise('hello there avast me hearties this is a long piece of text for testing railfence ciphers')\n", "plaintext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 250, "text": [ "'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'" ] } ], "prompt_number": 250 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext = railfence_encipherl(plaintext, height, fillvalue='!')\n", "ciphertext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 163, "text": [ "'hhaesspfoilcsetevshaetiagiotfrtnifeir!!loraterihslneeettsgaecpe!!lemtiocxernh!'" ] } ], "prompt_number": 163 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_decipherl(ciphertext, height)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 164, "text": [ "'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers!!!!!'" ] } ], "prompt_number": 164 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_encipherl('hellothere', 2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 186, "text": [ "'hlohreltee'" ] } ], "prompt_number": 186 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_decipherl('hlohreltee', 2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 187, "text": [ "'hellothere'" ] } ], "prompt_number": 187 }, { "cell_type": "code", "collapsed": false, "input": [ "[i for i in range(1, 2, 2)]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 184, "text": [ "[1]" ] } ], "prompt_number": 184 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_encipherl('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 10, fillvalue='!')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 265, "text": [ "'hepisehagitnr!!lernesge!!lmtocerh!!otiletap!!tseaorii!!hassfolc!!evtitffe!!rahsetec!!eixn!'" ] } ], "prompt_number": 265 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_decipherl('horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr!!lhateihsnefttiaece!', 3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 191, "text": [ "'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers!!!'" ] } ], "prompt_number": 191 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_encipherl('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 4, fillvalue='!')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 240, "text": [ "'hhaesspfoilcsetevshaetiagiotfrtnifeir!!loraterihslneeettsgaecpe!!lemtiocxernh!'" ] } ], "prompt_number": 240 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_decipherl('hhaesspfoilcsetevshaetiagiotfrtnifeir!!loraterihslneeettsgaecpe!!lemtiocxernh!', 4)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 241, "text": [ "'hmelfhhetettaaimaoecetcosfei!rsn!olrpntcvefrsxa!o!teilihirgaltintecixhehsst!in'" ] } ], "prompt_number": 241 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_encipherl('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 5, fillvalue='!')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 238, "text": [ "'hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!'" ] } ], "prompt_number": 238 }, { "cell_type": "code", "collapsed": false, "input": [ "railfence_decipherl('hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!', 5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 239, "text": [ "'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers!!!!!!!'" ] } ], "prompt_number": 239 }, { "cell_type": "code", "collapsed": false, "input": [ "len(railfence_encipherl('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 5, fillvalue='!'))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 199, "text": [ "80" ] } ], "prompt_number": 199 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext = 'horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr!!lhateihsnefttiaece!'\n", "height=3" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 226 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext = 'hhaesspfoilcsetevshaetiagiotfrtnifeir!!loraterihslneeettsgaecpe!!lemtiocxernh!'\n", "height=4" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 242 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext = 'hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!'\n", "height=5" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 226 }, { "cell_type": "code", "collapsed": false, "input": [ "n_secs = len(ciphertext) // ((height - 1) * 2)\n", "n_secs" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 243, "text": [ "13" ] } ], "prompt_number": 243 }, { "cell_type": "code", "collapsed": false, "input": [ "downrows = [ciphertext[:n_secs]]\n", "uprows = []\n", "downrows, uprows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 244, "text": [ "(['hhaesspfoilcs'], [])" ] } ], "prompt_number": 244 }, { "cell_type": "code", "collapsed": false, "input": [ "for r in range(height-2):\n", " print('From', (2 * r + 1) * n_secs, 'to', (2 * r + 1) * n_secs + n_secs * 2)\n", " midrow = ciphertext[(2 * r + 1) * n_secs:(2 * r + 1) * n_secs + n_secs * 2]\n", " downrows += [''.join([midrow[i] for i in range(0, len(midrow), 2)])]\n", " uprows = [''.join([midrow[i] for i in range(1, len(midrow), 2)])] + uprows\n", "downrows, uprows" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "From 13 to 39\n", "From 39 to 65\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 245, "text": [ "(['hhaesspfoilcs', 'eesataitrnfi!', 'lrtrhleetgep!'],\n", " ['oaeisnetsace!', 'tvheigoftier!'])" ] } ], "prompt_number": 245 }, { "cell_type": "code", "collapsed": false, "input": [ "downrows += [ciphertext[-n_secs:]]\n", "downrows, uprows" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 246, "text": [ "(['hhaesspfoilcs', 'eesataitrnfi!', 'lrtrhleetgep!', 'lemtiocxernh!'],\n", " ['oaeisnetsace!', 'tvheigoftier!'])" ] } ], "prompt_number": 246 }, { "cell_type": "code", "collapsed": false, "input": [ "rows = downrows + uprows" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 247 }, { "cell_type": "code", "collapsed": false, "input": [ "''.join(letter for section in zip(*rows) for letter in section)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 248, "text": [ "'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers!!!!!'" ] } ], "prompt_number": 248 }, { "cell_type": "code", "collapsed": false, "input": [ "[i for i in range(0)]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 236, "text": [ "[]" ] } ], "prompt_number": 236 }, { "cell_type": "code", "collapsed": false, "input": [ "height = 3\n", "ciphertext = railfence_encipherl(plaintext, height, fillvalue=' ')\n", "result = railfence_decipherl(ciphertext, height).strip()\n", "result == plaintext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 270, "text": [ "True" ] } ], "prompt_number": 270 }, { "cell_type": "code", "collapsed": false, "input": [ "ciphertext" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 271, "text": [ "'horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr lhateihsnefttiaece '" ] } ], "prompt_number": 271 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }