Parte: 2 — Criptografía aplicada · Fuente: Real-World Cryptography (Wong) e IETF RFC 5116 / RFC 8439 ⏱️ Duración estimada: 100 min · Nivel: Intermedio
Consolidar la lección central de la criptografía aplicada moderna: nunca cifres sin autenticar. El alumno aprenderá qué es el cifrado autenticado con datos asociados (AEAD), cómo AES-GCM y ChaCha20-Poly1305 combinan confidencialidad e integridad en una sola primitiva, qué son los "datos asociados" (AAD), y por qué AEAD es la respuesta directa a los ataques de padding oracle y manipulación de la clase 060.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Motivación: cifrar + autenticar juntos | Elimina errores de composición |
| 2 | AES-GCM | AEAD dominante con AES-NI |
| 3 | ChaCha20-Poly1305 | AEAD para software/móvil |
| 4 | Nonce y su unicidad | Reutilizarlo rompe GCM |
| 5 | Datos asociados (AAD) | Autenticar metadatos |
| 6 | Tag de autenticación | Detección de manipulación |
| 7 | AEAD vs padding oracle | Por qué previene el ataque |
openssl version # openssl enc -aes-256-gcm o vía API
pip install cryptography
Laboratorio local. Los mensajes son de prueba propios.
python
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = AESGCM.generate_key(bit_length=256)
aead = AESGCM(key)
nonce = os.urandom(12)
aad = b"id=42;tipo=factura"
ct = aead.encrypt(nonce, b"datos confidenciales", aad)
pt = aead.decrypt(nonce, ct, aad) # requiere el mismo AAD
print(pt)
Detecta manipulación. Cambia un byte de ct o del aad y llama a decrypt: se lanza InvalidTag. Concluye que AEAD falla cerrado.
ChaCha20-Poly1305: repite el ejercicio con ChaCha20Poly1305 y compara la API idéntica.
Nonce reutilizado en GCM (concepto y demo controlada). Cifra dos mensajes con el mismo nonce y clave; explica por qué esto permite recuperar el keystream (XOR de textos) y, peor aún, forjar tags (recuperación de la clave de autenticación H). Nunca lo hagas fuera del laboratorio.
Migra de CBC+HMAC a AEAD. Toma el ejercicio de la clase 052 y sustitúyelo por AES-GCM; observa la simplificación y menor superficie de error.
nonce || ciphertext || tag autoexplicativo.Implementa un contenedor cifrado de archivos con AES-GCM que incluya en el AAD metadatos (nombre y versión) y verifique integridad al abrir. Criterio de aceptación: el archivo se descifra solo con el nonce, la clave y el AAD correctos; cualquier alteración del contenido cifrado o de los metadatos provoca rechazo con InvalidTag, sin exponer datos.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
InvalidTag inesperado |
Nonce/AAD/clave distintos entre cifrado y descifrado |
| Nonce reutilizado en GCM | Rompe confidencialidad e integridad; usa nonce único |
Ignorar el resultado de decrypt |
Nunca uses datos sin verificar el tag |
| Cifrar con CBC sin MAC "porque es más simple" | Inseguro; usa AEAD |
| Nonce derivado predeciblemente | Usa CSPRNG o contador estrictamente único |
❓ ¿AES-GCM o ChaCha20-Poly1305? AES-GCM con AES-NI (servidores modernos); ChaCha20-Poly1305 en móviles/embebidos o sin aceleración. Ambos son AEAD estándar.
❓ ¿Qué pongo en el AAD? Metadatos que deban ser auténticos pero no secretos: cabeceras, versiones, identificadores de contexto.
❓ ¿Cuántos mensajes puedo cifrar con una clave GCM? Limitado por el riesgo de colisión de nonces (con nonces aleatorios de 96 bits, rota la clave antes de ~2³² mensajes). Considera nonces por contador.
Clase 058 — Generación de aleatoriedad segura (CSPRNG)