Máme filtrový generátor, který se skládá z jednoho LFSR délky 56 a nelineární booleovské funkce f, která v každém kroku kombinuje čtyři bity posuvného registru do jednoho bitu keystreamu. Funkci f máme předepsanou v algebraické normální formě, kde x0 značí nejnižší bit registru. Ve vzorové implementaci máme funkci f navíc předepsanou jako pole délky 16. Bit keystreamu se zjistí tak, že ze 4 bitů na daných pozicích v registru poskládáme celé číslo v intervalu {0, … , 15} a podíváme se na příslušnou pozici v poli.
Vzorová implementace zde.
Příklad zpětné vazby:
feedback = 0xccfe77fa1013cb
Příklad funkce f v algebraické normální formě:
f(u_0, ..., u_55) = u_1 + u_9 u_22 + u_1 u_9 u_22 + u_33 + u_9 u_33
Příklad téže funkce zadané pomocí pole:
bits = [1, 9, 22, 33]
f = [0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1]
Prvních 10 kroků registru na náhodně zvoleném počátečním stavu:
0b00101001000010001010001110000011101000010010100011100000
0b01010010000100010100011100000111010000100101000111000001
0b10100100001000101000111000001110100001001010001110000010
0b01001000010001010001110000011101000010010100011100000100
0b10010000100010100011100000111010000100101000111000001000
0b00100001000101000111000001110100001001010001110000010001
0b01000010001010001110000011101000010010100011100000100010
0b10000100010100011100000111010000100101000111000001000101
0b00001000101000111000001110100001001010001110000010001011
0b00010001010001110000011101000010010100011100000100010110
keystream = [1, 1, 1, 0, 0, 0, 1, 0, 0, 0, … ]
E-mailem dostanete funkci f, zpětnou vazbu registru a 1600 bitů keystreamu. Cílem je odhalit počáteční stav registru. Stav zapište v binárním rozvoji.
Začněte tím, že z algebraické normální formy funkce f sestrojíte booleovskou rovnici stupně 2 podobně, jako v útoku na Toyocrypt. Potom sestrojte soustavu rovnic pro bity počátečního stavu registru. Termy stupně 2 přepište na nové proměnné, abyste získali soustavu lineárních rovnic. K řešení soustavy můžete použít jeden z postupů zde, anebo postup uvedený níže.
Vytvoření seznamu z řádků souboru:
ReadList["nazev_souboru"]
Roznásobení polynomů:
Expand[seznam_polynomu]
Přepsání druhých mocnin proměnných na první mocniny:
seznam_polynomu /. a_^2 -> a
Redukce koeficientů polynomů modulo 2:
PolynomialMod[seznam_polynomu, 2]
Přepsání termů stupně 2 na nové proměnné, např. součin x1 * x2 se přepíše na proměnnou x1x2:
seznam_polynomu /. Times[a_, b_] :> Symbol[SymbolName[a] <> SymbolName[b]]
Vyřešení seznamu rovnic modulo 2 (seznam polynomů pokládáme roven seznamu nul):
solution = Solve[seznam_polynomu == Table[0, {Length[seznam_polynomu]}], Modulus -> 2]
Funkce Solve
vrací seznam přepisovacích pravidel. Pro čitelnější výstup si můžete vytvořit seznam jednoduchých proměnných {x55, x54, …, x0} a nechat ho přepsat:
Table[Symbol["x" <> ToString[i]], {i, 55, 0, -1}] /. solution
Zadání:
feedback = 0x9
f(u_0, ..., u_3) = u_1 + u_0 u_1 + u_0 u_2 + u_3 + u_0 u_2 u_3
bits = [0, 1, 2, 3]
f = [0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1]
keystream = [1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0]
Z f sestrojíme booleovskou rovnici stupně 2:
(keystream[i] + u1 + u3) (1 + u0) == 0
Bity vystupující z registru popíšeme jako kombinace bitů počátečního stavu registru:
x3Dosazením sestrojíme soustavu rovnic pro bity počátečního stavu registru:
(1 + x1 + x3) (1 + x0) == 0
(x0 + x2) (1 + x0 + x3) == 0
(1 + x0 + x1 + x3) (1 + x0 + x2 + x3) == 0
(1 + x2 + x3) (1 + x0 + x1 + x2 + x3) == 0
(1 + x1 + x2) (1 + x1 + x2 + x3) == 0
(1 + x0 + x1) (1 + x0 + x1 + x2) == 0
(1 + x3) (1 + x1 + x3) == 0
(1 + x2) (1 + x0 + x2) == 0
x1 (1 + x0 + x1 + x3) == 0
(1 + x0) (1 + x2 + x3) == 0
(x0 + x3) (1 + x1 + x2) == 0
(x0 + x2 + x3) (1 + x0 + x1) == 0
Roznásobíme a termy stupně 2 přepíšeme na nové proměnné:
1 + x0 + x0x1 + x0x3 + x1 + x3 == 0
x0x2 + x0x3 + x2 + x2x3 == 0
1 + x0 + x0x1 + x0x2 + x1 + x1x2 + x1x3 + x2 + x2x3 + x3 == 0
1 + x0 + x0x2 + x0x3 + x1 + x1x2 + x1x3 + x2 + x3 == 0
1 + x1 + x1x3 + x2 + x2x3 + x3 == 0
1 + x0 + x0x2 + x1 + x1x2 + x2 == 0
1 + x1 + x1x3 + x3 == 0
1 + x0 + x0x2 + x2 == 0
x0x1 + x1x3 == 0
1 + x0 + x0x2 + x0x3 + x2 + x3 == 0
x0 + x0x1 + x0x2 + x1x3 + x2x3 + x3 == 0
x0x1 + x0x2 + x0x3 + x1x2 + x1x3 + x2 + x3 == 0
Soustava má jediné řešení:
x0 = 1, x0x1 = 0, x0x2 = 1, x0x3 = 1, x1 = 0, x1x2 = 0, x1x3 = 0, x2 = 1, x2x3 = 1, x3 = 1.
Tedy počáteční stav byl 0b1101
.