Parte: 2 — Criptografía aplicada · Fuente: Real-World Cryptography (Wong) e IETF RFC 8439 ⏱️ Duración estimada: 90 min · Nivel: Intermedio
Entender qué es un cifrado de flujo, cómo genera un keystream que se combina por XOR con el texto plano, y por qué ChaCha20 (junto a Poly1305) es hoy el cifrado de flujo recomendado, mientras que RC4 está prohibido en TLS por sus sesgos estadísticos explotables. El alumno interiorizará la regla de oro: nunca reutilizar un par (clave, nonce).
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Cifrado de flujo vs de bloque | Elección según latencia y hardware |
| 2 | Keystream y XOR | Base de todo cifrado de flujo |
| 3 | ChaCha20 internamente | El estándar moderno (móviles sin AES-NI) |
| 4 | Nonce y contador | Unicidad obligatoria |
| 5 | RC4 y sus sesgos | Lección histórica de fallo |
| 6 | Reutilización de nonce | El error catastrófico |
| 7 | ChaCha20-Poly1305 (adelanto AEAD) | Confidencialidad + integridad |
pip install cryptography
openssl version # openssl enc no soporta ChaCha20 directamente; usa Python o TLS
Entorno local. La reutilización de nonce se practica solo sobre datos propios de laboratorio.
python
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms
key = os.urandom(32)
nonce = os.urandom(16) # 16 bytes para la primitiva raw de cryptography
enc = Cipher(algorithms.ChaCha20(key, nonce), mode=None).encryptor()
ct = enc.update(b"mensaje secreto")
print(ct.hex())
Verifica la simetría del XOR: descifra reusando la misma clave y nonce y recupera el texto.
Ataque de nonce reutilizado (laboratorio propio). Cifra m1 y m2 con la misma clave y nonce. Calcula c1 XOR c2 = m1 XOR m2. Si conoces parte de m1, recuperas la parte correspondiente de m2. Documenta cómo se filtra información sin conocer la clave.
Sesgo de RC4 (demostración estadística). Genera muchos keystreams RC4 con claves aleatorias y grafica la frecuencia del segundo byte: verás que no es uniforme (sesgo de Fluhrer-McGrew), la base de los ataques prácticos.
Comparación de rendimiento. Mide ChaCha20 vs AES-CTR en tu CPU; en dispositivos sin AES-NI ChaCha20 suele ganar.
c1 XOR c2 = m1 XOR m2 con nonce repetido.Implementa el ataque de "nonce reutilizado": dados dos textos cifrados con la misma clave y nonce y conocido parcialmente uno de ellos (crib dragging), recupera el otro. Criterio de aceptación: recuperas al menos el fragmento de texto plano solapado con la porción conocida, sin usar la clave.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Textos correlacionados | Nonce reutilizado; genera nonce único por mensaje |
| Uso de RC4 en configuración TLS | Prohibido (RFC 7465); deshabilítalo |
| Nonce de tamaño incorrecto | Ajusta a lo que exige la librería (12 o 16 bytes) |
| Cifrado sin MAC | XOR malleable; usa ChaCha20-Poly1305 |
| Contador desbordado | No reuses claves más allá del límite del contador |
❓ ¿ChaCha20 es más seguro que AES? Ambos son seguros. ChaCha20 destaca en software y resistencia a timing; AES gana con aceleración hardware.
❓ ¿Puedo usar el mismo nonce si cambio la clave? Sí; lo prohibido es repetir el par (clave, nonce). Un nonce por clave es único de forma segura.
❓ ¿Por qué se sigue viendo RC4 en sistemas viejos? Legado. Debe deshabilitarse; TLS moderno lo prohíbe.
Clase 047 — Cifrado simétrico: AES y modos de operación