El framework del protocolo Noise
Explore Noise, un framework para crear handshakes criptográficos a medida, utilizado en WireGuard, WhatsApp y Lightning.
El framework del protocolo Noise es una lección gratuita de Cryptology Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cryptology Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cryptology Academy incluye 4 lecciones en total.
Qué es Noise Framework
Noise Protocol Framework (Trevor Perrin, 2016; revisión actual de 2018) es un framework para crear protocolos de canales seguros mediante un conjunto reducido de primitivas y un lenguaje de patrones. En lugar de especificar un único protocolo, Noise define un vocabulario de patrones de handshake que describen la secuencia de operaciones DH y su orden. Cualquier patrón de Noise válido puede instanciarse con funciones DH concretas (Curve25519 o Curve448), de cifrado (AESGCM o ChaChaPoly) y hash (SHA-256, SHA-512, BLAKE2). Noise se utiliza en WireGuard, WhatsApp, Signal (como base de X3DH), Lightning Network e I2P.
Roles y claves de Noise
Cada handshake de Noise tiene un iniciador (I) y un respondedor (R). Cada parte puede tener dos tipos de claves: estática (clave de identidad de larga duración, representada por s/S) y efímera (generada de nuevo para cada sesión, representada por e/E). Las letras minúsculas representan la clave de la parte local; las mayúsculas, la clave pública de la parte remota. Un patrón de Noise especifica qué claves se envían (como texto plano o cifradas) y qué operaciones DH se realizan. Por ejemplo, "e" significa "enviar mi clave pública efímera"; "es" significa "realizar DH(my_ephemeral, remote_static)". Cada salida de DH se mezcla en el estado de hash acumulado del handshake.
Estado simétrico de Noise
El núcleo de Noise es SymmetricState, que mantiene tres valores: ck (chaining key, inicializada con un hash del nombre del protocolo), h (handshake hash, el hash acumulado de la transcripción) y k (clave de cifrado actual). MixKey(input) ejecuta HKDF(ck, input) para actualizar ck y k. MixHash(data) aplica un hash a data y lo incorpora a h. EncryptAndHash(plaintext) cifra con k e incorpora el texto cifrado a h. DecryptAndHash(ciphertext) descifra e incorpora el texto cifrado a h. El hash del handshake h vincula la transcripción: cualquier modificación adversaria de cualquier mensaje cambia h y hace que falle el descifrado. Al final del handshake, Split() produce dos CipherStates independientes para enviar y recibir.
El patrón Noise_XX
Noise_XX es el patrón de autenticación mutua más utilizado. Proporciona autenticación mutua mediante claves estáticas, ya que las claves estáticas de ambas partes se transmiten durante el handshake. Patrón: (1) -> e (el iniciador envía su clave pública efímera). (2) <- e, ee, s, es (el respondedor envía su clave efímera, realiza DH(e,e) y DH(e,s_resp), y envía su clave estática cifrada). (3) -> s, se (el iniciador envía su clave estática cifrada y realiza DH(s_init, e_resp)). Después del paso 3, ambas partes han mezclado tres salidas DH en la clave de sesión: ee (secreto hacia adelante), es (autenticación del servidor) y se (autenticación del cliente). La clave de sesión es independiente de cualquier compromiso de una clave de larga duración que ocurra después de que finalice la sesión.
El patrón Noise_IK (WireGuard)
WireGuard utiliza un patrón derivado de Noise_IK en el que el iniciador conoce de antemano la clave estática del respondedor. (1) -> e, es, s, ss (el iniciador envía su clave efímera, realiza DH(e, S_resp), envía su clave estática cifrada y realiza DH(s_init, S_resp)). (2) <- e, ee, se (el respondedor envía su clave efímera y realiza DH(e_resp, e_init) y DH(e_resp, S_init)). El patrón IK proporciona ocultación de la identidad del iniciador (su clave estática se cifra con la clave estática del respondedor en el paso 1) y finalización en un RTT. WireGuard añade una marca de tiempo dentro de la carga útil cifrada del iniciador para impedir repeticiones. Esto proporciona a WireGuard su característica sencillez: un handshake completo de VPN en dos paquetes UDP.
Hash del handshake y vinculación del canal en Noise
El hash del handshake h al final de un handshake de Noise es un hash de la transcripción que cubre todos los mensajes enviados. Actúa como valor de vinculación del canal: ambas partes calculan el mismo h, y cualquier protocolo de terceros que quiera vincularse a la sesión de Noise puede incluir h como nonce o ID del canal. Esto permite la autenticación compuesta: un paso de autenticación mediante certificados al estilo de TLS puede ejecutarse después del handshake de Noise y vincular el certificado a esa sesión específica mediante h. La vinculación del canal impide ataques de reenvío de credenciales, en los que las credenciales de autenticación de una sesión se repiten contra otra. Split() proporciona h a la aplicación junto con las claves de sesión.
Patrones diferidos y fallback de Noise
Noise admite patrones diferidos para situaciones en las que el iniciador no conoce de antemano la clave estática del respondedor. Noise_NX (el iniciador no tiene una clave estática; el respondedor transmite la suya) es análogo a TLS unidireccional. Noise_XX gestiona el caso en el que ambas partes necesitan intercambiar sus claves. Noise_IK puede recurrir a Noise_XXfallback si la suposición del iniciador sobre la clave estática del respondedor es incorrecta (por ejemplo, después de una rotación de claves). El patrón de fallback permite que el respondedor indique "ha utilizado la clave incorrecta; esta es mi nueva clave pública" sin revelar a observadores externos que se produjo el fallback, manteniendo así la opacidad del protocolo.
Noise en WhatsApp y Signal
WhatsApp y Signal utilizan Noise_XX para establecer canales seguros entre clientes y servidores. El protocolo binario de WhatsApp utiliza Noise_XX con Curve25519, ChaChaPoly y SHA-256. La clave estática del cliente es su clave de identidad de larga duración. Después del handshake de Noise, la capa de aplicación ejecuta autenticación adicional (registro de Signal y verificación del número de teléfono). X3DH (Extended Triple Diffie-Hellman) de Signal realiza cuatro operaciones DH para establecer un secreto compartido entre dos usuarios mediante un intercambio asíncrono de mensajes; no es un patrón estándar de Noise, pero utiliza conceptos similares de mezcla de DH. Después, Double Ratchet se encarga del cifrado continuo de los mensajes.
Noise frente a TLS
Noise y TLS 1.3 abordan el mismo problema (intercambio autenticado de claves) con filosofías diferentes. TLS 1.3 es un único protocolo con conjuntos de cifrado, formatos de certificados (X.509) y extensiones establecidos. Está diseñado para navegadores web y servidores: es un protocolo válido para casi todos los casos. Noise es un framework: no especifica ningún formato de certificado, PKI ni vinculación al transporte. Esto hace que Noise sea más pequeño (toda la implementación de Noise de WireGuard ocupa menos de 400 líneas de código) y más fácil de analizar formalmente, pero requiere que la aplicación gestione la identidad por separado. Noise se prefiere para sistemas cerrados (aplicación-servidor y VPN), donde una PKI sería excesiva; TLS, para sistemas abiertos (la web), donde se necesita interoperabilidad de certificados.
Seguridad formal de Noise
Los patrones de Noise se han analizado formalmente en el modelo de seguridad eCK (extended Canetti-Krawczyk). Kobeissi, Bhargavan y Blanchet analizaron Noise mediante Proverif y obtuvieron demostraciones de autenticación y confidencialidad de las claves para los 12 patrones fundamentales de Noise. Las demostraciones suponen la dificultad estándar de DH (Curve25519) y la seguridad de las funciones AEAD y hash subyacentes. La naturaleza compositiva de Noise (cada DH se mezcla de forma incremental) facilita su análisis frente a protocolos complejos similares a TLS, con muchas transiciones de estado. La verificación criptográfica de Noise proporcionó a WireGuard y WhatsApp un alto nivel de confianza en la seguridad de sus protocolos antes de su implementación.
Implementar Noise correctamente
Errores habituales al implementar Noise: (1) Confusión de patrones: utilizar Noise_IK cuando la clave estática del respondedor no se ha distribuido previamente de forma fiable provoca una discrepancia de identidad (el iniciador podría cifrar silenciosamente para una clave incorrecta). (2) Protección contra repeticiones: Noise proporciona autenticación, pero no protección contra repeticiones de los mensajes de la fase de Transport; deben imponerse nonces (un contador de 64 bits) y el desbordamiento (después de 2^64 mensajes) debe activar una nueva generación de claves. (3) Integridad del prologue: el prologue de Noise (una cadena de bytes mezclada en h antes de que comience el handshake) debe incluir todo el contexto del protocolo (versión y opciones de algoritmos) para impedir ataques de degradación. (4) Uso indebido de PSK: Noise admite extensiones PSK para mezclar claves previamente compartidas; las PSK deben tener una alta entropía, no ser contraseñas de usuario.
Cuestionario sobre Noise Framework
¿Qué significa la notación de patrón de Noise "es" en un patrón de handshake?
Repaso de Noise Framework
Noise es un framework para crear protocolos de intercambio autenticado de claves mediante un lenguaje de patrones de operaciones DH. SymmetricState mantiene la chaining key (ck), el hash de la transcripción (h) y la clave de cifrado (k), actualizados mediante MixKey/MixHash. Noise_XX proporciona autenticación mutua en 1,5 RTT; Noise_IK (WireGuard) se completa en 1 RTT cuando se conoce la clave del respondedor. El hash del handshake h actúa como vinculación del canal. Noise se ha verificado formalmente para todos los patrones principales mediante Proverif. Se prefiere frente a TLS en protocolos de sistemas cerrados (WireGuard y WhatsApp), donde la PKI no es necesaria. Una implementación correcta requiere protección contra repeticiones, integridad del prologue y PSK con alta entropía.
Preguntas frecuentes
¿La lección «El framework del protocolo Noise» es gratis?
Sí — el texto completo de «El framework del protocolo Noise» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cryptology Academy, actualiza a CoddyKit PRO. El curso de Cryptology Academy incluye 4 lecciones en total.
¿Qué aprenderé en «El framework del protocolo Noise»?
Explore Noise, un framework para crear handshakes criptográficos a medida, utilizado en WireGuard, WhatsApp y Lightning. Practicas Cryptology Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Cryptology Academy?
No se requiere experiencia previa. Cryptology Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «El framework del protocolo Noise»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Cryptology Academy?
Sí. Cada lección de Cryptology Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- El protocolo Needham-Schroeder y sus ataques
- Protocolo Station-to-Station (STS)
- El framework del protocolo Noise
- Principios del diseño seguro de protocolos