{ "cells": [ { "cell_type": "markdown", "source": [ "# Permutation Algebra\n", "This notebook is a prerequisite to following the DARC tutorial" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 69, "outputs": [], "source": [ "from src.models import OuterKey, InnerKey, SubstitutionKey" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.685220Z", "start_time": "2024-07-04T14:12:16.446987Z" } } }, { "cell_type": "markdown", "source": [ "## Key Generation Parameters\n", "- block size: The number of characters we encode in a block. Block size isn't using in this notebook\n", "- key height: The alphabet length. If we want to encode bytes, our alphabet length is 256.\n", " If we want to encode lowercase letters a-z our alphabet length is 26. NKodes 10 key 7 attribute alphabet is 70.\n", "- key width: The number of bytes an encrypted charter is in our alphabet.\n" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 70, "outputs": [], "source": [ "height = 4\n", "width = 3" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.686123Z", "start_time": "2024-07-04T14:12:16.453332Z" } } }, { "cell_type": "markdown", "source": [ "## Operand Types\n", "### Inner Permutation Key\n", "An inner permutation key (inner key for short) is a list of `height` rows, each a random permutation of an identity array of length `width`" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 71, "outputs": [ { "data": { "text/plain": "[[0, 1, 2], [1, 0, 2], [1, 0, 2], [2, 1, 0]]" }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "i0 = InnerKey.init_matrix(width, height)\n", "i1 = InnerKey.init_matrix(width, height)\n", "i2 = InnerKey.init_matrix(width, height)\n", "i_identity = InnerKey.init_identity_matrix(width, height)\n", "\n", "i0.matrix" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.830392Z", "start_time": "2024-07-04T14:12:16.460887Z" } } }, { "cell_type": "markdown", "source": [ "### Outer Permutation Key\n", "An outer key is ..." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 72, "outputs": [ { "data": { "text/plain": "[[2, 0, 1, 3]]" }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "o0 = OuterKey.init_matrix(height)\n", "o1 = OuterKey.init_matrix(height)\n", "o2 = OuterKey.init_matrix(height)\n", "o_identity = OuterKey.init_identity_matrix(height)\n", "\n", "o0.matrix" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.831572Z", "start_time": "2024-07-04T14:12:16.469310Z" } } }, { "cell_type": "markdown", "source": [ "### Substitution Key (formerly Alphabet Key or alpha_key)\n", "Sub key is ..." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 73, "outputs": [ { "data": { "text/plain": "[[51, 14, 207], [3, 171, 4], [73, 204, 152], [142, 175, 64]]" }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a0 = SubstitutionKey.init_matrix(width, height)\n", "a1 = SubstitutionKey.init_matrix(width, height)\n", "a2 = SubstitutionKey.init_matrix(width, height)\n", "a_identity = SubstitutionKey.init_identity_matrix(width, height)\n", "\n", "a0.matrix" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.832461Z", "start_time": "2024-07-04T14:12:16.476713Z" } } }, { "cell_type": "markdown", "source": [ "## Operators Types\n", "### < Outer Permutation\n", "#### Substitution Key < Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 74, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2, 0, 1, 3]]\n", "[[51, 14, 207], [3, 171, 4], [73, 204, 152], [142, 175, 64]]\n", "[[73, 204, 152], [51, 14, 207], [3, 171, 4], [142, 175, 64]]\n" ] } ], "source": [ "a0_o0 = a0 < o0\n", "print(o0.matrix)\n", "print(a0.matrix)\n", "print(a0_o0.matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.833320Z", "start_time": "2024-07-04T14:12:16.484335Z" } } }, { "cell_type": "markdown", "source": [ "#### Inner Key < Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 75, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2, 0, 1, 3]]\n", "[[0, 1, 2], [1, 0, 2], [1, 0, 2], [2, 1, 0]]\n", "[[1, 0, 2], [0, 1, 2], [1, 0, 2], [2, 1, 0]]\n" ] } ], "source": [ "i0_o0 = i0 < o0\n", "print(o0.matrix)\n", "print(i0.matrix)\n", "print(i0_o0.matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.834157Z", "start_time": "2024-07-04T14:12:16.492114Z" } } }, { "cell_type": "markdown", "source": [ "### << Inner Permutation\n", "#### Outer Key << Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 76, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0, 1, 3, 2]]\n", "[[2, 0, 1, 3]]\n", "[[2, 0, 3, 1]]\n" ] } ], "source": [ "o0_o1 = o0 << o1\n", "print(o1.matrix)\n", "print(o0.matrix)\n", "print(o0_o1.matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.834973Z", "start_time": "2024-07-04T14:12:16.499677Z" } } }, { "cell_type": "markdown", "source": [ "#### Inner Key << Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 77, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1, 0, 2], [0, 1, 2], [0, 2, 1], [2, 1, 0]]\n", "[[0, 1, 2], [1, 0, 2], [1, 0, 2], [2, 1, 0]]\n", "[[1, 0, 2], [1, 0, 2], [1, 2, 0], [0, 1, 2]]\n" ] } ], "source": [ "i0_i1 = i0 << i1\n", "print(i1.matrix)\n", "print(i0.matrix)\n", "print(i0_i1.matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.835789Z", "start_time": "2024-07-04T14:12:16.507413Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key << Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 78, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0, 1, 2], [1, 0, 2], [1, 0, 2], [2, 1, 0]]\n", "[[51, 14, 207], [3, 171, 4], [73, 204, 152], [142, 175, 64]]\n", "[[51, 14, 207], [171, 3, 4], [204, 73, 152], [64, 175, 142]]\n" ] } ], "source": [ "a0_i0 = a0 << i0\n", "print(i0.matrix)\n", "print(a0.matrix)\n", "print(a0_i0.matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.854289Z", "start_time": "2024-07-04T14:12:16.515159Z" } } }, { "cell_type": "markdown", "source": [ "### ~Permutation Inversion\n", "#### ~Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 79, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2, 0, 1, 3]]\n", "[[1, 2, 0, 3]]\n" ] } ], "source": [ "print(o0.matrix)\n", "print((~o0).matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.855384Z", "start_time": "2024-07-04T14:12:16.522867Z" } } }, { "cell_type": "markdown", "source": [ "#### ~Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 80, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0, 1, 2], [1, 0, 2], [1, 0, 2], [2, 1, 0]]\n", "[[0, 1, 2], [1, 0, 2], [1, 0, 2], [2, 1, 0]]\n" ] } ], "source": [ "print(i0.matrix)\n", "print((~i0).matrix)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.856225Z", "start_time": "2024-07-04T14:12:16.530564Z" } } }, { "cell_type": "markdown", "source": [ "### ^ Substitution\n", "#### Substitution Key ^ Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 81, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[51, 14, 207], [3, 171, 4], [73, 204, 152], [142, 175, 64]]\n", "[[1, 41, 28], [228, 126, 163], [255, 48, 188], [53, 120, 13]]\n", "[[50, 39, 211], [231, 213, 167], [182, 252, 36], [187, 215, 77]]\n", "50\n" ] } ], "source": [ "a0_a1 = a0 ^ a1\n", "print(a0.matrix)\n", "print(a1.matrix)\n", "print(a0_a1.matrix)\n", "print(a0.matrix[0][0] ^ a1.matrix[0][0])" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.857040Z", "start_time": "2024-07-04T14:12:16.538722Z" } } }, { "cell_type": "markdown", "source": [ "## Substitution Permutation Algebra\n", "#### properites:\n", "- associative: (a + b) + c = a + (b + c)\n", "- commutative: a + b = b + a\n", "- identity: a + 0 = a or a * 1 = a\n", "- inverse: a + (-a) = 0 or a * 1/a = 1 (for all a ~= 0)\n", "- distributive: a(b + c) = ab + ac\n", "\n", "### Associative\n", "#### Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 82, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(o0 << o1 << o2) == ((o0 << o1) << o2) == (o0 << (o1 << o2))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.858322Z", "start_time": "2024-07-04T14:12:16.546322Z" } } }, { "cell_type": "markdown", "source": [ "#### Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 83, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(i0 << i1 << i2) == ((i0 << i1) << i2) == (i0 << (i1 << i2))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.863346Z", "start_time": "2024-07-04T14:12:16.554187Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 84, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a0 ^ a1 ^ a2) == ((a0 ^ a1) ^ a2) == (a0 ^ (a1 ^ a2))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.864336Z", "start_time": "2024-07-04T14:12:16.562025Z" } } }, { "cell_type": "markdown", "source": [ "### Commutative Property\n", "Substitution is the only key type that is commutative\n", "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 85, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a0 ^ a1) == (a1 ^ a0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.865178Z", "start_time": "2024-07-04T14:12:16.569781Z" } } }, { "cell_type": "markdown", "source": [ "### Identity Property\n", "#### Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 86, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(o0 << o_identity) == o0" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.866342Z", "start_time": "2024-07-04T14:12:16.578046Z" } } }, { "cell_type": "markdown", "source": [ "#### Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 87, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(i0 << i_identity) == i0" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.867309Z", "start_time": "2024-07-04T14:12:16.589133Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 88, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a0 ^ a_identity) == a0" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.868143Z", "start_time": "2024-07-04T14:12:16.599974Z" } } }, { "cell_type": "markdown", "source": [ "### Inverse Property\n", "#### Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 89, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(o0 << ~o0) == o_identity" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.868953Z", "start_time": "2024-07-04T14:12:16.608436Z" } } }, { "cell_type": "markdown", "source": [ "#### Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 90, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(i0 << ~i0) == i_identity" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.869884Z", "start_time": "2024-07-04T14:12:16.619030Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 91, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a0 ^ a0) == a_identity" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.870708Z", "start_time": "2024-07-04T14:12:16.629750Z" } } }, { "cell_type": "markdown", "source": [ "### Distributive\n", "#### Inner Key/Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 92, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "((i0 << i1) < o0) == ((i0 < o0) << (i1 < o0))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.871520Z", "start_time": "2024-07-04T14:12:16.638198Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key/Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 93, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "((a0 ^ a1) < o0) == ((a0 < o0) ^ (a1 < o0))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.872334Z", "start_time": "2024-07-04T14:12:16.646323Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key/Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 94, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "((a0 ^ a1) << i0) == ((a0 << i0) ^ (a1 << i0))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.873134Z", "start_time": "2024-07-04T14:12:16.654286Z" } } }, { "cell_type": "markdown", "source": [ "#### Substitution Key/Inner Key/Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 95, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "((a0 << i0) < o0) == ((a0 < o0) << (i0 < o0))" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.874410Z", "start_time": "2024-07-04T14:12:16.662231Z" } } }, { "cell_type": "markdown", "source": [ "### Other Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 96, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a0 << (i0 < o0)) == (((a0 < ~o0) << i0) < o0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.882191Z", "start_time": "2024-07-04T14:12:16.670307Z" } } }, { "cell_type": "code", "execution_count": 97, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "((a0 < o0) << i0) == ((a0 << (i0 < ~o0)) < o0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.882308Z", "start_time": "2024-07-04T14:12:16.674096Z" } } }, { "cell_type": "code", "execution_count": 98, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(~(i0 << i1)) == (~i1 << ~i0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.882394Z", "start_time": "2024-07-04T14:12:16.677061Z" } } }, { "cell_type": "code", "execution_count": 99, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(~(o0 << o1)) == (~o1 << ~o0)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.883495Z", "start_time": "2024-07-04T14:12:16.683278Z" } } }, { "cell_type": "code", "execution_count": 100, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "i0 == ((i0 << i2 << i1) << ~(i2 << i1)) == ((i0 << i2 << i1) << ~i1 << ~i2)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.883574Z", "start_time": "2024-07-04T14:12:16.687331Z" } } }, { "cell_type": "markdown", "source": [ "### Becareful about your order of operation\n", "***Always use parenthesis to control the order of operations***" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 101, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "i0 < (o0 << o1 << o2) != (i0 < (o0 << o1 << o2)) # not equal !!!!!!" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-07-04T14:12:16.883645Z", "start_time": "2024-07-04T14:12:16.690509Z" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }