Created
December 11, 2016 03:54
-
-
Save oupo/d141f0809f824d8d6b48f8a2bee09514 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"mat1 = 0x8f7011ee\n", | |
"mat2 = 0xfc78ff1f\n", | |
"tmat = 0x3793fdff" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"F2 = GF(2)\n", | |
"\n", | |
"def int_to_f2(x):\n", | |
" return vector([F2((x >> i) & 1) for i in range(32)])\n", | |
"\n", | |
"def ints_to_f2(xs):\n", | |
" return vector([F2((xs[floor(i / 32)] >> (i % 32)) & 1) for i in range(32*len(xs))])\n", | |
"\n", | |
"def f2_to_int(vec):\n", | |
" x = 0\n", | |
" for i in range(32):\n", | |
" x |= Integer(vec[i]) << i\n", | |
" return x\n", | |
"\n", | |
"def f2_to_ints(vec):\n", | |
" return [f2_to_int(vec[i*32:i*32+32]) for i in range(floor(len(vec) / 32))]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def join_matrix_yoko(mats):\n", | |
" m = mats[0].nrows()\n", | |
" n = mats[0].ncols()\n", | |
" return matrix([[mats[floor(j / n)][i, j % n] for j in range(n*len(mats))] for i in range(m)])\n", | |
"\n", | |
"def join_matrix_tate(mats):\n", | |
" m = mats[0].nrows()\n", | |
" n = mats[0].ncols()\n", | |
" return matrix([[mats[floor(i / m)][i % m, j] for j in range(n)] for i in range(m*len(mats))])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def elem_matrix(i):\n", | |
" mats = [Mat(GF(2), 32, 32).zero() for j in range(4)]\n", | |
" mats[i] = Mat(GF(2), 32, 32).identity_matrix()\n", | |
" return join_matrix_yoko(mats)\n", | |
"\n", | |
"def xi(x):\n", | |
" if x:\n", | |
" return 1\n", | |
" else:\n", | |
" return 0\n", | |
"\n", | |
"def rshift_matrix(k):\n", | |
" return matrix([[F2(xi(j - i == k)) for j in range(32)] for i in range(32)])\n", | |
"\n", | |
"def lshift_matrix(k):\n", | |
" return rshift_matrix(-k)\n", | |
"\n", | |
"def get_0bit_matrix():\n", | |
" return matrix([[F2(xi(j == 0)) for j in range(32)]])\n", | |
"\n", | |
"get_0bit = get_0bit_matrix()\n", | |
"\n", | |
"def vect_to_matrix(vec):\n", | |
" return matrix([[vec[i]] for i in range(len(vec))])\n", | |
"\n", | |
"def mask_matrix(a):\n", | |
" return matrix([[F2(a[i] * xi(i == j)) for j in range(32)] for i in range(32)])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def temper_matrix():\n", | |
" t0 = elem_matrix(3)\n", | |
" t1 = elem_matrix(0) + rshift_matrix(8) * elem_matrix(2)\n", | |
" return t0 + t1 + vect_to_matrix(int_to_f2(tmat)) * get_0bit * t1\n", | |
"\n", | |
"temper = temper_matrix()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def next_state_matrix():\n", | |
" y = elem_matrix(3)\n", | |
" x = mask_matrix(int_to_f2(0x7fffffff)) * elem_matrix(0) + elem_matrix(1) + elem_matrix(2)\n", | |
" x += lshift_matrix(1) * x\n", | |
" y += rshift_matrix(1) * y + x\n", | |
" st0 = elem_matrix(1)\n", | |
" st1 = elem_matrix(2) + vect_to_matrix(int_to_f2(mat1)) * get_0bit * y\n", | |
" st2 = x + lshift_matrix(10) * y + vect_to_matrix(int_to_f2(mat2)) * get_0bit * y\n", | |
" st3 = y\n", | |
" return join_matrix_tate([st0, st1, st2, st3])\n", | |
"\n", | |
"next_state = next_state_matrix()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def from_128bit_to_127bit_matrix():\n", | |
" m = [[F2(0) for j in range(128)] for i in range(127)]\n", | |
" for i in range(31):\n", | |
" m[i][i] = F2(1)\n", | |
" for i in range(31, 127):\n", | |
" m[i][i+1] = F2(1)\n", | |
" return matrix(m)\n", | |
"\n", | |
"def from_127bit_to_128bit_matrix():\n", | |
" m = [[F2(0) for j in range(127)] for i in range(128)]\n", | |
" for i in range(31):\n", | |
" m[i][i] = F2(1)\n", | |
" for i in range(31, 127):\n", | |
" m[i+1][i] = F2(1)\n", | |
" return matrix(m)\n", | |
"\n", | |
"from_128bit_to_127bit = from_128bit_to_127bit_matrix()\n", | |
"from_127bit_to_128bit = from_127bit_to_128bit_matrix()\n", | |
"\n", | |
"next_state_127 = from_128bit_to_127bit * next_state * from_127bit_to_128bit" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def from_state_to_random_stream_matrix():\n", | |
" mats = [None for i in range(127)]\n", | |
" step = Mat(GF(2), 127, 127).identity_matrix()\n", | |
" A = get_0bit * temper * from_127bit_to_128bit\n", | |
" for i in range(127):\n", | |
" mats[i] = A * step\n", | |
" step *= next_state_127\n", | |
" return join_matrix_tate(mats)\n", | |
"\n", | |
"from_state_to_random_stream = from_state_to_random_stream_matrix()\n", | |
"\n", | |
"from_random_stream_to_state = from_state_to_random_stream.inverse()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['1aa43aaa', '61d7401', '7e68dffd', '34d0c803']" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"vec = [F2(0) for i in range(127)]\n", | |
"vec[0] = 1\n", | |
"state = from_127bit_to_128bit * from_random_stream_to_state * vector(vec)\n", | |
"[x.str(16) for x in f2_to_ints(state)]" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "SageMath 7.3", | |
"language": "", | |
"name": "sagemath" | |
}, | |
"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.10" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment