Parte: 2 — Criptografía aplicada · Fuente: Serious Cryptography (Aumasson) y Real-World Cryptography (Wong) ⏱️ Duración estimada: 120 min · Nivel: Avanzado
Entender por qué la criptografía de curva elíptica logra la misma seguridad que RSA con claves mucho más pequeñas, en qué consiste el problema del logaritmo discreto sobre curvas elípticas (ECDLP), y cómo se usan las curvas modernas (P-256, Curve25519) para intercambio de claves (ECDH/X25519) y firma (ECDSA/Ed25519). El alumno generará claves EC con OpenSSL y comparará tamaños y rendimiento.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Curvas elípticas sobre campos finitos | Estructura matemática base |
| 2 | Suma de puntos y multiplicación escalar | Operación fundamental |
| 3 | ECDLP | Base de la seguridad |
| 4 | Curvas NIST vs Curve25519 | Elección y confianza |
| 5 | ECDH / X25519 | Intercambio de claves |
| 6 | ECDSA / Ed25519 | Firmas |
| 7 | ECC vs RSA | Trade-offs prácticos |
y² = x³ + ax + b sobre un campo finito, con una operación de grupo. Característica: permite cripto con claves pequeñas.Q = k·P (sumar P consigo mismo k veces). Fácil hacia adelante, difícil de invertir (ECDLP).P y Q = k·P, hallar k es computacionalmente inviable. Base de ECC.openssl version
openssl ecparam -list_curves | head
pip install cryptography
Entorno de laboratorio propio. La generación de claves es local.
bash
openssl ecparam -name prime256v1 -genkey -noout -out ec_priv.pem
openssl ec -in ec_priv.pem -pubout -out ec_pub.pem
openssl ec -in ec_priv.pem -text -noout | head
Compara tamaños: observa que una clave EC de 256 bits equivale en seguridad a una RSA de 3072 bits; la clave EC es mucho más compacta.
ECDH con X25519 en Python (dos partes derivan el mismo secreto):
python
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
a = X25519PrivateKey.generate(); b = X25519PrivateKey.generate()
s1 = a.exchange(b.public_key())
s2 = b.exchange(a.public_key())
assert s1 == s2 # secreto compartido idéntico
python
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
k = Ed25519PrivateKey.generate()
sig = k.sign(b"documento")
k.public_key().verify(sig, b"documento") # no lanza excepción = válida
openssl speed.Implementa un mini protocolo de establecimiento de canal: dos partes hacen ECDH (X25519), derivan una clave con HKDF y la usan para cifrar un mensaje con AES-GCM. Criterio de aceptación: ambas partes descifran el mensaje del otro y un tercero que solo ve las claves públicas no puede.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Secretos ECDH distintos | Curvas o codificaciones distintas; usa la misma curva |
| ECDSA roto por nonce reutilizado | Nonce k repetido revela la clave; usa RFC 6979 o Ed25519 |
| Punto público no validado | Riesgo de curva inválida; valida pertenencia a la curva |
| Uso de curvas débiles/obsoletas | Elige P-256, P-384 o Curve25519 |
| Confundir clave de firma con clave de ECDH | Separa propósitos; no reutilices el par de claves |
❓ ¿ECC o RSA? ECC para nuevos diseños: claves pequeñas, rápido, adoptado por TLS 1.3. RSA persiste por compatibilidad.
❓ ¿Curvas NIST o Curve25519? Curve25519/Ed25519 minimizan errores de implementación y no dependen de constantes de origen dudoso; muy recomendadas.
❓ ¿ECC resiste computación cuántica? No; como RSA, cae ante Shor. Por eso existe la criptografía post-cuántica (clase 062).
Clase 049 — Cifrado asimétrico: RSA