1. Sustitución
  2. Enigma
  3. Shannon
  4. DES y AES
  5. Modos
  6. Hashes
  7. Contraseñas
  8. RSA y DH
  9. ECC
  10. Poscuántica

Capítulo 04 · Cifrado en bloque

Confusión y difusión: de DES a AES

Un cifrado en bloque revuelve un bloque de bits de tamaño fijo bajo una clave, tan a fondo que sin la clave parece una permutación aleatoria. Lucifer, de IBM, se convirtió en el estándar estadounidense DES en 1977; veinte años después su clave de 56 bits cayó ante una máquina construida por 250.000 dólares, y un concurso abierto eligió a su sucesor: Rijndael, hoy AES, el cifrado más usado de la historia.

Los cifrados de la era del ordenador cifran bits, y la mayoría trabaja por bloques: 64 o 128 bits a la vez. Un cifrado en bloque es una familia de permutaciones Ek:{0,1}n→{0,1}n, una para cada clave k. Lo que le pedimos es fácil de enunciar y difícil de conseguir: para quien no conozca k, Ek debe ser indistinguible de una permutación elegida completamente al azar entre las (2n)! posibles. Es una permutación pseudoaleatoria. Cómo cifrar mensajes de más de un bloque es el tema del capítulo siguiente; este trata del bloque en sí.

La red de Horst Feistel

Horst Feistel emigró de Alemania a Estados Unidos en 1934 y, tras años trabajando en criptografía para la Fuerza Aérea, entró en IBM, donde a comienzos de los setenta diseñó Lucifer, un cifrado para bancos. Su estructura, hoy llamada red de Feistel, resuelve con elegancia un problema de diseño: cómo construir una función invertible a partir de funciones de ronda que no tienen por qué serlo.

Se parte el bloque en dos mitades (L0,R0). Cada ronda, con su propia subclave ki, hace

Li+1=Ri,Ri+1=Li⊕F(Ri,ki).
Teorema (Feistel)

Para cualquier función F, invertible o no, cada ronda de Feistel es una biyección, y su inversa se calcula con la misma F: Ri=Li+1 y Li=Ri+1⊕F(Li+1,ki). Descifrar es cifrar con las subclaves en orden inverso.

Demostración

A partir de (Li+1,Ri+1) se lee directamente Ri=Li+1. Entonces se puede recalcular F(Ri,ki), y Li=Ri+1⊕F(Ri,ki) porque x⊕y⊕y=x. A F solo se la evalúa, nunca se la invierte.

Una red de Feistel de juguete sobre 16 bits (dos letras), con cuatro rondas y una función de ronda F que pierde información a propósito: muchas entradas dan la misma salida, así que F no tiene inversa. Aun así la red descifra perfectamente: la última fila recorre la misma red hacia atrás con las subclaves al revés.

En 1988 Michael Luby y Charles Rackoff demostraron lo que Feistel había encontrado por ingeniería: si las funciones de ronda son funciones aleatorias, tres rondas ya dan una permutación pseudoaleatoria, y cuatro dan una que resiste incluso a un adversario que también puede pedir descifrados. Los cifrados reales usan muchas más rondas porque sus funciones de ronda no son aleatorias, solo rápidas.

DES: el Data Encryption Standard

En 1973 la Oficina Nacional de Estándares de Estados Unidos pidió un cifrado público para proteger datos gubernamentales y comerciales. IBM presentó una versión de Lucifer; tras la revisión de la NSA se publicó en 1977 como DES (FIPS 46): una red de Feistel de 16 rondas sobre bloques de 64 bits con una clave de 56 bits. Su función de ronda expande la media palabra a 48 bits, la combina con la subclave, pasa el resultado por ocho S-boxes (pequeñas tablas de 6 bits de entrada y 4 de salida, la única parte no lineal) y permuta los bits.

Dos cambios de la NSA fueron polémicos. La clave se acortó de los 128 bits de Lucifer a 56, y Whitfield Diffie y Martin Hellman calcularon en 1977 que una máquina de 20 millones de dólares encontraría una clave DES en un día. Y las S-boxes se cambiaron sin explicación, lo que hizo sospechar una puerta trasera. La verdad salió en 1990, cuando Eli Biham y Adi Shamir publicaron el criptoanálisis diferencial, que sigue cómo se propagan por las rondas las diferencias entre parejas de textos en claro: DES lo resistía mucho mejor de lo que lo harían unas S-boxes aleatorias. En 1994 Don Coppersmith, de IBM, confirmó que los diseñadores conocían la técnica desde 1974 y habían elegido las S-boxes contra ella. En 1993 Mitsuru Matsui descubrió el criptoanálisis lineal, que aproxima el cifrado por ecuaciones lineales que se cumplen algo más de la mitad de las veces; rompe DES con 243 textos en claro conocidos, lo que tampoco era práctico.

Lo que mató a DES fue la longitud de la clave. En 1998 la Electronic Frontier Foundation construyó Deep Crack, una máquina de 1.856 chips a medida que costó unos 250.000 dólares y encontró una clave DES en 56 horas; en enero de 1999, con ayuda de los voluntarios de distributed.net, tardó 22 horas y 15 minutos. Hoy una clave cae en minutos. La aplicación de escritorio conserva DES solo para leer datos antiguos, y lo marca en rojo.

¿Por qué no un doble DES?

El arreglo evidente, cifrar dos veces con dos claves, c=Ek2(Ek1(m)), apenas ayuda.

Teorema (encuentro a medio camino, Diffie y Hellman 1977)

Con una sola pareja conocida (m,c), el cifrado doble con dos claves de n bits se rompe con unos 2n+1 cifrados y 2n de memoria, no 22n.

El ataque

Se cifra m con todas las k1 y se guardan los 2n resultados Ek1(m) en una tabla. Después se descifra c con todas las k2 y se busca Dk2(c) en la tabla: una coincidencia significa Ek1(m)=Dk2(c), así que (k1,k2) es candidata. Una segunda pareja conocida elimina los falsos candidatos. Las dos mitades se encuentran en el medio.

De ahí el triple DES, Ek3(Dk2(Ek1(m))), con una fuerza efectiva de unos 112 bits. Mantuvo funcionando a bancos y tarjetas de pago veinte años más. Su bloque de 64 bits fue su perdición: tras unos 232 bloques con la misma clave, las colisiones de bloques se vuelven probables (la cota del cumpleaños), y el ataque Sweet32 de 2016 lo explotó en HTTPS y OpenVPN. El NIST prohibió el triple DES para cifrar a partir de 2023.

Blowfish

En 1993 Bruce Schneier publicó Blowfish, una alternativa a DES rápida, libre y sin patentes: una red de Feistel de 16 rondas sobre bloques de 64 bits con claves de hasta 448 bits, cuyas S-boxes se generan a partir de la clave con un procedimiento deliberadamente lento. No se conoce ningún ataque práctico contra Blowfish completo, pero su bloque de 64 bits tiene el mismo problema del cumpleaños que el triple DES, y el propio Schneier recomienda sus sucesores. Su lenta preparación de clave sobrevive en bcrypt, el hash de contraseñas. cryptoKit 1.0 ofrecía Blowfish, así que la versión 2 lo mantiene, marcado como heredado.

El concurso AES

En 1997 el NIST hizo algo nuevo: en vez de diseñar el sustituto de DES a puerta cerrada, organizó un concurso internacional abierto. En 1998 se presentaron quince candidatos de doce países; la comunidad criptográfica los atacó en público durante dos años; quedaron cinco finalistas (MARS, RC6, Rijndael, Serpent y Twofish). En octubre de 2000 el NIST eligió Rijndael, de los criptógrafos belgas Joan Daemen y Vincent Rijmen, por su combinación de seguridad, rapidez en todo, desde tarjetas inteligentes hasta servidores, y claridad matemática. Se convirtió en el Advanced Encryption Standard, FIPS 197, en noviembre de 2001. El modelo de concurso funcionó tan bien que se ha repetido para las funciones hash (SHA-3), el hash de contraseñas (Argon2) y la criptografía poscuántica.

Dentro de AES

AES no es una red de Feistel sino una red de sustitución y permutación: cada ronda transforma el bloque entero de 128 bits, dispuesto como una cuadrícula de 4×4 bytes llamada estado. Su aritmética vive en un cuerpo finito.

Definición (el cuerpo de AES)

Un byte b7b6…b0 se lee como el polinomio b7x7+…+b1x+b0 con coeficientes en {0,1}. Los bytes se suman con ⊕ y se multiplican como polinomios módulo el polinomio irreducible m(x)=x8+x4+x3+x+1. Con estas operaciones, los 256 bytes forman el cuerpo GF(28).

Teorema

Como m(x) es irreducible sobre GF(2), todo byte a no nulo tiene inverso multiplicativo a−1, y a−1=a254.

Demostración

Los polinomios módulo un polinomio irreducible forman un cuerpo (como los enteros módulo un primo): si a(x)≠0, entonces mcd(a(x),m(x))=1 y el algoritmo de Euclides extendido da un u(x) con u(x)a(x)≡1(modm(x)). Los elementos no nulos forman un grupo de orden 255, así que a255=1 por el teorema de Lagrange y a−1=a254.

Cada una de las 10 rondas de AES-128 (12 en AES-192, 14 en AES-256) aplica cuatro pasos:

  1. SubBytes: cada byte a se sustituye por S(a)=A⋅a−1⊕63, el inverso en GF(28) seguido de una transformación afín fija A sobre los bits. La inversión es muy no lineal; la transformación afín elimina sus puntos fijos. Es la confusión.
  2. ShiftRows: la fila r del estado rota r bytes a la izquierda.
  3. MixColumns: cada columna se multiplica por la matriz de filas (2311), (1231), (1123), (3112) sobre GF(28). Es de distancia máxima separable: cambiar t bytes de una columna cambia al menos 5−t bytes del resultado. Junto con ShiftRows, es la difusión.
  4. AddRoundKey: XOR con una subclave derivada de la clave por la expansión de clave.

La última ronda omite MixColumns, y hay un AddRoundKey adicional antes de la primera ronda. La estrategia de rastro ancho de Daemen y Rijmen demuestra que cualquier rastro diferencial o lineal a lo largo de cuatro rondas activa al menos 25 S-boxes, lo que acota la probabilidad del mejor rastro muy por debajo de nada aprovechable.

AES-128, paso a paso, con el ejemplo del apéndice B de FIPS-197 (puedes escribir tu propio texto en claro y tu clave en hex). Cada casilla es un byte del estado, coloreado según su valor; las recuadradas cambiaron en el último paso. Observa cómo SubBytes cambia todos los bytes, ShiftRows los mueve, MixColumns reparte cada uno por su columna y la clave entra en cada AddRoundKey. El último paso muestra el texto cifrado 3925841d…, como en el estándar. La propia S-box se calcula en el navegador a partir del inverso en GF(2⁸), no se copia de una tabla.

El efecto avalancha

La difusión tiene una firma visible: si se invierte un bit del texto en claro, tras unas pocas rondas cambia aproximadamente la mitad de los bits de salida, con un patrón que parece aleatorio. Horst Feistel lo llamó efecto avalancha. AES alcanza la difusión completa en dos rondas: tras la segunda, cada byte de salida depende de todos los bytes de entrada.

El efecto avalancha en AES-128. Elige qué bit del texto en claro invertir; las barras muestran cuántos de los 128 bits del estado difieren entre los dos cifrados tras cada ronda: un bit en la entrada, unos pocos tras la ronda 1 y alrededor de 64 (la mitad) a partir de la ronda 2 o 3. La cuadrícula muestra qué bits del texto cifrado final difieren.

AES hoy

Un cuarto de siglo después de su elección, el mejor ataque contra AES-128 completo, el ataque biclique de 2011, necesita 2126,1 operaciones: un factor cuatro mejor que la fuerza bruta, y sin importancia práctica. Los ataques reales han sido contra las implementaciones: Daniel Bernstein mostró en 2005 que el software basado en tablas filtra la clave a través de los tiempos de la caché. Desde 2010 casi todos los procesadores incluyen instrucciones AES-NI, que ejecutan cada ronda en hardware, rápido y en tiempo constante. Frente a los ordenadores cuánticos, el algoritmo de Grover reduciría la seguridad de una clave de k bits a unos k/2 bits, así que AES-256 es la opción prudente para datos que deban seguir secretos durante décadas (ver el capítulo 10).

Para saber más

  1. Horst Feistel, «Cryptography and Computer Privacy», Scientific American 228(5), 1973.
  2. Don Coppersmith, «The Data Encryption Standard (DES) and its strength against attacks», IBM Journal of Research and Development 38(3), 1994.
  3. Electronic Frontier Foundation, Cracking DES (1998).
  4. Joan Daemen y Vincent Rijmen, The Design of Rijndael (2002; 2.ª ed. 2020).
  5. NIST, FIPS 197, Advanced Encryption Standard (2001, actualizado en 2023).