Lección 10 de 13
AES visto desde arriba: bloques, rondas y estado
El concurso del NIST que eligió Rijndael, los parámetros de AES, el estado 4×4 por columnas, las cuatro operaciones de una ronda y el primer AddRoundKey real.
Al terminar sabrás:
- Contar cómo se eligió AES y qué parámetros tiene (bloque de 128 bits, claves de 128, 192 y 256 bits)
- Colocar un bloque de 16 bytes en el estado 4 × 4 rellenando por columnas
- Describir en una frase cada operación de AES y la estructura de las rondas
- Calcular el AddRoundKey inicial del ejemplo de FIPS 197
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 aprendimos a sumar, multiplicar y dividir bytes como elementos de un cuerpo de 256 elementos. Ahora toca ver para qué sirve. El relato sigue así: DES cayó por su clave de 56 bits, y hacía falta un sustituto. En esta lección ves cómo se eligió, qué forma tiene y cómo se organiza por dentro, sin entrar todavía en el detalle de cada operación (eso será en las lecciones 11 y 12). Y al final hacemos la primera cuenta real del ejemplo que usaremos hasta el final del curso.
La idea
AES, el Advanced Encryption Standard, es un cifrado de bloque. Coge un bloque de 16 bytes (128 bits) y una clave, y devuelve otro bloque de 16 bytes. Es una red de sustitución-permutación (SPN, como la que ya esbozamos en la lección 3), y no una red de Feistel como DES. Eso tiene una consecuencia: en cada ronda se transforman todos los bytes del bloque, no solo una mitad. Como no hay mitades, cada paso tiene que poder invertirse por sí mismo (no vale la trampa de Feistel de la lección 4).
El cifrado trabaja con un estado de bytes y repite unas pocas operaciones sencillas, todas basadas en la aritmética del cuerpo de 256 elementos y en XOR.
Cómo se eligió
Los datos siguientes son los de la página de NIST sobre el desarrollo de AES y los de FIPS 197.
- El 2 de enero de 1997 NIST anunció que empezaba el proceso para elegir un nuevo estándar, abierto al público.
- El 20 de agosto de 1998 anunció quince algoritmos candidatos.
- Cinco pasaron a la final: MARS, RC6, Rijndael, Serpent y Twofish.
- El 2 de octubre de 2000 NIST anunció que había elegido Rijndael para proponerlo como AES. FIPS 197 cita como autores del algoritmo a Joan Daemen y Vincent Rijmen.
- AES se publicó como FIPS 197 el 26 de noviembre de 2001. El estándar se actualizó el 9 de mayo de 2023.
Lo notable es el método: cualquiera podía proponer un cifrado y cualquiera podía atacar los propuestos, durante años y a la vista de todos. Con DES no fue así del todo: también salió de una convocatoria pública, pero su diseño se hizo en IBM con la participación de la NSA, y los criterios de las cajas S no se publicaron hasta 1994 (lección 5). Lo de AES fue una aplicación a gran escala del principio de Kerckhoffs de la lección 1.
Parámetros
FIPS 197 define tres variantes, que comparten el tamaño de bloque y se diferencian en la clave:
| Variante | Clave | Bloque | Rondas |
|---|---|---|---|
| AES-128 | 128 bits | 128 bits | 10 |
| AES-192 | 192 bits | 128 bits | 12 |
| AES-256 | 256 bits | 128 bits | 14 |
El bloque es siempre de 128 bits: valores posibles, frente a los de DES. Hay , y claves, es decir, unas , y . En esta lección y las siguientes usamos AES-128, con 10 rondas.
El estado
Los 16 bytes del bloque, , se colocan en una matriz llamada estado, rellenándola por columnas: los bytes forman la primera columna, la segunda, y así. El byte queda en la fila y la columna (contando desde 0). Es la costumbre contraria a la de leer un texto por filas, y conviene fijarse bien: casi todos los errores al hacer AES a mano vienen de aquí.
Por ejemplo, el byte 6 va a la fila 2 y la columna 1. Y los bytes quedan así:
Cada columna es una «palabra» de 4 bytes (32 bits). La clave se organiza igual: una clave de 128 bits son 4 palabras.
Las cuatro operaciones
Cada ronda combina cuatro operaciones sobre el estado. En una frase:
- SubBytes: sustituye cada byte por otro mediante una tabla fija de 256 entradas (la caja S de AES), que se construye con el inverso en el cuerpo de la lección 9. Aporta la confusión y la no linealidad.
- ShiftRows: rota cada fila del estado hacia la izquierda un número fijo de posiciones (la fila 0 no se mueve, la 1 una posición, la 2 dos y la 3 tres), para que los bytes de una columna pasen a columnas distintas.
- MixColumns: multiplica cada columna por una matriz fija con elementos del cuerpo, de modo que cada byte de salida depende de los cuatro bytes de la columna. Junto con ShiftRows aporta la difusión.
- AddRoundKey: suma (XOR) al estado la clave de ronda, una por ronda, derivada de la clave principal. Es la única operación que usa la clave.
Las tres primeras son públicas y no dependen de la clave. La seguridad viene de alternarlas con AddRoundKey ronda tras ronda. Las veremos con cuentas en la lección 11 (las tres primeras) y 12 (cómo se obtienen las claves de ronda).
La estructura completa
Con rondas (10 en AES-128), el cifrado hace esto:
- AddRoundKey con la clave de ronda 0 (la propia clave).
- Rondas 1 a (9 rondas en AES-128): SubBytes, ShiftRows, MixColumns, AddRoundKey.
- Ronda final (): SubBytes, ShiftRows, AddRoundKey. Sin MixColumns.
Es decir, claves de ronda (una por cada AddRoundKey), 10 SubBytes, 10 ShiftRows y solo 9 MixColumns. En AES-128 esas 11 claves de ronda ocupan bytes, y salen de la clave de 16 bytes con la expansión de clave de la lección 12.
¿Por qué empieza y termina con una suma de clave? Porque las otras tres operaciones no usan la clave: si el cifrado empezara por SubBytes y acabara con MixColumns, Eva podría deshacer esas capas sin conocer nada secreto. Por una razón parecida sobra un MixColumns en la última ronda. Como es lineal, con : se puede «sacar» por fuera de la última suma de clave, y Eva lo desharía sin saber nada. No aportaría seguridad, y por eso se omite.
Descifrar es aplicar las operaciones inversas, en orden inverso. Cada operación es invertible por sí misma (AddRoundKey es su propia inversa, por la propiedad de la lección 2). Lo vemos en la lección 12.
Ejemplo resuelto
Usamos el ejemplo del apéndice B de FIPS 197. La clave es
y el bloque de entrada, también de 16 bytes, es
(Veremos que el criptograma es .)
Paso 1: colocar la entrada en el estado, por columnas. Los bytes son, en orden, (primera columna), (segunda), (tercera) y (cuarta):
Paso 2: la clave de ronda 0, también por columnas. La clave es la clave de ronda 0, con el mismo reparto: columnas , , y .
Paso 3: XOR byte a byte. Primero el byte de la esquina: es, en binario, , que es . Hacemos igual con cada columna:
| columna | entrada | clave | XOR |
|---|---|---|---|
| 0 | |||
| 1 | |||
| 2 | |||
| 3 |
El estado tras el AddRoundKey inicial es
Este es el estado con el que empieza la ronda 1. Para anticipar la lección siguiente: SubBytes sustituirá cada byte por otro; en la primera columna, se convierten en .
Ejercicios
Ejercicio 1
¿Cuántos AddRoundKey, SubBytes y MixColumns hace AES-256 al cifrar un bloque? ¿Cuántos bytes ocupan en total sus claves de ronda?
Ver la solución
AES-256 tiene rondas. Hay un AddRoundKey inicial y uno por ronda: . SubBytes se hace en cada ronda, incluida la última: 14. MixColumns se hace en todas menos la última: . Las 15 claves de ronda de 16 bytes ocupan bytes.
Ejercicio 2
Un bloque tiene los bytes (cada byte repite un dígito hexadecimal, del 0 a la f) y la clave son los bytes . ¿En qué fila y columna del estado queda el byte ? Escribe el estado de entrada, el de la clave y el resultado del primer AddRoundKey.
Ver la solución
El byte es el séptimo del bloque (el índice empieza en 0), así que es el byte 6: fila , columna , contando desde 0.
Estado de entrada, por columnas:
Clave:
XOR byte a byte (por ejemplo, y ):
Leído por columnas, el bloque resultante es
Ejercicio 3
Explica por qué AddRoundKey es su propia inversa, y por qué una cadena de «SubBytes, ShiftRows, MixColumns» sin AddRoundKey no daría un cifrado seguro aunque se repitiera mil veces.
Ver la solución
Si , entonces , porque es cero. Aplicar AddRoundKey con la misma clave de ronda deshace la operación.
Las otras tres operaciones no dependen de la clave, son públicas (principio de Kerckhoffs) y cualquiera puede calcularlas y deshacerlas. Repetirlas mil veces da una transformación del bloque que también es pública. Eva la invertiría sin saber nada secreto. El secreto solo entra con AddRoundKey.
En resumen
- AES se eligió en un concurso público de NIST (1997-2000): 15 candidatos, 5 finalistas (MARS, RC6, Rijndael, Serpent, Twofish) y Rijndael, de Daemen y Rijmen. Se publicó como FIPS 197 en 2001 y se actualizó en 2023.
- Bloque de 128 bits; claves de 128, 192 o 256 bits con 10, 12 o 14 rondas.
- El estado es una matriz de bytes que se rellena por columnas.
- Una ronda es SubBytes, ShiftRows, MixColumns y AddRoundKey; el cifrado empieza con un AddRoundKey y la última ronda omite MixColumns.
- Es una red de sustitución-permutación, no de Feistel. Con la clave y la entrada de FIPS 197, el AddRoundKey inicial da el estado que empieza por .
Siguiente lección: SubBytes, ShiftRows y MixColumns
Para profundizar
- NIST, FIPS 197, Advanced Encryption Standard (AES), actualizado el 9 de mayo de 2023 (2023).
- NIST, Computer Security Resource Center, AES Development (Cryptographic Standards and Guidelines, archivo).
- J. Daemen y V. Rijmen, The Design of Rijndael, Springer (2002).
- W. E. Burr, Data Encryption Standard, en A Century of Excellence in Measurements, Standards, and Technology (NIST SP 958), pp. 250-253, NIST (2001).