Lección 13 de 13
Modos de operación: de un bloque de 16 bytes a un mensaje entero
Aprende a cifrar mensajes de cualquier longitud con AES: relleno, ECB, CBC, CTR y GCM, con un ejemplo real, y cierra el curso con AES hoy y el ordenador cuántico.
Al terminar sabrás:
- Rellenar un mensaje a múltiplo de 16 bytes con PKCS#7
- Explicar por qué ECB filtra patrones y cómo lo evita CBC
- Ver CTR como una libreta de un solo uso cuya clave sale de AES, y su regla de oro
- Saber qué añade GCM: cifrar y autenticar a la vez
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 terminamos AES por dentro: sabes cifrar y descifrar un bloque de 16 bytes. Pero casi nada de lo que se cifra en la vida mide 16 bytes: un correo, una foto, una conversación en vivo. Este es el último paso del relato. Partimos de la libreta de un solo uso, perfecta pero con una clave tan larga como el mensaje, y llegamos a un cifrado de bloque con clave corta. Falta la pieza que lo convierte en algo útil: los modos de operación. Y, al final, el modo CTR nos devolverá, de un modo curioso, a la libreta.
La idea
Un cifrado de bloque es una permutación de por cada clave . No dice qué hacer con un mensaje de 40 bytes ni con uno de 3. Un modo de operación es una receta que usa como pieza para cifrar mensajes de cualquier longitud. NIST describe cinco en su SP 800-38A (ECB, CBC, CFB, OFB y CTR); aquí veremos tres, más un cuarto que añade autenticación.
Todos los ejemplos usan AES-128 con la clave del hilo, , y el primer bloque de mensaje será , el primer bloque del texto de los ejemplos de SP 800-38A con esta clave:
Relleno: que el mensaje encaje en bloques
Si la longitud del mensaje no es múltiplo de 16 bytes, hay que rellenar. Un esquema muy extendido es el relleno PKCS#7: se añaden bytes, y cada uno vale justo ese número. Así el receptor mira el último byte, sabe cuántos quitar y no hay ambigüedad.
| mensaje | bytes | relleno añadido |
|---|---|---|
| «HOLA» | 4 | doce bytes |
| 20 bytes | 20 | doce bytes (queda en 32) |
| 16 bytes | 16 | un bloque entero de dieciséis |
La última fila sorprende: un mensaje que ya encaja también se rellena. Si no, el receptor no podría distinguir un mensaje que acaba en de uno rellenado con un byte. El modo CTR, que veremos, no necesita relleno.
ECB: cada bloque por separado
El modo más ingenuo es ECB (electronic codebook): se corta el mensaje en bloques y se cifra cada uno con la misma clave:
Es simple y descifra bien, pero tiene un fallo de fondo: bloques iguales dan criptogramas iguales. Eva no sabe qué dicen, pero ve dónde se repiten. Con AES y nuestra clave, el mensaje (dos bloques iguales) se cifra como
Se ve la repetición a simple vista. En una imagen con zonas de un solo color, o en un fichero con cabeceras repetidas, el patrón del mensaje queda dibujado en el criptograma. Por eso ECB no debe usarse para mensajes de más de un bloque.
CBC: encadenar los bloques
En CBC (cipher block chaining) cada bloque se mezcla con el criptograma anterior antes de cifrar. Para el primero se necesita un bloque inicial, el vector de inicialización (IV), que no es secreto pero debe ser impredecible: por ejemplo, un bloque elegido al azar para cada mensaje (SP 800-38A, apéndice C). En fórmulas:
Para descifrar se deshace cada paso: . Ahora dos bloques iguales del mensaje dan criptogramas distintos, porque el XOR con el bloque anterior cambia la entrada de . Y el mismo mensaje cifrado dos veces da criptogramas distintos solo si cambia el IV: con la misma clave y el mismo IV, CBC repite exactamente el mismo criptograma. La contrapartida es que cifrar es secuencial: para el bloque necesitas el . Descifrar, en cambio, sí se puede hacer en paralelo.
Por qué importa el tamaño del bloque. Si en CBC dos bloques de criptograma coinciden, , es que AES recibió dos veces la misma entrada: . Entonces Eva obtiene , otra vez el XOR de dos trozos de mensaje sin necesidad de la clave. Los bloques de criptograma se comportan como bloques al azar, y por la paradoja del cumpleaños, con bloques de bits las coincidencias empiezan a ser probables hacia los bloques. Con los 64 bits de DES y del Triple DES eso son bloques, es decir, 32 GiB: tras cifrarlos con una misma clave, la probabilidad de alguna coincidencia ronda ya el 40 %. De ahí el interés del límite de bloques por juego de claves que el NIST fija para el Triple DES (lección 8): son solo 8 MiB, y esa probabilidad baja a unas 3 entre cien millones. Con los 128 bits de AES el umbral sube a bloques, muy lejos de cualquier uso real.
CTR: la libreta vuelve
En CTR (counter) no se cifra el mensaje con : se cifra un contador, y el resultado se usa como clave de una libreta. Se parte de un bloque inicial y se suman unidades: , como número de 128 bits. Entonces
Los bloques forman una secuencia de clave que se genera con la clave corta . Y cifrar es hacer XOR con ella, igual que en la lección 2 con «HOLA». Descifrar es exactamente la misma operación. Ventajas: no hace falta , no hace falta relleno (el último bloque puede ser corto: se usan solo los bytes que haga falta de ) y todos los bloques se pueden calcular a la vez.
Hay una regla de oro, la misma que en la libreta: nunca repetir un contador con la misma clave. Si dos mensajes usan la misma secuencia , entonces y la clave desaparece, justo el fallo de «CHAO» en la lección 2. Lo veremos con números en el ejercicio 2.
GCM: cifrar y comprobar que nadie ha tocado nada
A todo lo anterior le falta algo: ninguno de estos modos detecta que alguien haya modificado el criptograma. Hasta ahora Eva solo escuchaba (lección 1). Pero un atacante activo, que además de escuchar puede cambiar bits por el camino, es igual de real: no puede leer el criptograma, pero a veces puede alterarlo con provecho (el ejercicio 3 lo muestra). GCM (Galois/counter mode, NIST SP 800-38D) es un modo de cifrado autenticado: cifra en modo contador y además calcula una etiqueta de autenticación sobre los datos. Si el criptograma o los datos asociados cambian, la etiqueta ya no cuadra y el receptor rechaza el mensaje. El cálculo de la etiqueta usa una multiplicación en un cuerpo finito, : otra vez cuerpos finitos. No entramos en los detalles, que son el tema de otro curso.
Ejemplo resuelto
Ciframos el mensaje de dos bloques iguales con los tres modos y la clave del hilo (IV y contador elegidos como en SP 800-38A: IV y primer contador ). Mostramos los bytes abreviados.
ECB. , dos veces:
| bloque | criptograma |
|---|---|
CBC. El primer bloque entra en AES como , y el segundo como . Salen
Los dos criptogramas ya son distintos.
CTR. Cifras dos contadores consecutivos, y (la unidad se suma como número de 128 bits y hay acarreo):
Después
Distintos otra vez, y sin haber usado más que el cifrado.
Todos estos números se han contrastado con una implementación independiente de AES.
Con relleno. El mensaje de 20 bytes «Reunion a las ocho!!» (sin tilde, para que cada carácter sea un byte ASCII: ) se rellena con doce hasta 32 bytes. En CBC con el mismo IV sale
Ejercicios
Ejercicio 1
Rellena con PKCS#7 un mensaje de exactamente 16 bytes. ¿Qué bytes se añaden? ¿Y si el mensaje tiene 31 bytes?
Ver la solución
Con 16 bytes, : se añade un bloque entero de dieciséis bytes (en decimal, 16). Con 31 bytes, , así que se añade byte, de valor , y el mensaje queda en 32 bytes.
Ejercicio 2
Alicia cifra en CTR, por error con el mismo contador , dos mensajes de un bloque: y
Eva ve ambos criptogramas: (el del ejemplo) y
¿Qué obtiene si hace su XOR?
Ver la solución
Los dos usan , así que . Haciendo el XOR dígito a dígito de los valores dados,
que es justo . La clave ha desaparecido. Si Eva conoce (por ejemplo, una cabecera estándar), recupera sin tocar AES.
Ejercicio 3
En el CBC del ejemplo (mensaje ), un atacante cambia el último bit del primer byte de y el receptor descifra. ¿Qué pasa con y con ?
Ver la solución
El bloque usa solo en el XOR, así que el bit cambiado pasa tal cual a : el primer byte pasa de a y el resto no cambia. En cambio descifra un bloque alterado, y la difusión de AES lo deja irreconocible: sale , que difiere de en 68 de los 128 bits. Moraleja: CBC no avisa de que algo ha cambiado, y el atacante controla un bit del bloque siguiente. Por eso se usa un modo autenticado como GCM.
Cierre del curso: AES hoy y lo que viene
Dónde se usa. AES va dentro de casi todo lo que cifras sin darte cuenta. En TLS 1.3 (RFC 8446, §9.1), el protocolo de las conexiones web seguras, toda implementación debe soportar la suite TLS_AES_128_GCM_SHA256 y debería soportar TLS_AES_256_GCM_SHA384: AES en modo GCM. Y se reparte el trabajo como dijimos en la lección 1: un método de clave pública acuerda la clave, y AES cifra los datos. Para el primero, mira por qué funciona RSA y juega con RSA paso a paso.
El ordenador cuántico. El algoritmo de Shor rompe RSA, como cuenta este artículo. A AES le afecta otro algoritmo, el de Grover, que según el NIST permite buscar la clave por fuerza bruta con cuadráticamente menos pasos: entre claves, del orden de pasos en lugar de ; para 128 bits, unos en lugar de . Pero, como subraya el NIST, esos pasos tienen que hacerse uno tras otro (no se reparten entre muchas máquinas) y el hardware cuántico es caro. Es una ventaja mucho menor que la de Shor sobre RSA. Sobre AES-128, el NIST dice que probablemente Grover dé poca o ninguna ventaja y que seguirá siendo seguro durante décadas; y para AES-192 y AES-256 cree que seguirán siendo seguros durante mucho tiempo. Su conclusión es que las aplicaciones actuales pueden seguir usando AES con claves de 128, 192 o 256 bits.
Qué estudiar después.
- Autenticación: los códigos MAC y el cifrado autenticado (lo que GCM hace por dentro).
- Funciones hash y cifrados de flujo.
- Criptografía de clave pública: RSA y curvas elípticas.
- Seguridad demostrable, en el libro de Katz y Lindell o en el de Boneh y Shoup, de acceso libre.
- Ataques más finos a cifrados de bloque: criptoanálisis diferencial y lineal.
Hemos pasado de la libreta perfecta a AES, pasando por DES, los cuerpos finitos y los modos de operación.
En resumen
- Un cifrado de bloque cifra un solo bloque; un modo de operación lo extiende a mensajes enteros, y PKCS#7 rellena el último bloque (siempre, incluso si ya encaja).
- ECB cifra cada bloque por separado: bloques iguales dan criptogramas iguales y se ven los patrones.
- CBC encadena con el criptograma anterior y un IV; CTR cifra un contador y hace XOR, como una libreta de un solo uso cuya clave sale de AES. Su regla: nunca repetir contador con la misma clave.
- GCM cifra en modo contador y añade una etiqueta que detecta modificaciones: es la opción habitual, por ejemplo en TLS 1.3.
- Frente al ordenador cuántico, el NIST considera que AES con claves de 128, 192 o 256 bits puede seguir usándose.
Has terminado el curso. Sigue en la guía de criptografía.
Para profundizar
- NIST, Recommendation for Block Cipher Modes of Operation: Methods and Techniques (SP 800-38A) (2001).
- NIST, Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC (SP 800-38D) (2007).
- E. Rescorla, RFC 8446, The Transport Layer Security (TLS) Protocol Version 1.3, §9.1 (2018).
- NIST, Post-Quantum Cryptography FAQs (2018).