Validador de reutilización de nonce ChaCha20-Poly1305 | Audita nonces AEAD
Pega una lista de nonces de ChaCha20-Poly1305 (12 bytes) o XChaCha20-Poly1305 (24 bytes) y la herramienta marca cada duplicado, cada entrada con longitud incorrecta y el riesgo de colisión de cumpleaños en una sola pantalla. Pensada para detectar el error que rompe por completo el cifrado AEAD: un nonce reutilizado con la misma clave.
💡 Sobre esta herramienta
En los cifrados AEAD como ChaCha20-Poly1305, el nonce es un "número usado una sola vez", y el nombre no es casualidad. Si reutilizas uno con la misma clave, filtras el flujo de claves de ChaCha20 como el XOR de dos mensajes y, peor aún, expones la clave de autenticación de un solo uso de Poly1305, lo que permite a un atacante falsificar textos cifrados. No es un caso de borde académico: es un incidente que se repite en producción por errores de generación, emisores sin estado y reinicios que reinician los contadores.
Lo difícil es que la reutilización de nonces casi nunca aparece en la revisión de código. Los esquemas aleatorios, basados en contador o derivados de marca de tiempo se ven correctos de forma aislada y luego colisionan entre instancias. Este validador trabaja con la realidad: pega los nonces directamente desde tus registros o exportación de auditoría y enumera los valores duplicados exactos, además de contar por separado las entradas que no cumplen la longitud esperada de 12 o 24 bytes, porque una longitud incorrecta suele indicar un fallo de extracción más que una reutilización.
También calcula la cota de cumpleaños bajo el supuesto de nonces aleatorios: P(colisión) ≈ q² / 2ⁿ⁺¹. Obtienes la probabilidad de colisión para tu conteo actual y el techo de mensajes seguros donde la probabilidad se mantiene por debajo de 2⁻³² y 2⁻⁶⁴. Para entenderlo en términos teóricos: con un nonce de 96 bits, la generación aleatoria cruza un riesgo de colisión relevante cerca de 2³² mensajes por clave, y por eso a los emisores sin estado se les recomienda el nonce de 192 bits de XChaCha20.
🧐 Preguntas Frecuentes
¿El nonce es secreto? ¿Es seguro pegarlo aquí? No, el nonce es un valor público que viaja en claro junto al texto cifrado, no es la clave. Aun así son datos operativos de tus registros, por lo que la herramienta procesa todo dentro de la pestaña del navegador y no envía nada. Al cerrar la pestaña, los datos pegados desaparecen.
¿En qué se diferencian ChaCha20-Poly1305 y XChaCha20-Poly1305? En el tamaño del nonce. ChaCha20-Poly1305 de RFC 8439 usa un nonce de 96 bits (12 bytes). XChaCha20-Poly1305 añade una derivación HChaCha20 para admitir un nonce de 192 bits (24 bytes). Con 192 bits, la generación aleatoria prácticamente nunca colisiona, ideal para emisores que no pueden mantener un contador.
¿Cuándo se marca una entrada como "longitud incorrecta"? Cuando el número de dígitos hex no coincide con la variante elegida (24 caracteres hex para ChaCha20, 48 para XChaCha20) o contiene caracteres no hexadecimales. Las implementaciones AEAD los rechazan de plano, así que una longitud incorrecta suele apuntar a un error de extracción que conviene investigar.
¿Puedo pegar nonces con prefijo 0x o dos puntos?
Sí. El prefijo 0x, los dos puntos, los espacios y los guiones se eliminan automáticamente, y la comparación no distingue mayúsculas. Pega tus líneas de registro tal cual.
¿Qué significa el "conteo de mensajes seguros"? Para nonces aleatorios, es el número máximo de mensajes que puedes enviar con una clave antes de que la probabilidad de colisión cruce el objetivo. Para nonces de 96 bits, el techo de 2⁻³² ronda los 2³² mensajes. A partir de ahí, rota la clave en lugar de confiar en el azar.
¿Funciona con nonces basados en contador (secuenciales)? La detección de duplicados y la verificación de longitud funcionan igual. La cota de cumpleaños asume generación aleatoria, así que con un esquema de contador estricto trata el campo de probabilidad como informativo y céntrate en confirmar cero duplicados.
📚 Datos Curiosos
Los fallos de reutilización de nonce más citados son las colisiones de GCM encontradas en varias pilas TLS y protocolos caseros, y como ChaCha20-Poly1305 comparte la misma forma AEAD, hereda la misma trampa. Por eso el despliegue de QUIC de Google combina ChaCha20-Poly1305 con nonces gestionados por contador estricto en lugar de dejarlo al azar.
La "X" de XChaCha20 significa extended: un paso HChaCha20 amplía el nonce utilizable a 192 bits. libsodium lo popularizó y se convirtió en la respuesta habitual cuando alguien pregunta cómo usar ChaCha20 de forma segura sin gestionar un contador. Lanzar 192 bits aleatorios es sencillamente menos propenso a errores que vigilar una secuencia de 96 bits.