Contexto autenticado (ligado al tag, no se almacena)

El tag también cubre ver ‖ recordType ‖ slotId ‖ generation. Esos bytes nunca se escriben en el fichero — vienen de dónde vive y de meta.bin — así que reubicar, cambiar de tipo o revertir un fichero rompe el MAC. Cambiar uno aquí vuelve a sellar el sobre.

De una clave maestra (SHA-256 de la frase) se derivan dos subclaves con etiquetas HMAC distintas — así la clave de cifrado y la de MAC nunca son la misma.
encKey
macKey
Sobre sellado

Pulsa cualquier byte para alterarlo — o usa un ataque de abajo — y observa el veredicto de la lectura.

ver · 1 B
iv · 16 B
hmacTag · 32 B
cipher · AES-256-CBC
Prueba un ataque

Cada uno es una manipulación real del post. Todos se bloquean ante fallos bajo encrypt-then-MAC — pero por motivos distintos.

Camino de lectura
Atacante de oráculo de padding

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.

Maleabilidad CBC — la palanca del atacante

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?

  1. 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.

  2. 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.

  3. 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).

  4. 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 encKey y macKey distintas.

  • 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 de 2^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

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.