{ "cells": [ { "cell_type": "markdown", "source": [ "# Permutation Algebra\n", "This notebook is a prerequisite to following the DARC tutorial" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "from src.models import OuterKey, InnerKey, SubstitutionKey" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "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", "source": [ "height = 4\n", "width = 3" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "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", "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 }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### Outer Permutation Key\n", "An outer key is ..." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "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 }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### Substitution Key\n", "Sub key is ..." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "s0 = SubstitutionKey.init_matrix(width, height)\n", "s1 = SubstitutionKey.init_matrix(width, height)\n", "s2 = SubstitutionKey.init_matrix(width, height)\n", "s_identity = SubstitutionKey.init_identity_matrix(width, height)\n", "\n", "s0.matrix" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "## Operators Types\n", "### < Outer Permutation\n", "#### Substitution Key < Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "s0_o0 = s0 < o0\n", "print(o0.matrix)\n", "print(s0.matrix)\n", "print(s0_o0.matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Inner Key < Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "i0_o0 = i0 < o0\n", "print(o0.matrix)\n", "print(i0.matrix)\n", "print(i0_o0.matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### << Inner Permutation\n", "#### Outer Key << Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "o0_o1 = o0 << o1\n", "print(o1.matrix)\n", "print(o0.matrix)\n", "print(o0_o1.matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Inner Key << Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "i0_i1 = i0 << i1\n", "print(i1.matrix)\n", "print(i0.matrix)\n", "print(i0_i1.matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key << Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "s0_i0 = s0 << i0\n", "print(i0.matrix)\n", "print(s0.matrix)\n", "print(s0_i0.matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### ~Permutation Inversion\n", "#### ~Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "print(o0.matrix)\n", "print((~o0).matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### ~Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "print(i0.matrix)\n", "print((~i0).matrix)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### ^ Substitution\n", "#### Substitution Key ^ Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "s0_s1 = s0 ^ s1\n", "print(s0.matrix)\n", "print(s1.matrix)\n", "print(s0_s1.matrix)\n", "print(s0.matrix[0][0] ^ s1.matrix[0][0])" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "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", "source": [ "(o0 << o1 << o2) == ((o0 << o1) << o2) == (o0 << (o1 << o2))" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "(i0 << i1 << i2) == ((i0 << i1) << i2) == (i0 << (i1 << i2))" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "(s0 ^ s1 ^ s2) == ((s0 ^ s1) ^ s2) == (s0 ^ (s1 ^ s2))", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "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", "source": "(s0 ^ s1) == (s1 ^ s0)", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### Identity Property\n", "#### Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "(o0 << o_identity) == o0" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "(i0 << i_identity) == i0" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "(s0 ^ s_identity) == s0", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### Inverse Property\n", "#### Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "(o0 << ~o0) == o_identity" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "(i0 << ~i0) == i_identity" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "(s0 ^ s0) == s_identity", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### Distributive\n", "#### Inner Key/Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": [ "((i0 << i1) < o0) == ((i0 < o0) << (i1 < o0))" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key/Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "((s0 ^ s1) < o0) == ((s0 < o0) ^ (s1 < o0))", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key/Inner Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "((s0 ^ s1) << i0) == ((s0 << i0) ^ (s1 << i0))", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "#### Substitution Key/Inner Key/Outer Key" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "((s0 << i0) < o0) == ((s0 < o0) << (i0 < o0))", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "markdown", "source": [ "### Other Examples" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "source": "(s0 << (i0 < o0)) == (((s0 < ~o0) << i0) < o0)", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": "((s0 < o0) << i0) == ((s0 << (i0 < ~o0)) < o0)", "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "(~(i0 << i1)) == (~i1 << ~i0)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "(~(o0 << o1)) == (~o1 << ~o0)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "cell_type": "code", "source": [ "i0 == ((i0 << i2 << i1) << ~(i2 << i1)) == ((i0 << i2 << i1) << ~i1 << ~i2)" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null }, { "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", "source": [ "i0 < (o0 << o1 << o2) != (i0 < (o0 << o1 << o2)) # not equal !!!!!!" ], "metadata": { "collapsed": false }, "outputs": [], "execution_count": null } ], "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 }