Skip to content

Instantly share code, notes, and snippets.

@oupo
Created December 11, 2016 03:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oupo/d141f0809f824d8d6b48f8a2bee09514 to your computer and use it in GitHub Desktop.
Save oupo/d141f0809f824d8d6b48f8a2bee09514 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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