La última vez escribí sobre el cifrado DES, así que hoy (sí, lo adivinaste) toca escribir sobre cómo funciona AES. AES se creó como resultado de un concurso abierto propuesto por el NIST. En 1997, el NIST anunció su deseo de tener un nuevo estándar de cifrado que sustituiría al
Data Encryption Standard y que se llamaría AES: Advanced Encryption Standard
.
Varios grupos de investigadores enviaron sus propuestas al concurso AES, pero el candidato ganador fue un cifrado llamado Rijndael. El cifrado fue creado por dos criptógrafos belgas,
y
, quienes lo enviaron al proceso de selección de AES.
Los otros finalistas fueron
Twofish (
Bruce Schneier y otros),
Serpent (
Ross Anderson y otros),
MARS (un equipo que incluía a
) y
(
[la R en RSA :-p ] y otros).
Tras el concurso, el NIST publicó AES como un estándar FIPS, y desde entonces el cifrado AES ha sido ampliamente usado y analizado. En el resto de esta entrada veremos cómo funciona AES, tal como hicimos con DES en la entrada anterior.
NOTA: De la misma forma que en la entrada anterior, las imágenes están enlazadas a Wikipedia. Si intentas leer este hilo y ya no funcionan comentádmelo.
Estructura de AES
De nuevo, empezamos viendo la estructura general del cifrado AES. En el caso de AES, el tamaño de bloque es de 128 bits y la clave puede ser de 128, 192 o 256 bits. La especificación inicial de Rijndael también soportaba varios tamaños de bloque, pero en el propio estándar AES únicamente se define un tamaño de bloque de 128 bits.
Justo como en DES, el cifrado consiste de una operación básica llamada
ronda que se repite un número de veces. En este caso, AES se basa en un principio de diseño conocido como
Red de Sustitución Permutación (o
Substitution-Permutation Networks), que significa que el cifrado está compuesto de una serie de sustituciones y permutaciones que se suceden unas a otras.
El número de
rondas (
R) en AES depende del tamaño de la clave: 10 rondas para 128, 12 rondas para 192 y 14 rondas para 256 bits. AES trabaja sobre una estructura conocida como el
estado AES, que es simplemente una reordenación del bloque en una matriz de 4×4. Además, la mayoría de las operaciones de AES se pueden describir como operaciones en el
cuerpo finito 
. Esto le proporciona a AES una descripción algebraica bastante
sencilla.
De todas formas, estas operaciones también se pueden ver como operaciones en bytes, y nosotros las veremos básicamente como eso, pues no queremos meternos en las
mates realmente (os lo prometí!). Pero si quieres meterte en serio con la criptografía, entonces seguramente necesitarás leer y aprender sobre cuerpos finitos. Estos se vuelven más importantes en la criptografía de clave pública, donde realmente usamos problemas matemáticos
difíciles de resolver para proteger nuestros datos… pero ya llegaremos a eso..
Los bloques básicos de AES son:
- SubBytes - Una sustitución no lineal, las S-boxes de AES
- ShiftRows - Realiza un desplazamiento sobre las filas del estado (de ahí el nombre)
- MixColumn - Mezcla columnas del estado de AES, haciendo cada celda una combinación de otras celdas.
- AddRoundKey - Mezcla la clave con el estado AES.
Como puedes ver, igual que en DES tenemos S-boxes, transposiciones (ShiftRows), una operación de mezclado (MixColumn) y una operación para mezclar datos y clave. Un cifrado AES consiste de los siguientes pasos:
- Ronda Inicial:
- R-1 Rondas:
- SubBytes
- ShiftRows
- MixColumns
- AddRoundKey
- Ronda final (sin MixColumns):
- SubBytes
- ShiftRows
- AddRoundKey
Así pues, tenemos un paso AddRoundKey previo, que mezcla el bloque de entrada con la clave de ronda inicial. Luego tenemos R-1 (9,11 o 13) rondas idénticas, y al final una ronda especial. Ahora veremos con más detalle cada uno de estos componentes de una ronda.
SubBytes
Cómo ya he dicho, simplemente es una tabla de sustitución. En este caso no tenemos 8 S-boxes distintas como en DES, sino una. Para aquellos que entendáis lo que significa, esta tabla de sustitución es realmente una operación en el cuerpo

con polinomio irreductible

, que encuentra la inversa (multiplicativa) del byte de entrada y luego aplica una
transformación afín.
Para los que no sabéis nada sobre cuerpos finitos, veamos un ejemplo sencillo de ellos: el conjunto de enteros módulo 7 (es decir, los números del 0 al 6). Con este conjunto de números, se define una operación de suma (simplemente sumar módulo 7) y una operación de producto (multiplicar módulo 7). Entonces se tiene que:
Y luego, definimos la inversa multiplicativa de un miembro del cuerpo,

, como otro miembro

tal que

. Así, del ejemplo anterior tenemos que 4 es la inversa de 2 módulo 7.
En el caso de AES, estas operaciones se realizan en

, pero la idea es básicamente la misma: tenemos una operación de suma y otra de producto, y encontramos un
número que después de multiplicarlo por el valor de entrada (en ese cuerpo finito!) de 1. Espero que más o menos se entienda
Ahora, después de tomar la inversa (lo cual se puede hacer de manera bastante rápida con la
versión extendida del algoritmo de Euclides), AES aplica una transformación afín para evitar ciertos ataques. Una transformación afín es simplemente una construcción que toma x como entrada y produce una salida de la forma a·x+b.
No os preocupeis, realmente no necesitais conocer todos estos detalles, aunque tampoco está mal tener algún concepto sobre lo que AES realmente hace ;-).
ShiftRows
Esta operación simplemente desplaza las filas del estado AES. Se ve mejor con una imagen:

Operación ShiftRows de AES
Como se puede ver, la fila cero queda intacta, fila 1 se desplaza una vez hacia la izquierda (y por tanto su primer elemento va a parar a la última posición), la fila 2 dos veces y la fila 3 tres veces.
MixColumns
Otra
operación matemática que se puede ver de varias formas. Primero, puede verse como una multiplicación por un polinomio módulo otro polinomio (
wow!). Además, puede verse como una multiplicación por una matriz MDS… o simplemente puedes pensar que es una forma de mezclar varias columnas, lo cual es más simple

.
Si realmente quieres saber qué pasa en esta operación, echale un ojo a la página de Wikipedia para la
(English).
AddRoundKey
Este es el paso más sencillo, aunque importante… sin él no habría ninguna clave implicada! Para cada ronda, una clave de ronda del mismo tamaño que el bloque de datos (128 bits) es generada y transformada en la forma del estado. Luego se hace un XOR de cada byte del estado AES actual con el byte correspondiente de la clave.
Expansión de claves en AES
Hasta ahora hemos visto todos los componentes del cifrado AES, pero no sabemos cómo se generan las claves de ronda. Esto se hace mediante un algoritmo de expansión, que puede ejecutarse antes del cifrado o en paralelo con éste. Dispositivos que gocen de suficiente memoria normalmente pre-calcularán las claves de ronda, mientras que dispositivos pequeños como smart cards probablemente preferirán calcularlas on-the-fly debido a la falta de espacio de memoria.
Los componentes del algoritmo de expansión de claves son:
- Rotate - Rota una palabra de 32 bits 8 bits hacia la izquierda
- Rcon - Una constante dependiente de la ronda, que también puede definirse como una cierta potencia de 2 en el cuerpo finito de Rijndael.
- SubBytes - La misma operación SubBytes del cifrado en sí.
Los pasos involucrados en la expansión de claves son bastante largos y prefiero no escribirlos aquí. Si realmente los necesitas, puedes encontrarlos en el estándar o en la página correspondiente de Wikipedia:
(English de nuevo).
Descifrado en AES
En este caso, el descifrado no es tan sencillo como con DES. Descifrar implica aplicar las operaciones inversas a las aplicadas para cifrar, lo que significa que se necesitan definir las operaciones inversas para ShiftRows, SubBytes y MixColumns. AddRoundKey no requiere una inversa puesto que ya es su misma inversa.
Obviamente, estas operaciones también están definidas en el estándar, y puedes echarle un ojo si quieres conocer cómo se definen.
Fuente