Saltar al contenido
El bit perdido
Newsletter

Lección 11 de 13

SubBytes, ShiftRows y MixColumns: la ronda de AES

Calcula a mano las tres operaciones de la ronda de AES y descubre por qué MixColumns esconde un código MDS, como los de Reed-Solomon, con branch number 5.

Al terminar sabrás:

  • Calcular SubBytes como inverso en el cuerpo de 256 elementos seguido de una transformación afín
  • Aplicar ShiftRows y MixColumns a un estado 4 × 4
  • Explicar qué aportan la no linealidad y la difusión a una ronda
  • Reconocer en MixColumns un código MDS de longitud 8, dimensión 4 y distancia 5 sobre el cuerpo de 256 elementos

Si sabes qué es un número en binario y sumar módulo 2 (sin llevadas), puedes seguirlo. Lo demás (hexadecimal, XOR, permutaciones, polinomios módulo 2 y cuerpos finitos) se explica sobre la marcha.

En la lección anterior vimos AES desde arriba: un estado de 4×44\times 4 bytes, un AddRoundKey inicial y diez rondas. Dentro de la caja negra quedaban tres operaciones sin abrir. Hoy las abrimos. Seguimos en el punto del relato en que AES sustituye a DES, y la matemática que va a hacer el trabajo es la de los cuerpos finitos F28\mathbb{F}_{2^8} de la lección 9. Más abajo hay una sorpresa para quien conozca los códigos correctores: una de las tres operaciones es, por dentro, un código MDS, la misma propiedad que hace óptimos a los códigos de Reed-Solomon.

La idea

Una ronda de AES reparte el trabajo entre tres operaciones, cada una con un cometido distinto.

  • SubBytes cambia cada byte por otro, byte a byte, con una tabla (una caja S, de substitution box). Es la única operación no lineal de AES. Sin ella, todo el cifrado sería un sistema de ecuaciones lineales y se resolvería con álgebra de bachillerato. Es la confusión de Shannon.
  • ShiftRows desplaza las filas del estado. No cambia ningún valor: solo lleva cada byte a otra columna.
  • MixColumns mezcla los cuatro bytes de cada columna. Es la difusión: un byte que cambia contagia a toda su columna.

La combinación es lo que hace falta. SubBytes sola no mueve nada de sitio. ShiftRows y MixColumns, juntas, hacen que tras dos rondas cada byte de salida dependa de los 16 de entrada.

SubBytes: inverso y transformación afín

SubBytes aplica la misma función SS a cada uno de los 16 bytes. Se calcula en dos pasos.

  1. Inverso. Se toma el inverso multiplicativo del byte en F28\mathbb{F}_{2^8}, y el 00\texttt{00}, que no tiene inverso, se deja en 00\texttt{00}.
  2. Transformación afín. El resultado b=(b7…b0)b = (b_7\dots b_0) se pasa por una transformación lineal sobre F2\mathbb{F}_2 y se le suma la constante 63\texttt{63}.
Repaso Transformación afín

Una transformación lineal sobre F2\mathbb{F}_2 (en el sentido de la lección 3: respeta el XOR) multiplica un vector de bits por una matriz, sumando módulo 2. Una transformación afín hace eso y además suma un vector fijo. Aquí el vector son los bits de 63=01100011\texttt{63} = 01100011. Calcular un bit de salida es sumar módulo 2 unos pocos bits de entrada, sin llevadas.

En FIPS 197 la transformación afín es, con los bits en columna (b0,…,b7)T(b_0,\dots,b_7)^T:

(b0′b1′b2′b3′b4′b5′b6′b7′)=(1000111111000111111000111111000111111000011111000011111000011111)(b0b1b2b3b4b5b6b7)⊕(11000110).\begin{pmatrix} b_0' \\ b_1' \\ b_2' \\ b_3' \\ b_4' \\ b_5' \\ b_6' \\ b_7' \end{pmatrix} = \begin{pmatrix} 1&0&0&0&1&1&1&1\\ 1&1&0&0&0&1&1&1\\ 1&1&1&0&0&0&1&1\\ 1&1&1&1&0&0&0&1\\ 1&1&1&1&1&0&0&0\\ 0&1&1&1&1&1&0&0\\ 0&0&1&1&1&1&1&0\\ 0&0&0&1&1&1&1&1 \end{pmatrix} \begin{pmatrix} b_0 \\ b_1 \\ b_2 \\ b_3 \\ b_4 \\ b_5 \\ b_6 \\ b_7 \end{pmatrix} \oplus \begin{pmatrix} 1 \\ 1 \\ 0 \\ 0 \\ 0 \\ 1 \\ 1 \\ 0 \end{pmatrix}.

Dicho de otro modo, bi′=bi⊕bi+4⊕bi+5⊕bi+6⊕bi+7⊕cib_i' = b_i \oplus b_{i+4} \oplus b_{i+5} \oplus b_{i+6} \oplus b_{i+7} \oplus c_i, con los índices módulo 8 y c=63c = \texttt{63}. (Hemos comprobado con un programa que esta matriz da la misma tabla de 256 valores que la definición.)

Ejemplo: S(53)S(\texttt{53}). En la lección 9 vimos que 53−1=ca=11001010\texttt{53}^{-1} = \texttt{ca} = 11001010, es decir, b7…b0=1,1,0,0,1,0,1,0b_7\dots b_0 = 1,1,0,0,1,0,1,0. Aplicamos la fórmula bit a bit:

iibits que se suman: bi,bi+4,bi+5,bi+6,bi+7b_i,b_{i+4},b_{i+5},b_{i+6},b_{i+7}parte linealcic_ibi′b_i'
0b0,b4,b5,b6,b7=0,0,0,1,1b_0,b_4,b_5,b_6,b_7 = 0,0,0,1,1011
1b1,b5,b6,b7,b0=1,0,1,1,0b_1,b_5,b_6,b_7,b_0 = 1,0,1,1,0110
2b2,b6,b7,b0,b1=0,1,1,0,1b_2,b_6,b_7,b_0,b_1 = 0,1,1,0,1101
3b3,b7,b0,b1,b2=1,1,0,1,0b_3,b_7,b_0,b_1,b_2 = 1,1,0,1,0101
4b4,b0,b1,b2,b3=0,0,1,0,1b_4,b_0,b_1,b_2,b_3 = 0,0,1,0,1000
5b5,b1,b2,b3,b4=0,1,0,1,0b_5,b_1,b_2,b_3,b_4 = 0,1,0,1,0011
6b6,b2,b3,b4,b5=1,0,1,0,0b_6,b_2,b_3,b_4,b_5 = 1,0,1,0,0011
7b7,b3,b4,b5,b6=1,1,0,0,1b_7,b_3,b_4,b_5,b_6 = 1,1,0,0,1101

Leyendo la columna «parte lineal» de abajo arriba (b7b_7 primero) sale 10001110=8e10001110 = \texttt{8e}. Al sumarle la constante queda 8e⊕63=11101101=ed\texttt{8e}\oplus\texttt{63} = 11101101 = \texttt{ed}. Así que S(53)=edS(\texttt{53}) = \texttt{ed}, el mismo valor que da la tabla de FIPS 197.

Nadie calcula la caja S así cada vez: los 256 valores están en una tabla de 16×1616\times 16, la tabla 4 de FIPS 197 (§5.1.1). Para buscar un byte, su primer dígito hexadecimal da la fila y el segundo la columna: 53\texttt{53} está en la fila 5, columna 3.

¿Por qué las dos piezas? El inverso es una función muy no lineal, y la afín evita que SS tenga puntos fijos (S(a)=aS(a)=a) o «anti-fijos» (S(a)S(a) igual a aa con todos los bits cambiados): se ha comprobado que no hay ninguno. SS es una biyección de los 256 bytes, de modo que se puede deshacer (lección 12).

ShiftRows

La fila rr del estado (con r=0,1,2,3r = 0,1,2,3) se rota rr posiciones a la izquierda. La fila 0 no se toca, la 1 se rota una posición, la 2 dos y la 3 tres. Como el estado se rellena por columnas, esto hace que los cuatro bytes de cada columna de salida procedan de cuatro columnas distintas de la entrada.

MixColumns

MixColumns trata cada columna del estado como un vector de cuatro elementos de F28\mathbb{F}_{2^8} y lo multiplica por una matriz fija MM, con las operaciones del cuerpo:

(s0′s1′s2′s3′)=(02030101010203010101020303010102)(s0s1s2s3).\begin{pmatrix} s_0' \\ s_1' \\ s_2' \\ s_3' \end{pmatrix} = \begin{pmatrix} \texttt{02}&\texttt{03}&\texttt{01}&\texttt{01}\\ \texttt{01}&\texttt{02}&\texttt{03}&\texttt{01}\\ \texttt{01}&\texttt{01}&\texttt{02}&\texttt{03}\\ \texttt{03}&\texttt{01}&\texttt{01}&\texttt{02} \end{pmatrix} \begin{pmatrix} s_0 \\ s_1 \\ s_2 \\ s_3 \end{pmatrix}.

La matriz es circulante: cada fila es la anterior desplazada una posición a la derecha. Recuerda que en F28\mathbb{F}_{2^8} el byte 02\texttt{02} es el polinomio xx, y 03=x+1\texttt{03} = x+1. Multiplicar por 02\texttt{02} es la operación xtime de la lección 9 (desplazar un bit a la izquierda y, si se sale uno, hacer XOR con 1b\texttt{1b}). Multiplicar por 03\texttt{03} es 02⋅s⊕s\texttt{02}\cdot s \oplus s. Multiplicar por 01\texttt{01} no hace nada. La suma es el XOR.

Ejemplo resuelto: MixColumns de una columna

Tomamos la columna (db,13,53,45)(\texttt{db},\texttt{13},\texttt{53},\texttt{45}). Primero los productos auxiliares, con xtime:

ss02⋅s\texttt{02}\cdot s03⋅s=02⋅s⊕s\texttt{03}\cdot s = \texttt{02}\cdot s \oplus s
db\texttt{db}ad\texttt{ad}ad⊕db=76\texttt{ad}\oplus\texttt{db} = \texttt{76}
13\texttt{13}26\texttt{26}26⊕13=35\texttt{26}\oplus\texttt{13} = \texttt{35}
53\texttt{53}a6\texttt{a6}a6⊕53=f5\texttt{a6}\oplus\texttt{53} = \texttt{f5}
45\texttt{45}8a\texttt{8a}8a⊕45=cf\texttt{8a}\oplus\texttt{45} = \texttt{cf}

Por ejemplo, db=11011011\texttt{db} = 11011011; desplazado a la izquierda es 1 101101101\,10110110, se sale un bit, y se hace XOR con 1b\texttt{1b}: b6⊕1b=ad\texttt{b6}\oplus\texttt{1b} = \texttt{ad}. En cambio, 13=00010011\texttt{13} = 00010011 se desplaza a 26\texttt{26} sin salirse, y no hay XOR.

Ahora cada fila de MM:

  • s0′=02⋅db⊕03⋅13⊕53⊕45=ad⊕35⊕53⊕45=8es_0' = \texttt{02}\cdot\texttt{db} \oplus \texttt{03}\cdot\texttt{13} \oplus \texttt{53} \oplus \texttt{45} = \texttt{ad}\oplus\texttt{35}\oplus\texttt{53}\oplus\texttt{45} = \texttt{8e}.
  • s1′=db⊕02⋅13⊕03⋅53⊕45=db⊕26⊕f5⊕45=4ds_1' = \texttt{db} \oplus \texttt{02}\cdot\texttt{13} \oplus \texttt{03}\cdot\texttt{53} \oplus \texttt{45} = \texttt{db}\oplus\texttt{26}\oplus\texttt{f5}\oplus\texttt{45} = \texttt{4d}.
  • s2′=db⊕13⊕02⋅53⊕03⋅45=db⊕13⊕a6⊕cf=a1s_2' = \texttt{db} \oplus \texttt{13} \oplus \texttt{02}\cdot\texttt{53} \oplus \texttt{03}\cdot\texttt{45} = \texttt{db}\oplus\texttt{13}\oplus\texttt{a6}\oplus\texttt{cf} = \texttt{a1}.
  • s3′=03⋅db⊕13⊕53⊕02⋅45=76⊕13⊕53⊕8a=bcs_3' = \texttt{03}\cdot\texttt{db} \oplus \texttt{13} \oplus \texttt{53} \oplus \texttt{02}\cdot\texttt{45} = \texttt{76}\oplus\texttt{13}\oplus\texttt{53}\oplus\texttt{8a} = \texttt{bc}.

Resultado: (db,13,53,45)↦(8e,4d,a1,bc)(\texttt{db},\texttt{13},\texttt{53},\texttt{45}) \mapsto (\texttt{8e},\texttt{4d},\texttt{a1},\texttt{bc}), que es el ejemplo de FIPS 197.

MixColumns es un código MDS

Repaso Si no has hecho el curso de códigos

Un código de longitud 8 y dimensión 4 sobre F28\mathbb{F}_{2^8} es un conjunto de palabras de 8 bytes que se construyen a partir de 4 bytes libres. Aquí la palabra es (a,Ma)(a, Ma). Su distancia mínima es el menor número de bytes no nulos de una palabra no nula. Ningún código así puede tener distancia mayor que 8−4+1=58-4+1 = 5 (cota de Singleton), y los que la alcanzan se llaman MDS. Un menor de MM es el determinante de una submatriz cuadrada que se obtiene quedándose con algunas filas y otras tantas columnas.

Un cambio en un solo byte de la columna ¿a cuántos bytes de salida llega? Con el byte (01,00,00,00)(\texttt{01},\texttt{00},\texttt{00},\texttt{00}) la salida es (02,01,01,03)(\texttt{02},\texttt{01},\texttt{01},\texttt{03}): llega a los cuatro. Y con dos bytes distintos de cero, por ejemplo (01,01,00,00)(\texttt{01},\texttt{01},\texttt{00},\texttt{00}), la salida es (01,03,00,02)(\texttt{01},\texttt{03},\texttt{00},\texttt{02}): llega a tres, que sumados a los dos de entrada hacen cinco bytes distintos de cero. Siempre se cumple:

wt(a)+wt(Ma)≥5para toda columna a≠0,\mathrm{wt}(a) + \mathrm{wt}(Ma) \ge 5 \quad \text{para toda columna } a \ne 0,

donde wt\mathrm{wt} es el número de bytes no nulos. Ese mínimo se llama branch number de MixColumns, y vale 5. Es el máximo posible para una matriz 4×44\times 4.

La razón está en la lección de códigos de Reed-Solomon. Mira las palabras (a,Ma)(a, Ma) de ocho bytes: forman un código sobre F28\mathbb{F}_{2^8} de longitud 88 y dimensión 44. Su distancia mínima es justo el mínimo de wt(a)+wt(Ma)\mathrm{wt}(a)+\mathrm{wt}(Ma), es decir, el branch number. Y un código cuyas palabras son (a,Aa)(a, Aa) es MDS (alcanza la cota de Singleton d=n−k+1d = n-k+1 de la lección sobre errores y borrones) si y solo si todos los menores cuadrados de AA son distintos de cero. Aquí n−k+1=8−4+1=5n-k+1 = 8-4+1 = 5.

Lo hemos comprobado con un programa: los 16+36+16+1=6916 + 36 + 16 + 1 = 69 menores cuadrados de MM (de tamaños 1,2,31,2,3 y 44) son no nulos en F28\mathbb{F}_{2^8}; en particular det⁡M=01\det M = \texttt{01}. Así que el código de las palabras (a,Ma)(a, Ma) es MDS, con longitud 8, dimensión 4 y distancia 5 (un código [8,4,5][8,4,5]) sobre F28\mathbb{F}_{2^8}, como los Reed-Solomon, y su branch number es 5. Daemen y Rijmen, los autores de Rijndael, eligieron esta matriz precisamente por eso: en su estrategia de la huella ancha (wide trail strategy) necesitan que la difusión sea la mayor posible, y un código MDS la da. Ojo con el «como»: comparte con los Reed-Solomon la propiedad MDS, pero no es un código de Reed-Solomon, ni siquiera en su versión generalizada. Una forma de verlo: si multiplicas sus palabras coordenada a coordenada, los productos generan un espacio de dimensión 8, y con cualquier Reed-Solomon (generalizado) de longitud 8 y dimensión 4 solo llegan a dimensión 2⋅4−1=72\cdot 4-1 = 7 (lo hemos comprobado con un programa). Otra diferencia es el uso: allí la redundancia sirve para recuperar bytes perdidos, y aquí, para que un cambio local se extienda a toda la columna.

Ejemplo resuelto: la ronda 1 entera

Retomamos el ejemplo de FIPS 197 de la lección anterior. El estado al inicio de la ronda 1 (tras el primer AddRoundKey) es

(19a09ae93df4c6f8e3e28d48be2b2a08).\begin{pmatrix} \texttt{19}&\texttt{a0}&\texttt{9a}&\texttt{e9}\\ \texttt{3d}&\texttt{f4}&\texttt{c6}&\texttt{f8}\\ \texttt{e3}&\texttt{e2}&\texttt{8d}&\texttt{48}\\ \texttt{be}&\texttt{2b}&\texttt{2a}&\texttt{08} \end{pmatrix}.

SubBytes. Cada byte pasa por SS. Los valores salen de la tabla 4 de FIPS 197; para este ejemplo te bastan estos 16:

columnaSubBytes
019↦d4\texttt{19}\mapsto\texttt{d4}, 3d↦27\texttt{3d}\mapsto\texttt{27}, e3↦11\texttt{e3}\mapsto\texttt{11}, be↦ae\texttt{be}\mapsto\texttt{ae}
1a0↦e0\texttt{a0}\mapsto\texttt{e0}, f4↦bf\texttt{f4}\mapsto\texttt{bf}, e2↦98\texttt{e2}\mapsto\texttt{98}, 2b↦f1\texttt{2b}\mapsto\texttt{f1}
29a↦b8\texttt{9a}\mapsto\texttt{b8}, c6↦b4\texttt{c6}\mapsto\texttt{b4}, 8d↦5d\texttt{8d}\mapsto\texttt{5d}, 2a↦e5\texttt{2a}\mapsto\texttt{e5}
3e9↦1e\texttt{e9}\mapsto\texttt{1e}, f8↦41\texttt{f8}\mapsto\texttt{41}, 48↦52\texttt{48}\mapsto\texttt{52}, 08↦30\texttt{08}\mapsto\texttt{30}

Sale

(d4e0b81e27bfb44111985d52aef1e530).\begin{pmatrix} \texttt{d4}&\texttt{e0}&\texttt{b8}&\texttt{1e}\\ \texttt{27}&\texttt{bf}&\texttt{b4}&\texttt{41}\\ \texttt{11}&\texttt{98}&\texttt{5d}&\texttt{52}\\ \texttt{ae}&\texttt{f1}&\texttt{e5}&\texttt{30} \end{pmatrix}.

ShiftRows. La fila 1 se rota una posición, la 2 dos y la 3 tres:

(d4e0b81ebfb441275d52119830aef1e5).\begin{pmatrix} \texttt{d4}&\texttt{e0}&\texttt{b8}&\texttt{1e}\\ \texttt{bf}&\texttt{b4}&\texttt{41}&\texttt{27}\\ \texttt{5d}&\texttt{52}&\texttt{11}&\texttt{98}\\ \texttt{30}&\texttt{ae}&\texttt{f1}&\texttt{e5} \end{pmatrix}.

MixColumns. Cada columna se multiplica por MM. La primera, (d4,bf,5d,30)(\texttt{d4},\texttt{bf},\texttt{5d},\texttt{30}), da (04,66,81,e5)(\texttt{04},\texttt{66},\texttt{81},\texttt{e5}). Por ejemplo, 02⋅d4=b3\texttt{02}\cdot\texttt{d4} = \texttt{b3} y 03⋅bf=da\texttt{03}\cdot\texttt{bf} = \texttt{da}. El estado completo es

(04e0482866cbf8068119d326e59a7a4c).\begin{pmatrix} \texttt{04}&\texttt{e0}&\texttt{48}&\texttt{28}\\ \texttt{66}&\texttt{cb}&\texttt{f8}&\texttt{06}\\ \texttt{81}&\texttt{19}&\texttt{d3}&\texttt{26}\\ \texttt{e5}&\texttt{9a}&\texttt{7a}&\texttt{4c} \end{pmatrix}.

AddRoundKey. Se hace XOR con la clave de ronda 1 (la calcularemos en la lección siguiente):

(04e0482866cbf8068119d326e59a7a4c)⊕(a088232afa54a36cfe2c397617b13905)=(a4686b029c9f5b6a7f35ea50f22b4349).\begin{pmatrix} \texttt{04}&\texttt{e0}&\texttt{48}&\texttt{28}\\ \texttt{66}&\texttt{cb}&\texttt{f8}&\texttt{06}\\ \texttt{81}&\texttt{19}&\texttt{d3}&\texttt{26}\\ \texttt{e5}&\texttt{9a}&\texttt{7a}&\texttt{4c} \end{pmatrix} \oplus \begin{pmatrix} \texttt{a0}&\texttt{88}&\texttt{23}&\texttt{2a}\\ \texttt{fa}&\texttt{54}&\texttt{a3}&\texttt{6c}\\ \texttt{fe}&\texttt{2c}&\texttt{39}&\texttt{76}\\ \texttt{17}&\texttt{b1}&\texttt{39}&\texttt{05} \end{pmatrix} = \begin{pmatrix} \texttt{a4}&\texttt{68}&\texttt{6b}&\texttt{02}\\ \texttt{9c}&\texttt{9f}&\texttt{5b}&\texttt{6a}\\ \texttt{7f}&\texttt{35}&\texttt{ea}&\texttt{50}\\ \texttt{f2}&\texttt{2b}&\texttt{43}&\texttt{49} \end{pmatrix}.

Esa es la entrada de la ronda 2. En una sola ronda ya se ve la difusión: cada byte de la primera columna del resultado depende de cuatro bytes del estado inicial, que venían de cuatro columnas distintas.

Ejercicios

Ejercicio 1

Calcula S(01)S(\texttt{01}) con la definición (inverso y transformación afín).

Ver la solución

El inverso de 01\texttt{01} es 01\texttt{01} (el uno del cuerpo). Sus bits son b0=1b_0 = 1 y los demás 00. En bi′=bi⊕bi+4⊕bi+5⊕bi+6⊕bi+7⊕cib_i' = b_i \oplus b_{i+4} \oplus b_{i+5} \oplus b_{i+6} \oplus b_{i+7} \oplus c_i el único bit que vale 1 es b0b_0, que aparece en los índices ii con i∈{0,4,3,2,1}i \in \{0, 4, 3, 2, 1\} (porque i+4i+4, i+5i+5, i+6i+6 o i+7i+7 valen 00 módulo 8 cuando i=4,3,2,1i = 4,3,2,1). Así que la parte lineal da b4′…b0′=11111b_4'\dots b_0' = 11111, es decir, 1f\texttt{1f}. Sumamos la constante: 1f⊕63=7c\texttt{1f}\oplus\texttt{63} = \texttt{7c}. Por tanto S(01)=7cS(\texttt{01}) = \texttt{7c}.

Ejercicio 2

Aplica ShiftRows al estado

(00010203101112132021222330313233).\begin{pmatrix} \texttt{00}&\texttt{01}&\texttt{02}&\texttt{03}\\ \texttt{10}&\texttt{11}&\texttt{12}&\texttt{13}\\ \texttt{20}&\texttt{21}&\texttt{22}&\texttt{23}\\ \texttt{30}&\texttt{31}&\texttt{32}&\texttt{33} \end{pmatrix}.
Ver la solución

La fila 0 se queda igual. La fila 1, (10,11,12,13)(\texttt{10},\texttt{11},\texttt{12},\texttt{13}), rota una posición a la izquierda: (11,12,13,10)(\texttt{11},\texttt{12},\texttt{13},\texttt{10}). La fila 2 rota dos: (22,23,20,21)(\texttt{22},\texttt{23},\texttt{20},\texttt{21}). La fila 3 rota tres: (33,30,31,32)(\texttt{33},\texttt{30},\texttt{31},\texttt{32}).

(00010203111213102223202133303132)\begin{pmatrix} \texttt{00}&\texttt{01}&\texttt{02}&\texttt{03}\\ \texttt{11}&\texttt{12}&\texttt{13}&\texttt{10}\\ \texttt{22}&\texttt{23}&\texttt{20}&\texttt{21}\\ \texttt{33}&\texttt{30}&\texttt{31}&\texttt{32} \end{pmatrix}

Los bytes de la primera columna, 00,11,22,33\texttt{00},\texttt{11},\texttt{22},\texttt{33}, proceden de las cuatro columnas de la entrada.

Ejercicio 3

Calcula MixColumns de las columnas (01,00,01,00)(\texttt{01},\texttt{00},\texttt{01},\texttt{00}) y (00,00,01,01)(\texttt{00},\texttt{00},\texttt{01},\texttt{01}) y halla en cada caso wt(a)+wt(Ma)\mathrm{wt}(a)+\mathrm{wt}(Ma). ¿Qué te dice sobre el branch number?

Ver la solución

Con a=(01,00,01,00)a = (\texttt{01},\texttt{00},\texttt{01},\texttt{00}), MaMa es la suma de las columnas primera y tercera de MM: (02⊕01, 01⊕03, 01⊕02, 03⊕01)=(03,02,03,02)(\texttt{02}\oplus\texttt{01},\ \texttt{01}\oplus\texttt{03},\ \texttt{01}\oplus\texttt{02},\ \texttt{03}\oplus\texttt{01}) = (\texttt{03},\texttt{02},\texttt{03},\texttt{02}). Pesos: 2+4=62 + 4 = 6.

Con a=(00,00,01,01)a = (\texttt{00},\texttt{00},\texttt{01},\texttt{01}), MaMa es la suma de las columnas tercera y cuarta: (01⊕01, 03⊕01, 02⊕03, 01⊕02)=(00,02,01,03)(\texttt{01}\oplus\texttt{01},\ \texttt{03}\oplus\texttt{01},\ \texttt{02}\oplus\texttt{03},\ \texttt{01}\oplus\texttt{02}) = (\texttt{00},\texttt{02},\texttt{01},\texttt{03}). Pesos: 2+3=52 + 3 = 5.

La suma nunca baja de 5, pero puede ser mayor: aquí sale 6 en un caso y 5 en el otro. El branch number es un mínimo sobre todas las columnas no nulas, no el valor de cada una. Con las dos columnas del texto, (01,00,00,00)(\texttt{01},\texttt{00},\texttt{00},\texttt{00}) y (01,01,00,00)(\texttt{01},\texttt{01},\texttt{00},\texttt{00}), se alcanza exactamente 5, y por eso el mínimo es 5 y no más.

En resumen

  • SubBytes es el inverso en F28\mathbb{F}_{2^8} seguido de una transformación afín con la constante 63\texttt{63}: es la única parte no lineal de AES.
  • ShiftRows rota la fila rr del estado rr posiciones a la izquierda, y mezcla las columnas entre sí.
  • MixColumns multiplica cada columna por una matriz circulante con 02,03,01,01\texttt{02},\texttt{03},\texttt{01},\texttt{01}, operando en F28\mathbb{F}_{2^8}.
  • La matriz de MixColumns genera, con I4I_4, un código MDS [8,4,5][8,4,5] sobre F28\mathbb{F}_{2^8}: su branch number es 5, el máximo posible, y de ahí sale la difusión (Daemen y Rijmen).
  • Una ronda es SubBytes, ShiftRows, MixColumns y AddRoundKey; solo falta saber de dónde salen las claves de ronda.

Siguiente lección: La expansión de clave y el descifrado de AES

Para profundizar