Herramientas
Visualizador del sobre Encrypt-then-MAC
Demo interactiva de [ver][iv][hmacTag][cipher] con AES-256-CBC + HMAC-SHA256 real en tu navegador: altera un byte y mira cómo la verificación antes de descifrar lo rechaza.
……Pulsa cualquier byte para alterarlo — o usa un ataque de abajo — y observa el veredicto de la lectura.
Cada uno es una manipulación real del post. Todos se bloquean ante fallos bajo encrypt-then-MAC — pero por motivos distintos.
En modo descifrar-primero el dispositivo filtra un bit por consulta — padding válido o no. Eso basta para recuperar el texto plano sin la clave. Cambia a encrypt-then-MAC y el mismo atacante enmudece.
En CBC, voltear un byte del IV voltea el byte correspondiente del texto plano del bloque 0 en la misma cantidad exacta — un cambio controlado. (Con encrypt-then-MAC nunca llegas a usarlo.)
Sobre esta herramienta
Cada fichero de la bóveda es un sobre encrypt-then-MAC: [ver][iv][hmacTag][cipher]. Esta herramienta construye uno de verdad en tu navegador — deriva subclaves encKey y macKey distintas, cifra el secreto con AES-256-CBC y autentica juntos el byte de versión, el IV y el texto cifrado con HMAC-SHA256.
Es la compañera interactiva del artículo Una bóveda con bloqueo ante fallos: Encrypt-then-MAC en un MCU.
¿Cómo se usa?
Escribe un secreto y una frase de paso, y fija el contexto autenticado (tipo de registro, slot, generación). El sobre se vuelve a sellar en vivo según escribes.
Pulsa cualquier byte para alterarlo, o elige uno de los siete ataques: voltear un byte del cifrado/IV, falsificar el tag, truncar el cifrado, mover el fichero a otro slot, cambiar su tipo de registro o revertir su generación.
Observa el veredicto de la lectura. Bajo encrypt-then-MAC todos los ataques se bloquean ante el fallo — y la herramienta te dice por qué falla cada uno (un motivo distinto para cada uno).
Cambia el camino de lectura a descifrar-primero y pulsa Lanzar el ataque de oráculo de padding: un ataque de Vaudenay real recupera el último bloque del texto plano byte a byte usando solo la señal de padding válido/inválido — sin la clave. Vuelve a encrypt-then-MAC y el mismo atacante enmudece.
¿Qué muestra?
Separación de claves — una frase de paso se convierte en una clave maestra que se abre en subclaves
encKeyymacKeydistintas.Ligado al contexto — el tag cubre
ver ‖ recordType ‖ slotId ‖ generation, así que reubicar, cambiar de tipo o revertir un fichero rompe el MAC aunque el cifrado esté intacto.Verificar antes de descifrar y bloqueo ante fallos — el tag se comprueba primero, así que un fichero manipulado nunca llega al descifrado AES-CBC y cualquier fallo no devuelve nada.
El camino fatal — descifrar-primero corre el cifrado sobre los bytes del atacante antes del MAC, exponiendo un oráculo de padding real.
Maleabilidad CBC — voltear un byte del IV voltea el byte correspondiente del texto plano del bloque 0 en la misma cantidad: la palanca del atacante.
La construcción, en fórmulas
Sellado (camino de escritura):
encKey = HMAC(master, "vault-enc")
macKey = HMAC(master, "vault-mac")
C = AES-256-CBC-Encrypt(encKey, IV, PKCS7(P))
tag = HMAC-SHA256(macKey, ver ‖ recordType ‖ slotId ‖ generation ‖ IV ‖ C)
file = [ver] [IV] [tag] [C]Lectura bajo encrypt-then-MAC (verificar y luego descifrar):
tag' = HMAC-SHA256(macKey, context ‖ IV ‖ C)
if not constant_time_equal(tag', tag): reject // bloqueo ante fallos, sin texto plano
P = unpad(AES-256-CBC-Decrypt(encKey, IV, C))Por qué el orden lo es todo — el trabajo al que se enfrenta un atacante:
Falsificar un tag sin
macKey: una fuerza bruta de2^256(HMAC-SHA256) — inviable.Oráculo de padding (descifrar-primero): ~1 bit por consulta, ≤ 256 consultas por byte → un bloque de 16 bytes en ≤ ~4096 consultas.
Encrypt-then-MAC elimina el oráculo de raíz: para un fichero falsificado el descifrado es inalcanzable, así que el ataque pasa de lineal a imposible.
Por qué la maleabilidad CBC es la palanca
En CBC, P_i = Decrypt(C_i) ⊕ C_(i-1) (con C_(-1) = IV). Por tanto ΔP_i = ΔC_(i-1): voltear un byte del bloque anterior — o del IV, para el bloque 0 — voltea el mismo byte del texto plano en la misma cantidad, de forma predecible. Ese cambio controlado es justo lo que permite a un oráculo de padding extraer el texto plano byte a byte.
Referencias y lecturas
Bellare y Namprempre — Authenticated Encryption: Relations among Notions and Analysis of the Generic Composition Paradigm
(encrypt-then-MAC es la composición genéricamente segura)
Krawczyk — The Order of Encryption and Authentication for Protecting Communications
Vaudenay (2002) — Security Flaws Induced by CBC Padding
(el ataque de oráculo de padding original)
Moxie Marlinspike — The Cryptographic Doom Principle
RFC 5652 §6.3 — relleno PKCS#7
NIST SP 800-57 Parte 1
(una clave, un propósito) ·
FIPS 180-4 — SHA-256
Privacidad
Toda la criptografía se ejecuta enteramente en tu navegador con la Web Crypto API. Nada de lo que escribes se transmite a ningún servidor.
Preguntas frecuentes
¿Qué significa "encrypt-then-MAC"?
Significa que primero ciframos el texto plano y luego calculamos un MAC sobre el texto cifrado resultante (más el byte de versión y el IV). En la lectura, el MAC se verifica antes de intentar cualquier descifrado.
¿Por qué verificar el MAC antes de descifrar?
Comprobar el tag primero hace que un fichero manipulado nunca llegue al descifrado AES-CBC, lo que cierra los ataques de oráculo de padding. Si el tag no coincide, la lectura se bloquea ante el fallo y no se produce texto plano.
¿Por qué usar claves distintas para el cifrado y el MAC?
Reutilizar una misma clave para AES y HMAC es inseguro, así que la frase de paso deriva una clave maestra que se abre en subclaves encKey y macKey distintas. La clave de cifrado y la de MAC nunca son el mismo valor.
¿Qué ocurre cuando altero un byte del sobre?
Alterar cualquier byte cambia los datos que cubre el HMAC, así que el tag recalculado deja de coincidir con el tag almacenado. La lectura se bloquea ante el fallo: no se descifra nada y no se devuelve texto plano.
¿Se envía mi secreto o frase de paso a algún sitio?
No. Toda la criptografía se ejecuta enteramente en tu navegador con la Web Crypto API, y nada de lo que escribes se transmite a ningún servidor.