Hi folks!
All of the following operations are done over GF(2).
I want introduce you to my problem with a little example: I have two algebraic expressions of the keystream bits Z0 and Z1 of a stream cipher. The algebraic expressions just consist of key bits (key bits are named with X). For example:
Z0=X56+X43+X31+X10+X4+X2+X1
Z1=X57+X44+X32+X11+X5+X3+X2
In this little example we have, m = 2 = number_of_equations and n = 13 = number_of_unknown_variables. If I would now have konwledge about the Z0 and Z1 bit (e.g. Z0 = Z1 = 0), it must be possible to gain knowledge about key bits again by solving these underdetermined system of equations. My normal approach would be guessing 11 of the 13 and try to solve equation system for the unknown 2. If the system has a solution I know that could be the right answer.
At the moment my sage script says the following:
F=GF(2) //Define the Galois Field
M=Matrix(F, [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1], [1,0, 1, 0, 1,0, 1, 0, 1, 0, 1, 1, 0]]) //Define the equation system
v = vector(F, (0,0)) //Define vector for solve_right()
M.solve_right(v)
My abstract algorithm is the following to make it more clear:
for all 2^13 possible values:
- Guess variables till m = n.
- Try to solve the system. If system has a solution, save it.
How would get the guessing of the variables realized in a smart way (matrice syntax or symbolic syntax?), that automatically all possible values of the variables will be guessed and what would be the normal approach for that problem?
A little syntax example will be appreciated!
Greetings Chewie