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 |
La criptografía de curva elíptica resuelve el mismo problema que RSA con otra estructura matemática, y su ventaja es puramente cuantitativa pero decisiva: una clave ECC de 256 bits ofrece aproximadamente la seguridad de una RSA de 3072 bits. Claves más cortas significan firmas más pequeñas, handshakes más rápidos, menos ancho de banda y menos consumo, lo que importa mucho en móviles, IoT y en cada conexión TLS del planeta. Por eso ECC es hoy el valor por defecto y RSA el legado que se mantiene por compatibilidad.
La estructura es una curva elíptica sobre un campo finito: el conjunto de puntos que
satisfacen una ecuación del tipo y² = x³ + ax + b con la aritmética hecha módulo un
primo. Sobre esos puntos se define una suma con reglas geométricas, y repetir esa suma
k veces sobre un punto G es la multiplicación escalar k·G. Ahí está todo: k es
la clave privada, k·G es la clave pública, y el ECDLP —dados G y k·G, hallar
k— es el problema que se cree inviable. Es el análogo elíptico del logaritmo discreto, y
resiste mucho mejor que su versión clásica, que es exactamente la razón de que las claves
puedan ser tan cortas.
No todas las curvas son iguales, y la elección tiene una historia. Las curvas NIST (P-256, P-384, P-521) son las estandarizadas y las que exige buena parte de la normativa, pero sus parámetros provienen de semillas cuyo origen la NSA nunca explicó del todo; tras el caso Dual_EC_DRBG —un generador con una puerta trasera plausible promovido por la misma agencia— parte de la comunidad dejó de confiar en ellas. Además, implementarlas de forma segura es difícil: exigen cuidado explícito para evitar canales laterales por tiempo.
Curve25519, diseñada por Bernstein, responde a esas dos objeciones. Sus parámetros son verificablemente rígidos (elegidos por criterios públicos que no dejan margen para esconder nada) y su diseño hace que las implementaciones sean naturalmente resistentes a canales laterales y difíciles de programar mal. Sus dos usos son X25519 para intercambio de claves y Ed25519 para firmas. Cuando puedas elegir, esa es la recomendación; las curvas NIST se usan cuando el cumplimiento normativo o la interoperabilidad lo imponen.
ECC gana en tamaño, velocidad de generación de claves y de firma, y es la opción moderna.
RSA conserva dos ventajas prácticas: verificar una firma RSA con e = 65537 es muy rápido
—útil cuando se verifica muchísimo más de lo que se firma— y su soporte en sistemas
antiguos es universal. Hay además un matiz de implementación importante: ECDSA depende
de un nonce aleatorio por firma, y filtrar o repetir ese nonce revela la clave privada;
así se rompió la firma de código de la PlayStation 3. Ed25519 elimina ese riesgo
generando el nonce de forma determinista a partir del mensaje y de la clave, y es otra
razón para preferirlo.
Conviene cerrar con una advertencia que enlaza con la clase 062: tanto RSA como ECC caen ante el algoritmo de Shor en un computador cuántico suficientemente grande. ECC no es más resistente por ser más nueva —de hecho necesita menos qubits para ser rota—, y por eso la migración post-cuántica afecta a ambas por igual.
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.| Término | Definición concisa |
|---|---|
| Curva elíptica | Conjunto de puntos que cumplen y² = x³ + ax + b sobre un campo finito |
| Campo finito | Aritmética modular sobre un primo, donde vive la curva |
Punto generador G |
Punto base público fijado por los parámetros de la curva |
| Multiplicación escalar | Sumar G consigo mismo k veces; operación fundamental |
| ECDLP | Hallar k conocidos G y k·G; base de la seguridad |
| Curvas NIST (P-256…) | Estándares extendidos; parámetros de origen discutido |
| Curve25519 | Curva de Bernstein con parámetros verificablemente rígidos |
| Rigidez (rigidity) | Que los parámetros se elijan por criterios públicos y sin margen |
| X25519 | Intercambio de claves sobre Curve25519 |
| Ed25519 | Firma sobre Curve25519, con nonce determinista |
| ECDSA | Firma sobre curvas NIST; el nonce filtrado revela la clave |
| Dual_EC_DRBG | Generador retirado por sospecha de puerta trasera |
| Canal lateral | Fuga por tiempo, consumo o caché al ejecutar la operación |
| Equivalencia de tamaños | ECC 256 bits ≈ RSA 3072 bits |
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