security cryptography ecc rsa encryption web-security

Guía de Curva Elíptica y Criptografía Asimétrica Avanzada

Una guía completa sobre criptografía asimétrica moderna: comparativa de variantes RSA (OAEP, PSS) con Criptografía de Curva Elíptica (ECDSA, Ed25519), intercambio de claves (X25519) y derivación de claves (HKDF).

2026-04-11

Introducción a la Criptografía Asimétrica

La criptografía asimétrica, o criptografía de clave pública, es la piedra angular de la seguridad digital moderna. A diferencia del cifrado simétrico donde se comparte una única clave, los sistemas asimétricos utilizan un par de claves: una clave pública para el cifrado o la verificación de firmas, y una clave privada para el descifrado o la firma.

Esta guía explora la evolución desde el RSA tradicional hasta la criptografía de curva elíptica (ECC) moderna, cubriendo estándares como Ed25519, X25519 y esquemas avanzados como RSA-PSS y HKDF.


1. Variantes de RSA: OAEP, PSS y PKCS1-v1.5

RSA (Rivest–Shamir–Adleman) ha sido el estándar de la industria durante décadas. Sin embargo, la forma en que se implementa RSA es fundamental para la seguridad.

RSA-PKCS1-v1.5 (El estándar heredado)

El esquema de relleno (padding) más antiguo. Aunque todavía se usa ampliamente, es vulnerable a ataques de oráculo de relleno (como el ataque Bleichenbacher). Generalmente se desaconseja para nuevas aplicaciones.

RSA-OAEP (Relleno de Cifrado Asimétrico Óptimo)

Se utiliza para el cifrado. OAEP añade un relleno basado en una red de Feistel que proporciona "conciencia del texto plano". Evita que un atacante pueda modificar el texto cifrado y obtener información sobre el texto plano.

  • Recomendación: Utilice RSA-OAEP en lugar de PKCS1-v1.5 para cifrar datos.

RSA-PSS (Esquema de Firma Probabilística)

Se utiliza para firmas digitales. A diferencia de los esquemas más antiguos, se ha demostrado que PSS es seguro en el modelo de oráculo aleatorio. Añade sal al proceso de firma, haciéndolo probabilístico en lugar de determinista.

  • Recomendación: Los protocolos modernos como TLS 1.3 requieren o prefieren fuertemente RSA-PSS sobre las firmas PKCS1-v1.5 antiguas.

2. Inmersión Profunda en la Criptografía de Curva Elíptica (ECC)

ECC proporciona el mismo nivel de seguridad que RSA pero con claves mucho más pequeñas. Por ejemplo, una clave ECC de 256 bits es aproximadamente equivalente a una clave RSA de 3072 bits.

ECDSA (Algoritmo de Firma Digital de Curva Elíptica)

El análogo de curva elíptica del Algoritmo de Firma Digital (DSA).

  • ECDSA-P256: La curva NIST más común. Muy compatible, pero algunos expresan preocupación por posibles "puertas traseras" en los parámetros NIST.
  • ECDSA-P384: Utilizada para niveles de seguridad más altos (Top Secret).

EdDSA y Curvas de Edwards Retorcidas

La criptografía moderna se está moviendo hacia EdDSA (Algoritmo de Firma Digital de Curva de Edwards).

  • Ed25519: Basada en la Curve25519. Está diseñada para alta velocidad y alta seguridad. Es determinista (no necesita un generador de números aleatorios durante la firma), lo que elimina una fuente común de fallos catastróficos en ECDSA.
  • Ed448: Una curva "Goldilocks" que proporciona una seguridad aún mayor (nivel de seguridad de 224 bits) que Ed25519.

3. Protocolos de Intercambio de Claves

¿Cómo establecen dos partes un secreto compartido a través de un canal inseguro?

Diffie-Hellman (DH)

El protocolo de intercambio de claves original. Hoy en día, ha sido reemplazado en su mayoría por su versión de Curva Elíptica.

ECDH (Diffie-Hellman de Curva Elíptica)

  • ECDH-P256 / P384: Uso de curvas NIST para establecer secretos.
  • X25519: El estándar de oro moderno para el intercambio de claves. Es una función ECDH que utiliza Curve25519. Es más rápida, segura y fácil de implementar correctamente que las curvas NIST.
  • X448: La contraparte de mayor seguridad de X25519.

4. Derivación de Claves: HKDF

Una vez que se establece un secreto compartido (por ejemplo, a través de X25519), no debe usarse directamente como una clave de cifrado. En su lugar, utilizamos una Función de Derivación de Claves (KDF).

HKDF-SHA256 (KDF de extracción y expansión basada en HMAC)

HKDF sigue un proceso de dos pasos:

  1. Extract (Extraer): Toma el secreto compartido "en bruto" y algo de sal opcional para producir una "clave seudoaleatoria" (PRK).
  2. Expand (Expandir): Convierte esa PRK en múltiples claves de las longitudes deseadas (por ejemplo, una clave AES y un IV).

El uso de HKDF-SHA256 garantiza que las claves finales sean criptográficamente fuertes e independientes.


5. Tabla Comparativa

Algoritmo Tamaño de Clave (Seguridad) Rendimiento Estándar Caso de Uso
RSA 2048 112 bits Lento Heredado Compatibilidad
RSA 3072 128 bits Muy Lento Fuerte Heredado/Empresarial
ECDSA-P256 128 bits Rápido NIST Móvil/Web General
Ed25519 128 bits Muy Rápido Moderno Recomendado para Firmas
X25519 128 bits Muy Rápido Moderno Recomendado para Intercambio
Ed448 224 bits Medio Alta Seg Sistemas ultra seguros

6. Recomendaciones de Seguridad: ¿Por qué Ed25519?

¿Por qué los expertos se están alejando de RSA y las curvas NIST hacia Ed25519?

  1. Resistencia a ataques de canal lateral: Las implementaciones de Ed25519 suelen ser de tiempo constante por diseño, protegiendo contra ataques de tiempo.
  2. Sin aleatoriedad de "mala suerte": ECDSA requiere un número aleatorio nuevo y de alta calidad para cada firma. Si ese generador falla aunque sea un poco, se puede recuperar su clave privada. Ed25519 es determinista y evita esto por completo.
  3. Rendimiento: Ed25519 es significativamente más rápido en la firma y verificación, lo cual es crítico para servidores de alto tráfico.
  4. Claves pequeñas: Las claves de 32 bytes son mucho más fáciles de manejar en códigos QR, índices de bases de datos y encabezados que las claves RSA de 512 bytes.

7. Ejemplos de Código

Node.js: Firma Ed25519

Usando el módulo crypto integrado:

const crypto = require('crypto');

// Generar par de claves Ed25519
const { privateKey, publicKey } = crypto.generateKeyPairSync('ed25519');

const mensaje = Buffer.from('¡Hola, Seguridad!');

// Firmar
const firma = crypto.sign(null, mensaje, privateKey);

// Verificar
const esVerificada = crypto.verify(null, mensaje, publicKey, firma);
console.log('Firma verificada:', esVerificada);

Python: Intercambio de claves X25519

Usando la librería cryptography:

from cryptography.hazmat.primitives.asymmetric import x25519

# Lado de Alice
alice_private = x25519.X25519PrivateKey.generate()
alice_public = alice_private.public_key()

# Lado de Bob
bob_private = x25519.X25519PrivateKey.generate()
bob_public = bob_private.public_key()

# Cálculo del secreto compartido
alice_shared = alice_private.exchange(bob_public)
bob_shared = bob_private.exchange(alice_public)

assert alice_shared == bob_shared
print("¡Secreto compartido establecido!")

8. FAQ: Errores Comunes

Q: ¿Puedo usar la misma clave para RSA-OAEP y RSA-PSS?

A: Técnicamente es posible, pero se desaconseja encarecidamente. El uso de la misma clave para diferentes propósitos (cifrado y firma) puede dar lugar a ataques entre protocolos. Utilice siempre claves separadas para funciones separadas.

Q: ¿Es Ed25519 resistente a la computación cuántica?

A: No. Al igual que RSA y todas las ECC actuales, Ed25519 es vulnerable a ordenadores cuánticos a gran escala que utilicen el algoritmo de Shor. Para la resistencia cuántica, debería buscar criptografía post-cuántica (PQC) como ML-KEM o ML-DSA.

Q: ¿Por qué usar SHA-256 con HKDF?

A: SHA-256 proporciona un alto margen de seguridad y es compatible a nivel mundial. Aunque SHA-3 o BLAKE2 son excelentes, SHA-256 sigue siendo el estándar de la industria para la implementación de HKDF.


Resumen

La transición de RSA a la criptografía de curva elíptica representa un gran salto tanto en seguridad como en eficiencia. Para aplicaciones modernas:

  • Use Ed25519 para firmas digitales.
  • Use X25519 para intercambio de claves.
  • Use HKDF-SHA256 para derivación de claves.
  • Solo use RSA-OAEP/PSS si se requiere estrictamente compatibilidad con sistemas heredados.

Al adoptar estos estándares modernos, se asegura de que su aplicación sea rápida, segura y esté alineada con las mejores prácticas criptográficas actuales.