Parte: 2 — Criptografía aplicada · Fuente: Serious Cryptography (Aumasson) y A Graduate Course in Applied Cryptography (Boneh/Shoup) ⏱️ Duración estimada: 120 min · Nivel: Intermedio
Comprender la criptografía de clave pública a través de RSA: cómo se genera un par de claves a partir de dos primos grandes, en qué problema matemático se apoya su seguridad (factorización), y por qué RSA "de libro" (textbook) es inseguro y debe usarse con padding OAEP para cifrado y PSS para firma. El alumno generará claves con OpenSSL y verá el porqué de cada decisión.
Al finalizar, el alumno podrá:
n.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Idea de clave pública/privada | Resuelve la distribución de claves |
| 2 | Matemática de RSA (n, e, d, φ) | Fundamento del algoritmo |
| 3 | Problema de la factorización | Base de la seguridad |
| 4 | RSA textbook y sus fallos | Determinista y maleable |
| 5 | Padding OAEP | Cifrado seguro |
| 6 | Firma con PSS | Firma segura (se amplía en clase 054) |
| 7 | Cifrado híbrido | RSA envuelve una clave AES |
n = p·q (primos grandes), exponente público e (típico 65537) y privado d. Cifrado: c = mᵉ mod n.φ(n) = (p-1)(q-1); se usa para calcular d como inverso de e.openssl version
pip install cryptography
Genera y prueba solo con claves propias. Nunca uses claves de terceros sin autorización.
bash
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out priv.pem
openssl rsa -in priv.pem -pubout -out pub.pem
openssl rsa -in priv.pem -text -noout | head -n 20
bash
echo -n "clave-de-sesion-32-bytes........" > k.bin
openssl pkeyutl -encrypt -pubin -inkey pub.pem \
-pkeyopt rsa_padding_mode:oaep -in k.bin -out k.enc
openssl pkeyutl -decrypt -inkey priv.pem \
-pkeyopt rsa_padding_mode:oaep -in k.enc -out k.dec
diff k.bin k.dec && echo "OK"
Observa el determinismo del RSA textbook (didáctico): cifra dos veces el mismo mensaje sin padding con un módulo pequeño en Python y comprueba que da idéntico cifrado → filtra igualdad.
Cifrado híbrido: genera una clave AES aleatoria, cifra un archivo grande con AES-GCM y cifra solo la clave AES con RSA-OAEP. Documenta por qué RSA no cifra el archivo entero (límite de tamaño y lentitud).
p=61, q=53, e=17; halla d y cifra m=65.e=65537 es una elección común.Implementa un esquema de "sobre digital": cifra un archivo de varios MB con AES-GCM y protege la clave AES con RSA-OAEP; entrega un descifrador que recupere el archivo original. Criterio de aceptación: el archivo descifrado es idéntico byte a byte al original y la clave AES nunca aparece en claro en disco.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
data too large for key size |
Intentas cifrar datos grandes con RSA; usa cifrado híbrido |
| Cifrado determinista | Usaste RSA sin OAEP; aplica padding aleatorizado |
| Clave de 1024 bits | Insegura; usa 3072 bits o migra a ECC |
| Firmar cifrando con la privada "a mano" | Usa PSS, no operaciones RSA crudas |
Exponente d filtrado o p,q reutilizados |
Compromete todo; genera claves con CSPRNG y no reutilices primos |
❓ ¿Por qué no cifrar todo con RSA? Es lento y limitado al tamaño del módulo. Se usa para cifrar claves de sesión, no datos masivos.
❓ ¿RSA está roto? No para tamaños adecuados (≥3072 bits), pero es vulnerable a computación cuántica futura (Shor) y muchas implementaciones fallaron por mal padding.
❓ ¿OAEP o PKCS#1 v1.5? OAEP para cifrado nuevo; PKCS#1 v1.5 es propenso a ataques (Bleichenbacher) y se mantiene solo por compatibilidad.
Clase 048 — Cifrado de flujo: ChaCha20 y por qué evitar RC4