ChaCha20-Poly1305 es un algoritmo de cifrado autenticado con datos asociados (AEAD) , que combina el cifrado de flujo ChaCha20 con el código de autenticación de mensajes Poly1305 . [1] Tiene un rendimiento de software rápido y, sin aceleración de hardware, suele ser más rápido que AES-GCM . [1] : §B
Los dos bloques de construcción de la construcción, los algoritmos Poly1305 y ChaCha20, fueron diseñados independientemente, en 2005 y 2008, por Daniel J. Bernstein . [2] [3]
En marzo de 2013, se realizó una propuesta al grupo de trabajo TLS de la IETF para incluir Salsa20 , un ganador de la competencia eSTREAM [4] para reemplazar los antiguos conjuntos de cifrados basados en RC4. A continuación, se realizó un debate en la lista de correo de TLS de la IETF con varias sugerencias de mejora, incluido el uso de Chacha20 en lugar de Salsa20 y el uso de un MAC basado en hash universal para el rendimiento. El resultado de este proceso fue la adopción de la propuesta de Adam Langley para una variante del algoritmo ChaCha20 original (que utiliza un contador de 32 bits y un nonce de 96 bits) y una variante del Poly1305 original (que autentica 2 cadenas) que se combinaron en un borrador de la IETF [5] [6] para usarse en TLS y DTLS , [7] y se eligió, por razones de seguridad y rendimiento, como un cifrado recientemente admitido. [8] Poco después de que IETF adoptara TLS, ChaCha20, Poly1305 y el modo combinado AEAD se agregaron a OpenSSH a través del [email protected]
cifrado autenticado [9] [10] pero mantuvieron el contador de 64 bits y el nonce de 64 bits originales para el algoritmo ChaCha20.
En 2015, el algoritmo AEAD se estandarizó en RFC 7539 [11] y en RFC 7634 [12] para su uso en IPsec. Ese mismo año, Cloudflare lo integró como un conjunto de cifrado alternativo. [13]
En 2016, RFC 7905 [14] describe cómo usarlo en los protocolos TLS 1.2 y DTLS 1.2.
En junio de 2018, el RFC 7539 se actualizó y reemplazó por el RFC 8439. [1]
El algoritmo ChaCha20-Poly1305 toma como entrada una clave de 256 bits y un nonce de 96 bits para cifrar un texto simple, [1] con una expansión de texto cifrado de 128 bits (el tamaño de la etiqueta). En la construcción ChaCha20-Poly1305, ChaCha20 se utiliza en modo contador para derivar un flujo de clave que se combina con el texto simple mediante la operación XOR. El texto cifrado y los datos asociados se autentican luego utilizando una variante de Poly1305 que primero codifica las dos cadenas en una. La forma en que se combinan un cifrado y un autenticador de un solo uso es exactamente idéntica a la construcción AES-GCM en la forma en que se utiliza el primer bloque para inicializar el autenticador y cómo se autentica luego el texto cifrado con una etiqueta de 16 bytes.
La principal diferencia externa con ChaCha20 es su tamaño de bloque de 64 bytes (512 bits), en comparación con los 16 bytes (128 bits) de AES-128 y AES-256. El mayor tamaño de bloque permite un mayor rendimiento en las CPU modernas y permite transmisiones más grandes antes de que se desborde el contador de 32 bits.
La construcción XChaCha20-Poly1305 es una variante nonce de 192 bits extendida de la construcción ChaCha20-Poly1305, que utiliza XChaCha20 en lugar de ChaCha20 . Al elegir nonces al azar, la construcción XChaCha20-Poly1305 permite una mayor seguridad que la construcción original. El borrador del intento de estandarizar la construcción expiró en julio de 2020. [15]
Salsa20-Poly1305 y XSalsa20-Poly1305 son variantes de los algoritmos ChaCha20-Poly1305 y XChaCha20-Poly1305, que utilizan Salsa20 y XSalsa20 en lugar de ChaCha20 y XChaCha20. Se implementan en NaCl [16] y libsodium [17], pero no están estandarizados. Las variantes que utilizan ChaCha son las preferidas en la práctica, ya que proporcionan una mejor difusión por ronda que Salsa. [2]
ChaCha20 se puede reemplazar con sus variantes de ronda reducida ChaCha12 y ChaCha8, lo que da como resultado ChaCha12-Poly1305 y ChaCha8-Poly1305. La misma modificación se puede aplicar a XChaCha20-Poly1305. Estas son implementadas por el equipo de RustCrypto y no están estandarizadas. [18]
ChaCha20-Poly1305 se utiliza en IPsec , [1] SSH , [19] TLS 1.2 , DTLS 1.2, TLS 1.3 , [14] [19] WireGuard , [20] S/MIME 4.0 , [21] OTR v4 [22] y otros protocolos, y se implementa en OpenSSL y libsodium . Además, el algoritmo se utiliza en el software de copia de seguridad Borg [23] para proporcionar cifrado de datos estándar y en el sistema de archivos de copia en escritura Bcachefs con el fin de cifrar opcionalmente todo el sistema de archivos. [24]
ChaCha20-Poly1305 suele ofrecer un mejor rendimiento que el algoritmo AES - GCM más frecuente , excepto en sistemas donde las CPU tienen la extensión del conjunto de instrucciones AES-NI [1] . Como resultado, a veces se prefiere ChaCha20-Poly1305 sobre AES-GCM debido a sus niveles similares de seguridad y en ciertos casos de uso que involucran dispositivos móviles , que en su mayoría usan CPU basadas en ARM . Debido a que ChaCha20-Poly1305 tiene menos sobrecarga que AES-GCM, ChaCha20-Poly1305 en dispositivos móviles puede consumir menos energía que AES-GCM.
La construcción ChaCha20-Poly1305 es generalmente segura en el modelo estándar y el modelo de permutación ideal , para la configuración de usuario único y multiusuario. [25] Sin embargo, de manera similar a GCM , la seguridad se basa en la elección de un nonce único para cada mensaje cifrado. En comparación con AES-GCM, las implementaciones de ChaCha20-Poly1305 son menos vulnerables a los ataques de temporización .
Es de destacar que cuando el protocolo SSH utiliza ChaCha20-Poly1305 como primitivo subyacente, es vulnerable al ataque Terrapin .
Para su información, hemos publicado -00 de un borrador que describe cómo funciona el cifrado de flujo Salsa20
ChaCha8Poly1305 / ChaCha12Poly1305 - variantes no estándar de ronda reducida (protegidas por la función Cargo de ronda reducida). Consulte el documento Too Much Crypto para obtener información de fondo y fundamentos sobre cuándo se pueden usar estas construcciones. En caso de duda, prefiera ChaCha20Poly1305. XChaCha8Poly1305 / XChaCha12Poly1305: igual que el anterior, pero con un nonce extendido de 192 bits (24 bytes).