La transición a la criptografía post-cuántica (PQC) es un desafío fundamental en la seguridad de sistemas distribuidos, impulsado por el inminente desarrollo de computadoras cuánticas capaces de romper algoritmos criptográficos asimétricos ampliamente utilizados hoy en día, como RSA y ECC. Este artículo aborda el problema de la adopción de PQC en entornos de ejecución de código en el borde (edge computing) al integrar algoritmos como ML-KEM (Key Encapsulation Mechanism) y ML-DSA (Digital Signature Algorithm) directamente en la API Web Crypto de Cloudflare Workers.
La necesidad de esta integración surge de la dificultad para los desarrolladores de JavaScript de experimentar y desplegar PQC de manera eficiente. Anteriormente, la única opción era incluir implementaciones criptográficas voluminosas en JavaScript o WebAssembly, lo que aumentaba el tamaño de las aplicaciones y la carga de mantenimiento. Al proporcionar estas primitivas a nivel de runtime, se reduce la fricción para la migración, permitiendo a los ingenieros Staff+ y Arquitectos comenzar a validar sus integraciones PQC en protocolos como TLS, SSH, HPKE y JWTs, un paso crítico para asegurar la infraestructura digital contra futuras amenazas cuánticas.
Arquitectura del Sistema
La implementación de soporte PQC en Cloudflare Workers se basa en el runtime workerd, un entorno de ejecución de código abierto construido sobre V8. La arquitectura implica extender la capa Web Crypto de workerd para exponer las nuevas primitivas criptográficas. Estas primitivas, específicamente ML-KEM (Kyber) y ML-DSA (Dilithium), son respaldadas por la biblioteca criptográfica BoringSSL, que ya incluye soporte para estos algoritmos post-cuánticos.
La integración se realiza a través de nuevas funciones en SubtleCrypto, como generateKey(), encapsulateBits(), decapsulateBits(), sign(), verify(), y getPublicKey(), que ahora aceptan identificadores de algoritmos PQC (ej., 'ML-KEM-768', 'ML-DSA-44'). Para garantizar la interoperabilidad y la evolución de la especificación, la funcionalidad está inicialmente protegida por un 'compatibility flag' (webcrypto_modern_algorithms) en la configuración de Workers. Esto permite a los desarrolladores optar por usar las nuevas APIs mientras la especificación de 'Modern Algorithms in the Web Cryptography API' madura. La implementación también incluye la adición de Web Platform Tests y pruebas específicas de Workers para validar el comportamiento de los 'compatibility flags' y las definiciones de TypeScript para los nuevos tipos de Workers.
Flujo de Intercambio de Claves con ML-KEM
- 1 Generar Claves Cliente A genera par de claves ML-KEM (pública/privada).
- 2 Compartir Clave Pública Cliente A envía clave pública a Cliente B.
- 3 Encapsular Secreto Cliente B usa clave pública de A para encapsular un secreto compartido y gene...
- 4 Enviar Ciphertext Cliente B envía el ciphertext a Cliente A.
- 5 Decapsular Secreto Cliente A usa su clave privada y el ciphertext para decapsular el secreto com...
- 6 Secreto Compartido Ambos clientes poseen el mismo secreto compartido para derivar claves simétri...
Flujo de Firma Digital con ML-DSA
- 1 Generar Claves Firmante genera par de claves ML-DSA (pública/privada).
- 2 Firmar Datos Firmante usa clave privada para firmar un mensaje o datos.
- 3 Enviar Firma y Datos Firmante envía el mensaje original y la firma al Verificador.
- 4 Verificar Firma Verificador usa la clave pública del firmante, el mensaje y la firma para ver...
- 5 Resultado de Verificación Verificador confirma la validez de la firma.
| Capa | Tecnología | Justificación |
|---|---|---|
| compute | Cloudflare Workers | Plataforma de ejecución de código en el borde que expone las nuevas APIs criptográficas post-cuánticas a través de Web Crypto. compatibility_flags: ["webcrypto_modern_algorithms"] |
| security | Web Crypto API | Interfaz estándar de JavaScript para operaciones criptográficas, extendida para incluir algoritmos PQC. vs Bundling JavaScript/WebAssembly cryptographic libraries |
| security | ML-KEM (Kyber) | Algoritmo de encapsulación de claves (KEM) resistente a ataques cuánticos, utilizado para establecer secretos compartidos. vs RSA-KEM, ECDH ML-KEM-768, ML-KEM-1024 |
| security | ML-DSA (Dilithium) | Algoritmo de firma digital resistente a ataques cuánticos, utilizado para autenticación y no repudio. vs ECDSA, Ed25519 ML-DSA-44, ML-DSA-65, ML-DSA-87 |
| security | BoringSSL | Biblioteca criptográfica subyacente que proporciona las implementaciones de bajo nivel para ML-KEM y ML-DSA en `workerd`. vs OpenSSL, LibreSSL |
| compute | workerd | Runtime de código abierto de Cloudflare, basado en V8, que aloja la implementación de Web Crypto y sus extensiones PQC. |
Trade-offs
Ganancias
- ▲ Reducción del tamaño de la aplicación
- ▲ Mejora del rendimiento de operaciones criptográficas PQC
- ▲ Simplificación del desarrollo y mantenimiento de PQC
- ▲▲ Preparación para la era post-cuántica
Costes
- ▲ Mayor tamaño de claves públicas, firmas y ciphertexts PQC
- △ Dependencia de la disponibilidad de la API en el runtime (requiere 'compatibility flag')
const keys = await crypto.subtle.generateKey("ML-KEM-768", true, [
"encapsulateBits",
"decapsulateBits",
]);
const { sharedKey, ciphertext } = await crypto.subtle.encapsulateBits(
"ML-KEM-768",
keys.publicKey,
);
const sameSharedKey = await crypto.subtle.decapsulateBits(
"ML-KEM-768",
keys.privateKey,
ciphertext,
);const data = new TextEncoder().encode("hello post-quantum");
const { publicKey, privateKey } = await crypto.subtle.generateKey(
"ML-DSA-44",
false,
["sign", "verify"],
);
const signature = await crypto.subtle.sign("ML-DSA-44", privateKey, data);
const valid = await crypto.subtle.verify(
"ML-DSA-44",
publicKey,
signature,
data,
);if (SubtleCrypto.supports("sign", "ML-DSA-44")) {
const keys = await crypto.subtle.generateKey("ML-DSA-44", false, [
"sign",
"verify",
]);
}Fundamentos Teóricos
La integración de ML-KEM y ML-DSA en Web Crypto se conecta directamente con décadas de investigación en criptografía de clave pública y, más recientemente, con el campo de la criptografía post-cuántica. ML-KEM (anteriormente conocido como Kyber) y ML-DSA (anteriormente conocido como Dilithium) son algoritmos basados en retículos (lattice-based cryptography), una rama de la criptografía que ha sido objeto de intensa investigación académica desde los años 90. Estos algoritmos fueron seleccionados por el NIST (National Institute of Standards and Technology) como parte de su proceso de estandarización de PQC, tras años de evaluación de propuestas de la comunidad académica.
El concepto de 'Key Encapsulation Mechanism' (KEM) como ML-KEM se basa en el trabajo de Diffie y Hellman (1976) sobre el intercambio de claves, pero adaptado para resistir ataques cuánticos. Los algoritmos de firma digital como ML-DSA se fundamentan en principios similares a los de RSA y DSA, pero utilizan problemas matemáticos diferentes que se cree son intratables incluso para computadoras cuánticas. La adopción de estos algoritmos en un entorno de ejecución como Web Crypto es una manifestación práctica de la investigación teórica en criptografía de retículos, que se remonta a trabajos seminales como el de Ajtai (1996) sobre funciones hash basadas en retículos y el de Hoffstein, Pipher y Silverman (1998) con el algoritmo NTRU, uno de los primeros esquemas de criptografía de retículos. La implementación en Workers permite que los principios académicos se traduzcan en herramientas de seguridad concretas para la web.