{ "cells": [ { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import collections\n", "import string\n", "import numpy as np\n", "from numpy import matrix\n", "from numpy import linalg\n", "%matplotlib inline\n", "\n", "from cipher import *\n", "from cipherbreak import *\n", "\n", "c6a = open('2014/6a.ciphertext').read()\n", "c6b = open('2014/6b.ciphertext').read()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(3, -2314.997881051078)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_a, score = railfence_break(sanitise(c6a))\n", "key_a, score" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "' '.join(segment(railfence_decipher(sanitise(c6a), key_a)))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c6bs = sanitise(c6b)\n", "c6bs" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[7,\n", " 22,\n", " 18,\n", " 18,\n", " 18,\n", " 22,\n", " 23,\n", " 5,\n", " 4,\n", " 22,\n", " 7,\n", " 7,\n", " 17,\n", " 5,\n", " 4,\n", " 22,\n", " 15,\n", " 3,\n", " 17,\n", " 21,\n", " 19,\n", " 19,\n", " 3,\n", " 7,\n", " 23,\n", " 1,\n", " 2,\n", " 2,\n", " 11,\n", " 4,\n", " 0,\n", " 24,\n", " 15,\n", " 7,\n", " 0,\n", " 11,\n", " 13,\n", " 0,\n", " 3,\n", " 7,\n", " 8,\n", " 4,\n", " 7,\n", " 0,\n", " 14,\n", " 20,\n", " 3,\n", " 17,\n", " 14,\n", " 19,\n", " 22,\n", " 13,\n", " 17,\n", " 17,\n", " 21,\n", " 24,\n", " 18,\n", " 0,\n", " 1,\n", " 9,\n", " 11,\n", " 19,\n", " 19,\n", " 1,\n", " 0,\n", " 24,\n", " 19,\n", " 12,\n", " 4,\n", " 11,\n", " 17,\n", " 10,\n", " 0,\n", " 8,\n", " 3,\n", " 14,\n", " 15,\n", " 19,\n", " 7,\n", " 0,\n", " 19,\n", " 11,\n", " 4,\n", " 11,\n", " 17,\n", " 19,\n", " 22,\n", " 0,\n", " 0,\n", " 12,\n", " 0,\n", " 13,\n", " 4,\n", " 10,\n", " 18,\n", " 21,\n", " 21,\n", " 25,\n", " 17,\n", " 21,\n", " 11,\n", " 11,\n", " 0,\n", " 19,\n", " 10,\n", " 2,\n", " 17,\n", " 9,\n", " 16,\n", " 20,\n", " 8,\n", " 2,\n", " 8,\n", " 25,\n", " 6,\n", " 19,\n", " 14,\n", " 16,\n", " 2,\n", " 15,\n", " 13,\n", " 17,\n", " 17,\n", " 10,\n", " 19,\n", " 19,\n", " 14,\n", " 22,\n", " 0,\n", " 13,\n", " 3,\n", " 16,\n", " 4,\n", " 7,\n", " 19,\n", " 16,\n", " 17,\n", " 21,\n", " 19,\n", " 1,\n", " 0,\n", " 24,\n", " 3,\n", " 16,\n", " 4,\n", " 0,\n", " 11,\n", " 0,\n", " 13,\n", " 13,\n", " 14,\n", " 7,\n", " 20,\n", " 11,\n", " 0,\n", " 13,\n", " 20,\n", " 25,\n", " 11,\n", " 22,\n", " 4,\n", " 23,\n", " 19,\n", " 11,\n", " 21,\n", " 9,\n", " 17,\n", " 21,\n", " 8,\n", " 21,\n", " 7,\n", " 13,\n", " 14,\n", " 7,\n", " 3,\n", " 16,\n", " 12,\n", " 6,\n", " 24,\n", " 10,\n", " 0,\n", " 2,\n", " 11,\n", " 12,\n", " 18,\n", " 22,\n", " 17,\n", " 20,\n", " 15,\n", " 3,\n", " 4,\n", " 19,\n", " 5,\n", " 8,\n", " 14,\n", " 5,\n", " 19,\n", " 5,\n", " 4,\n", " 11,\n", " 7,\n", " 25,\n", " 15,\n", " 23,\n", " 7,\n", " 0,\n", " 18,\n", " 22,\n", " 5,\n", " 19,\n", " 22,\n", " 15,\n", " 17,\n", " 17,\n", " 18,\n", " 22,\n", " 4,\n", " 8,\n", " 18,\n", " 4,\n", " 14,\n", " 7,\n", " 4,\n", " 5,\n", " 15,\n", " 3,\n", " 17,\n", " 21,\n", " 19,\n", " 19,\n", " 13,\n", " 21,\n", " 0,\n", " 6,\n", " 3,\n", " 21,\n", " 18,\n", " 22,\n", " 6,\n", " 14,\n", " 4,\n", " 17,\n", " 1,\n", " 4,\n", " 19,\n", " 13,\n", " 7,\n", " 0,\n", " 17,\n", " 21,\n", " 0,\n", " 4,\n", " 4,\n", " 21,\n", " 19,\n", " 11,\n", " 11,\n", " 19,\n", " 1,\n", " 12,\n", " 6,\n", " 0,\n", " 8,\n", " 0,\n", " 19,\n", " 6,\n", " 4,\n", " 11,\n", " 8,\n", " 13,\n", " 12,\n", " 3,\n", " 0,\n", " 22,\n", " 4,\n", " 21,\n", " 7,\n", " 0,\n", " 19,\n", " 19,\n", " 4,\n", " 17,\n", " 3,\n", " 7,\n", " 17,\n", " 25,\n", " 13,\n", " 1,\n", " 13,\n", " 21,\n", " 14,\n", " 20,\n", " 19,\n", " 13,\n", " 4,\n", " 5,\n", " 14,\n", " 19,\n", " 4,\n", " 21,\n", " 4,\n", " 0,\n", " 4,\n", " 7,\n", " 11,\n", " 0,\n", " 24,\n", " 12,\n", " 7,\n", " 0,\n", " 2,\n", " 6,\n", " 11,\n", " 25,\n", " 4,\n", " 15,\n", " 19,\n", " 21,\n", " 21,\n", " 3,\n", " 8,\n", " 12,\n", " 22,\n", " 14,\n", " 17,\n", " 5,\n", " 8,\n", " 18,\n", " 6,\n", " 19,\n", " 20,\n", " 25,\n", " 11,\n", " 22,\n", " 8,\n", " 1,\n", " 4,\n", " 16,\n", " 14,\n", " 7,\n", " 20,\n", " 1,\n", " 19,\n", " 6,\n", " 7,\n", " 0,\n", " 12,\n", " 16,\n", " 14,\n", " 17,\n", " 13,\n", " 9,\n", " 13,\n", " 13,\n", " 17,\n", " 20,\n", " 12,\n", " 16,\n", " 21,\n", " 9,\n", " 19,\n", " 23,\n", " 4,\n", " 11,\n", " 19,\n", " 5,\n", " 14,\n", " 21,\n", " 6,\n", " 0,\n", " 22,\n", " 3,\n", " 0,\n", " 4,\n", " 4,\n", " 21,\n", " 11,\n", " 11,\n", " 6,\n", " 17,\n", " 19,\n", " 23,\n", " 8,\n", " 1,\n", " 6,\n", " 19,\n", " 8,\n", " 1,\n", " 4,\n", " 21,\n", " 12,\n", " 15,\n", " 18,\n", " 0,\n", " 0,\n", " 19,\n", " 4,\n", " 14,\n", " 0,\n", " 18,\n", " 4,\n", " 21,\n", " 0,\n", " 4,\n", " 24,\n", " 16,\n", " 14,\n", " 7,\n", " 0,\n", " 12,\n", " 4,\n", " 14,\n", " 13,\n", " 13,\n", " 2,\n", " 5,\n", " 20,\n", " 8,\n", " 3,\n", " 14,\n", " 4,\n", " 5,\n", " 0,\n", " 5,\n", " 0,\n", " 19,\n", " 19,\n", " 4,\n", " 12,\n", " 20,\n", " 8,\n", " 12,\n", " 13,\n", " 5,\n", " 11,\n", " 25,\n", " 13,\n", " 1,\n", " 4,\n", " 10,\n", " 14,\n", " 5,\n", " 14,\n", " 1,\n", " 17,\n", " 11,\n", " 8,\n", " 0,\n", " 4,\n", " 7,\n", " 7,\n", " 0,\n", " 20,\n", " 8,\n", " 7,\n", " 13,\n", " 13,\n", " 13,\n", " 22,\n", " 25,\n", " 0,\n", " 4,\n", " 4,\n", " 21,\n", " 19,\n", " 11,\n", " 11,\n", " 19,\n", " 15,\n", " 0,\n", " 0,\n", " 11,\n", " 13,\n", " 0,\n", " 13,\n", " 21,\n", " 19,\n", " 25,\n", " 11,\n", " 25,\n", " 20,\n", " 20,\n", " 2,\n", " 15,\n", " 19,\n", " 0,\n", " 4,\n", " 11,\n", " 8,\n", " 13,\n", " 0,\n", " 13,\n", " 15,\n", " 0,\n", " 0,\n", " 7,\n", " 4,\n", " 22,\n", " 5,\n", " 19,\n", " 7,\n", " 0,\n", " 14,\n", " 18,\n", " 4,\n", " 19,\n", " 0,\n", " 17,\n", " 8,\n", " 1,\n", " 13,\n", " 1,\n", " 13,\n", " 21,\n", " 7,\n", " 0,\n", " 4,\n", " 21,\n", " 3,\n", " 7,\n", " 24,\n", " 24,\n", " 19,\n", " 11,\n", " 12,\n", " 20,\n", " 23,\n", " 1]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c6b_nums = [ord(c) - ord('a') for c in c6bs]\n", "c6b_nums" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 7, 8],\n", " [11, 11]])" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = np.matrix([[7,8], [11,11]])\n", "m" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-11.000000000000002" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.det(m)" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[-1. , 0.72727273],\n", " [ 1. , -0.63636364]])" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.I" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 7],\n", " [22]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = np.matrix([[7], [22]])\n", "v" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[9],\n", " [5]])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = (m*v) % 26\n", "c" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 7.],\n", " [ 22.]])" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.solve(m, c) % 26" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 87],\n", " [109]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m*v" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[9],\n", " [5]])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(m*v)%26" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 7.],\n", " [ 22.]])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.solve(m, (m*v)%26)%26" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(m)" ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def hill_encipher(matrix, message_letters, fillvalue='a'):\n", " n = len(matrix)\n", " sanitised_message = sanitise(message_letters)\n", " if len(sanitised_message) % n != 0:\n", " padding = fillvalue[0] * (n - len(sanitised_message) % n)\n", " else:\n", " padding = ''\n", " message = [ord(c) - ord('a') for c in sanitised_message + padding]\n", " message_chunks = [message[i:i+n] for i in range(0, len(message), n)]\n", " # message_chunks = chunks(message, len(matrix), fillvalue=None)\n", " enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0] for c in message_chunks]\n", " return ''.join([chr(int(round(l)) % 26 + ord('a')) for l in sum(enciphered_chunks, [])])" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'drjiqzdrvx'" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_encipher(m, 'hellothere')" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[7, 4, 11, 11, 14, 19, 7, 4, 17, 4]" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "msg = [ord(c) - ord('a') for c in 'hellothere']\n", "msg" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[7, 11], [14, 25], [21, 14], [7, 11], [11, 15], [0, 0]]" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "msgc = [msg[i:i+len(m)] for i in range(0, len(msg), len(m))]\n", "msgc" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[7, 11]" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "((m*np.matrix(msgc[0]).T).T % 26).tolist()[0]" ] }, { "cell_type": "code", "execution_count": 195, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def hill_decipher(matrix, message, fillvalue='a'):\n", " adjugate = linalg.det(matrix)*linalg.inv(matrix)\n", " inverse_determinant = modular_division_table[int(round(linalg.det(matrix))) % 26][1]\n", " inverse_matrix = (inverse_determinant * adjugate) % 26\n", " return hill_encipher(inverse_matrix, message, fillvalue) " ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'hellothere'" ] }, "execution_count": 161, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_decipher(m, 'drjiqzdrvx')" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[3, 17, 9, 8, 16, 25, 3, 17, 21, 23, 0, 0]" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "msg = [ord(c) - ord('a') for c in 'drjiqzdrvxaa']\n", "msg" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[3, 17], [9, 8], [16, 25], [3, 17], [21, 23], [0, 0]]" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "msgc = [msg[i:i+len(m)] for i in range(0, len(msg), len(m))]\n", "msgc" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 9.36363636, 18.18181818]])" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(np.linalg.solve(m, np.matrix(msgc[0]).T).T % 26)" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 11., -8.],\n", " [-11., 7.]])" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m_adj = linalg.det(m)*linalg.inv(m)\n", "m_adj" ] }, { "cell_type": "code", "execution_count": 148, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "modular_division_table[int(round(linalg.det(m))) % 26][1]" ] }, { "cell_type": "code", "execution_count": 150, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 25., 22.],\n", " [ 1., 23.]])" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m_inv = (modular_division_table[int(round(linalg.det(m))) % 26][1] * m_adj) % 26\n", "m_inv" ] }, { "cell_type": "code", "execution_count": 157, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'hellothere'" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_encipher(m_inv, 'drjiqzdrvx')" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 1., 0.],\n", " [ 0., 1.]])" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(m , 1/linalg.det(m) * mc)" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 6, 24, 1],\n", " [13, 16, 10],\n", " [20, 17, 15]])" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ml = np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]])\n", "ml" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 18., 21., 16.],\n", " [ 5., 18., 5.],\n", " [ 5., 14., 18.]])" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ml_adj = linalg.det(ml)*linalg.inv(ml) % 26\n", "ml_adj" ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "modular_division_table[int(linalg.det(ml) % 26)][1]" ] }, { "cell_type": "code", "execution_count": 139, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 8., 5., 10.],\n", " [ 21., 8., 21.],\n", " [ 21., 12., 8.]])" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ml_inv = (modular_division_table[int(linalg.det(ml) % 26)][1] * ml_adj) % 26\n", "ml_inv" ] }, { "cell_type": "code", "execution_count": 193, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'tfjflpznvyac'" ] }, "execution_count": 193, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_encipher(ml, 'hello there')" ] }, { "cell_type": "code", "execution_count": 196, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'hellothereaa'" ] }, "execution_count": 196, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_decipher(ml, 'tfjflpznvyac')" ] }, { "cell_type": "code", "execution_count": 182, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'poh'" ] }, "execution_count": 182, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_encipher(ml, 'act')" ] }, { "cell_type": "code", "execution_count": 192, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 8. 5. 10.]\n", " [ 21. 8. 21.]\n", " [ 21. 12. 8.]]\n" ] }, { "data": { "text/plain": [ "'act'" ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_decipher(ml, 'poh')" ] }, { "cell_type": "code", "execution_count": 180, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['a', 'c', 't']" ] }, "execution_count": 180, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[chr(int(round(i)) % 26 + ord('a')) for i in (ml_inv * np.matrix([ord(c) - ord('a') for c in 'poh']).T).T.tolist()[0]]" ] }, { "cell_type": "code", "execution_count": 184, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'act'" ] }, "execution_count": 184, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hill_encipher(ml_inv, 'poh')" ] }, { "cell_type": "code", "execution_count": 203, "metadata": { "collapsed": false }, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "len([list(m) for m in itertools.product([list(r) for r in itertools.product(range(26), repeat=3)], repeat=3)])" ] }, { "cell_type": "code", "execution_count": 202, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "19683" ] }, "execution_count": 202, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(3**3)**3" ] }, { "cell_type": "code", "execution_count": 206, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[matrix([[0, 0],\n", " [0, 0]]), matrix([[0, 0],\n", " [0, 1]]), matrix([[0, 0],\n", " [0, 2]]), matrix([[0, 0],\n", " [1, 0]]), matrix([[0, 0],\n", " [1, 1]]), matrix([[0, 0],\n", " [1, 2]]), matrix([[0, 0],\n", " [2, 0]]), matrix([[0, 0],\n", " [2, 1]]), matrix([[0, 0],\n", " [2, 2]]), matrix([[0, 1],\n", " [0, 0]]), matrix([[0, 1],\n", " [0, 1]]), matrix([[0, 1],\n", " [0, 2]]), matrix([[0, 1],\n", " [1, 0]]), matrix([[0, 1],\n", " [1, 1]]), matrix([[0, 1],\n", " [1, 2]]), matrix([[0, 1],\n", " [2, 0]]), matrix([[0, 1],\n", " [2, 1]]), matrix([[0, 1],\n", " [2, 2]]), matrix([[0, 2],\n", " [0, 0]]), matrix([[0, 2],\n", " [0, 1]]), matrix([[0, 2],\n", " [0, 2]]), matrix([[0, 2],\n", " [1, 0]]), matrix([[0, 2],\n", " [1, 1]]), matrix([[0, 2],\n", " [1, 2]]), matrix([[0, 2],\n", " [2, 0]]), matrix([[0, 2],\n", " [2, 1]]), matrix([[0, 2],\n", " [2, 2]]), matrix([[1, 0],\n", " [0, 0]]), matrix([[1, 0],\n", " [0, 1]]), matrix([[1, 0],\n", " [0, 2]]), matrix([[1, 0],\n", " [1, 0]]), matrix([[1, 0],\n", " [1, 1]]), matrix([[1, 0],\n", " [1, 2]]), matrix([[1, 0],\n", " [2, 0]]), matrix([[1, 0],\n", " [2, 1]]), matrix([[1, 0],\n", " [2, 2]]), matrix([[1, 1],\n", " [0, 0]]), matrix([[1, 1],\n", " [0, 1]]), matrix([[1, 1],\n", " [0, 2]]), matrix([[1, 1],\n", " [1, 0]]), matrix([[1, 1],\n", " [1, 1]]), matrix([[1, 1],\n", " [1, 2]]), matrix([[1, 1],\n", " [2, 0]]), matrix([[1, 1],\n", " [2, 1]]), matrix([[1, 1],\n", " [2, 2]]), matrix([[1, 2],\n", " [0, 0]]), matrix([[1, 2],\n", " [0, 1]]), matrix([[1, 2],\n", " [0, 2]]), matrix([[1, 2],\n", " [1, 0]]), matrix([[1, 2],\n", " [1, 1]]), matrix([[1, 2],\n", " [1, 2]]), matrix([[1, 2],\n", " [2, 0]]), matrix([[1, 2],\n", " [2, 1]]), matrix([[1, 2],\n", " [2, 2]]), matrix([[2, 0],\n", " [0, 0]]), matrix([[2, 0],\n", " [0, 1]]), matrix([[2, 0],\n", " [0, 2]]), matrix([[2, 0],\n", " [1, 0]]), matrix([[2, 0],\n", " [1, 1]]), matrix([[2, 0],\n", " [1, 2]]), matrix([[2, 0],\n", " [2, 0]]), matrix([[2, 0],\n", " [2, 1]]), matrix([[2, 0],\n", " [2, 2]]), matrix([[2, 1],\n", " [0, 0]]), matrix([[2, 1],\n", " [0, 1]]), matrix([[2, 1],\n", " [0, 2]]), matrix([[2, 1],\n", " [1, 0]]), matrix([[2, 1],\n", " [1, 1]]), matrix([[2, 1],\n", " [1, 2]]), matrix([[2, 1],\n", " [2, 0]]), matrix([[2, 1],\n", " [2, 1]]), matrix([[2, 1],\n", " [2, 2]]), matrix([[2, 2],\n", " [0, 0]]), matrix([[2, 2],\n", " [0, 1]]), matrix([[2, 2],\n", " [0, 2]]), matrix([[2, 2],\n", " [1, 0]]), matrix([[2, 2],\n", " [1, 1]]), matrix([[2, 2],\n", " [1, 2]]), matrix([[2, 2],\n", " [2, 0]]), matrix([[2, 2],\n", " [2, 1]]), matrix([[2, 2],\n", " [2, 2]])]" ] }, "execution_count": 206, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[np.matrix(list(m)) for m in itertools.product([list(r) for r in itertools.product(range(3), repeat=2)], repeat=2)]" ] }, { "cell_type": "code", "execution_count": 215, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "157248" ] }, "execution_count": 215, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_matrices = [np.matrix(list(m)) for m in itertools.product([list(r) for r in itertools.product(range(26), repeat=2)], repeat=2)]\n", "valid_matrices = [m for m, d in zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))\n", " if d != 0\n", " if d % 2 != 0\n", " if d % 13 != 0 ]\n", "len(valid_matrices)" ] }, { "cell_type": "code", "execution_count": 216, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "done\n", "done\n", "done\n", "done\n", "1 loops, best of 3: 10 s per loop\n" ] } ], "source": [ "%%timeit\n", "[m for m, d in zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))\n", " if d != 0\n", " if d % 2 != 0\n", " if d % 13 != 0 ]\n", "print('done')" ] }, { "cell_type": "code", "execution_count": 217, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "done\n", "done\n", "done\n", "done\n", "1 loops, best of 3: 20.4 s per loop\n" ] } ], "source": [ "%%timeit\n", "[m for m in all_matrices\n", " if int(round(linalg.det(m))) != 0\n", " if int(round(linalg.det(m))) % 2 != 0\n", " if int(round(linalg.det(m))) % 13 != 0 ]\n", "print('done')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }