Operace MixColumns prováděná Rijndael šifra, spolu s krokem ShiftRows, je primárním zdrojem difúze v Rijndael. Každý sloupec je považován za čtyřčlenný polynom
což jsou prvky v poli
. Koeficienty polynomů jsou prvky v prvočísle dílčí pole
.
Každý sloupec je vynásoben pevným polynomem
modulo
; inverzní hodnota tohoto polynomu je
.
MixColumns
Operace spočívá v modulárním násobení dvou čtyřčlenných polynomů, jejichž koeficienty jsou prvky
. Modul použitý pro tuto operaci je
.
První čtyřčlenné polynomické koeficienty jsou definovány sloupcem stavu
, který obsahuje čtyři bajty. Každý bajt je koeficient čtyřčlenného tak, že

Druhý čtyřčlenný polynom je konstantní polynom
. Jeho koeficienty jsou také prvky
. Jeho inverzní je
.
Musíme definovat nějaký zápis:
označuje násobení modulo
.
označuje přidání nad
.
označuje násobení (obvyklé násobení polynomů mezi polynomy a násobením nad
pro koeficienty).
Přidání dvou polynomů, jejichž koeficienty jsou prvky
má následující pravidlo:

Demonstrace
Polynom
bude vyjádřena jako
.
Polynomiální násobení

kde:







Modulární redukce
Výsledek
je sedmičlenný polynom, který musí být redukován na čtyřbajtové slovo, což se děje pomocí multiplikačního modulo
.
Pokud provedeme několik základních polynomiálních modulárních operací, zjistíme, že:

Obecně to můžeme říci 
Tak

kde




Maticová reprezentace
Koeficient
,
,
a
lze také vyjádřit takto:




A když nahradíme koeficienty
s konstantami
použité v šifře získáme následující:




To ukazuje, že samotná operace je podobná a Hill šifra. To lze provést vynásobením a vektor souřadnic čtyř čísel v Rijndaelovo pole Galois následující oběhový Matice MDS:

Příklad implementace
To lze ve skutečné implementaci poněkud zjednodušit nahrazením násobení o 2 jednou směnou a podmíněným výlučným nebo a nahrazením násobení 3 množstvím 2 kombinovaným s výlučným nebo. A C následuje příklad takové implementace:
1 prázdnota gmix_column(nepodepsaný char *r) { 2 nepodepsaný char A[4]; 3 nepodepsaný char b[4]; 4 nepodepsaný char C; 5 nepodepsaný char h; 6 / * Pole 'a' je jednoduše kopií vstupního pole 'r' 7 * Pole 'b' je každý prvek pole 'a' vynásobený 2 8 * v Rijndaelově poli Galois 9 * a [n] ^ b [n] je prvek n vynásobený 3 v Rijndaelově Galoisově poli * / 10 pro (C = 0; C < 4; C++) {11 A[C] = r[C];12 / * h je 0xff, pokud je nastaven vysoký bit r [c], 0 jinak * /13 h = (nepodepsaný char)((podepsaný char)r[C] >> 7); / * aritmetický pravý posun, tedy posun v nulách nebo jednotkách * /14 b[C] = r[C] << 1; / * implicitně odstraňuje vysoký bit, protože b [c] je 8bitový znak, takže jsme xor o 0x1b a ne 0x11b v dalším řádku * /15 b[C] ^= 0x1B & h; / * Rijndaelovo pole Galois * /16 }17 r[0] = b[0] ^ A[3] ^ A[2] ^ b[1] ^ A[1]; / * 2 * a0 + a3 + a2 + 3 * a1 * /18 r[1] = b[1] ^ A[0] ^ A[3] ^ b[2] ^ A[2]; / * 2 * a1 + a0 + a3 + 3 * a2 * /19 r[2] = b[2] ^ A[1] ^ A[0] ^ b[3] ^ A[3]; / * 2 * a2 + a1 + a0 + 3 * a3 * /20 r[3] = b[3] ^ A[2] ^ A[1] ^ b[0] ^ A[0]; / * 2 * a3 + a2 + a1 + 3 * a0 * /21 }
Příklad C #
1 soukromé byte GMul(byte A, byte b) { // Galoisovo pole (256) Násobení dvou bajtů 2 byte p = 0; 3 4 pro (int čelit = 0; čelit < 8; čelit++) { 5 -li ((b & 1) != 0) { 6 p ^= A; 7 } 8 9 bool hi_bit_set = (A & 0x80) != 0;10 A <<= 1;11 -li (hi_bit_set) {12 A ^= 0x1B; / * x ^ 8 + x ^ 4 + x ^ 3 + x + 1 * /13 }14 b >>= 1;15 }16 17 vrátit se p;18 }19 20 soukromé prázdnota MixColumns() { // 's' je hlavní stavová matice, 'ss' je dočasná matice stejných rozměrů jako 's'.21 Pole.Průhledná(ss, 0, ss.Délka);22 23 pro (int C = 0; C < 4; C++) {24 ss[0, C] = (byte)(GMul(0x02, s[0, C]) ^ GMul(0x03, s[1, C]) ^ s[2, C] ^ s[3, C]);25 ss[1, C] = (byte)(s[0, C] ^ GMul(0x02, s[1, C]) ^ GMul(0x03, s[2, C]) ^ s[3,C]);26 ss[2, C] = (byte)(s[0, C] ^ s[1, C] ^ GMul(0x02, s[2, C]) ^ GMul(0x03, s[3, C]));27 ss[3, C] = (byte)(GMul(0x03, s[0,C]) ^ s[1, C] ^ s[2, C] ^ GMul(0x02, s[3, C]));28 }29 30 ss.Kopírovat do(s, 0);31 }
Testovací vektory pro MixColumn ()
Hexadecimální | Desetinný |
---|
Před | Po | Před | Po |
---|
db 13 53 45 | 8e 4d a1 př | 219 19 83 69 | 142 77 161 188 |
f2 0a 22 5c | 9f dc 58 9d | 242 10 34 92 | 159 220 88 157 |
01 01 01 01 | 01 01 01 01 | 1 1 1 1 | 1 1 1 1 |
c6 c6 c6 c6 | c6 c6 c6 c6 | 198 198 198 198 | 198 198 198 198 |
d4 d4 d4 d5 | d5 d5 d7 d6 | 212 212 212 213 | 213 213 215 214 |
2d 26 31 4c | 4d 7e bd f8 | 45 38 49 76 | 77 126 189 248 |
InverseMixColumns
Operace MixColumns má následující inverzní funkce (čísla jsou desetinná):

Nebo:




Reference
Viz také