Files
pydarc/sp_network_algebra_tutorial.ipynb

698 lines
13 KiB
Plaintext

{
"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
}