# Visualizador del sobre Encrypt-then-MAC

> Una página de jmrp.io, publicada como markdown. Índice: https://jmrp.io/llms.txt

> Generated: 2026-08-29

URL: https://jmrp.io/es/tools/etm-envelope-visualizer/
Language: es
Alternate: https://jmrp.io/tools/etm-envelope-visualizer/index.md
Updated: 2026-08-25
Category: security
Tags: security, cryptography, encrypt-then-mac, aes, hmac, firmware

Sella un secreto en un sobre encrypt-then-MAC, altera un byte y observa cómo la lectura verifica el tag antes de descifrar. Todo en el navegador.

Características:
- Sellado de sobre AES-256-CBC + HMAC-SHA256 en vivo
- Derivación de subclaves encKey y macKey separadas
- Tag ligado al contexto: ver‖recordType‖slotId‖generation
- Siete ataques reales: voltear, falsificar, truncar, reubicar, cambiar tipo, revertir
- Encrypt-then-MAC vs descifrar-primero, con ataque de oráculo de padding en vivo
- Web Crypto API, nada sale de tu navegador

Preguntas que responde:

**¿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.


---

**Herramienta interactiva** — esta página contiene la aplicación en funcionamiento, no una descripción de ella.

## 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](https://jmrp.io/es/blog/011-encrypt-then-mac-vault/).

### ¿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

- [Bellare y Namprempre — Authenticated Encryption: Relations among Notions and Analysis of the Generic Composition Paradigm](https://eprint.iacr.org/2000/025) (encrypt-then-MAC es la composición genéricamente segura)
- [Krawczyk — The Order of Encryption and Authentication for Protecting Communications](https://eprint.iacr.org/2001/045)
- [Vaudenay (2002) — Security Flaws Induced by CBC Padding](https://www.iacr.org/archive/eurocrypt2002/23320530/cbc02_e02d.pdf) (el ataque de oráculo de padding original)
- [Moxie Marlinspike — The Cryptographic Doom Principle](https://moxie.org/2011/12/13/the-cryptographic-doom-principle.html)
- [RFC 2104 — HMAC](https://datatracker.ietf.org/doc/html/rfc2104) · [RFC 5652 §6.3 — relleno PKCS#7](https://datatracker.ietf.org/doc/html/rfc5652#section-6.3)
- [NIST SP 800-57 Parte 1](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf) (una clave, un propósito) · [FIPS 180-4 — SHA-256](https://csrc.nist.gov/pubs/fips/180-4/upd1/final)

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

