Salsa20 (anteriormente conocido como Snuffle 2005 [ 4 ] ) y ChaCha , estrechamente relacionado, son cifradores de flujo desarrollados por Daniel J. Bernstein . Salsa20, el cifrador original, fue diseñado en 2005 y posteriormente presentado por Bernstein al proceso de validación criptográfica eSTREAM de la Unión Europea. ChaCha es una modificación de Salsa20 publicada en 2008. Utiliza una nueva función de ronda que aumenta la difusión y mejora el rendimiento en algunas arquitecturas. [ 5 ]
Ambos cifrados se basan en una función pseudoaleatoria basada en operaciones de suma, rotación y XOR (ARX): suma de 32 bits, suma bit a bit (XOR) y operaciones de rotación . La función principal asigna una clave de 256 bits , un nonce de 64 bits y un contador de 64 bits a un bloque de 512 bits del flujo de claves (también existe una versión Salsa con una clave de 128 bits). Esto otorga a Salsa20 y ChaCha la ventaja inusual de que el usuario puede acceder de manera eficiente a cualquier posición en el flujo de claves en tiempo constante. Salsa20 ofrece velocidades de alrededor de 4 a 14 ciclos por byte en software en procesadores x86 modernos [ 6 ] y un rendimiento de hardware razonable. No está patentado y Bernstein ha escrito varias implementaciones de dominio público optimizadas para arquitecturas comunes [ 7 ] .
Estructura
Internamente, el cifrado utiliza la suma bit a bit ⊕ ( OR exclusivo ), la suma de 32 bits módulo 2 32 ⊞ y operaciones de rotación de distancia constante <<< sobre un estado interno de dieciséis palabras de 32 bits. El uso exclusivo de operaciones de suma, rotación y XOR evita la posibilidad de ataques de temporización en las implementaciones de software. El estado interno está compuesto por dieciséis palabras de 32 bits dispuestas como una matriz de 4×4.
El estado inicial se compone de ocho palabras de clave ( ), dos palabras de posición de flujo ( ), dos palabras de nonce (esencialmente bits de posición de flujo adicionales) ( ), y cuatro palabras fijas ( ):
Las palabras constantes deletrean "expand 32-byte k" en ASCII (es decir, las 4 palabras son "expa", "nd 3", "2-by" y "te k") como un número oculto . La operación principal en Salsa20 es el cuarto de ronda QR(a, b, c, d)que toma una entrada de cuatro palabras y produce una salida de cuatro palabras:
b ^= (a + d) <<< 7; c ^= (b + a) <<< 9; d ^= (c + b) <<< 13; a ^= (d + c) <<< 18;
Las rondas impares se aplican QR(a, b, c, d)a cada una de las cuatro columnas de la matriz de 4×4, y las rondas pares se aplican a cada una de las cuatro filas. Dos rondas consecutivas (una ronda de columna y una ronda de fila) juntas se denominan ronda doble:
// Ronda impar QR( 0, 4, 8, 12) // columna 1 QR( 5, 9, 13, 1) // columna 2 QR(10, 14, 2, 6) // columna 3 QR(15, 3, 7, 11) // columna 4 // Redondo par QR( 0, 1, 2, 3) // fila 1 QR( 5, 6, 7, 4) // fila 2 QR(10, 11, 8, 9) // fila 3 QR(15, 12, 13, 14) // fila 4
A continuación se muestra una implementación en C/C++.
#include <stdint.h> #define ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) #define QR(a, b, c, d)( \ b ^= ROTL(a + d, 7), \ c ^= ROTL(b + a, 9), \ d ^= ROTL(c + b,13), \ a ^= ROTL(d + c,18)) #define ROUNDS 20void salsa20_block ( uint32_t out [ 16 ], uint32_t const in [ 16 ]) { int i ; uint32_t x [ 16 ];for ( i = 0 ; i < 16 ; ++ i ) x [ i ] = in [ i ]; // 10 bucles × 2 rondas/bucle = 20 rondas for ( i = 0 ; i < ROUNDS ; i += 2 ) { // Ronda impar QR ( x [ 0 ], x [ 4 ], x [ 8 ], x [ 12 ]); // columna 1 QR ( x [ 5 ], x [ 9 ], x [ 13 ], x [ 1 ]); // columna 2 QR ( x [ 10 ], x [ 14 ], x [ 2 ], x [ 6 ]); // columna 3 QR ( x [ 15 ], x [ 3 ], x [ 7 ], x [ 11 ]); // columna 4 // Redondo par QR ( x [ 0 ], x [ 1 ], x [ 2 ], x [ 3 ]); // fila 1 QR ( x [ 5 ], x [ 6 ], x [ 7 ], x [ 4 ]); // fila 2 QR ( x [ 10 ], x [ 11 ], x [ 8 ], x [ 9 ]); // fila 3 QR ( x [ 15 ], x [ 12 ], x [ 13 ], x [ 14 ]); // fila 4 } para ( i = 0 ;i < 16 ; ++ i ) out [ i ] = x [ i ] + in [ i ]; }En la última línea, la matriz mixta se añade, palabra por palabra, a la matriz original para obtener su bloque de clave de 64 bytes. Esto es importante porque las rondas de mezcla son invertibles por sí solas . En otras palabras, aplicar las operaciones inversas produciría la matriz original de 4×4, incluyendo la clave. Añadir la matriz mixta a la original imposibilita la recuperación de la entrada. (Esta misma técnica se utiliza ampliamente en funciones hash desde MD4 hasta SHA-2 ).
Salsa20 realiza 20 rondas de mezcla en su entrada. [ 1 ] Sin embargo, también se han introducido variantes con menos rondas, Salsa20/8 y Salsa20/12, que utilizan 8 y 12 rondas respectivamente. Estas variantes se introdujeron para complementar el Salsa20 original, no para reemplazarlo, y ofrecen un mejor rendimiento [ nota 1 ] en las pruebas comparativas de eSTREAM que Salsa20, aunque con un margen de seguridad correspondientemente menor.
XSalsa20 con nonce de 192 bits
En 2008, Bernstein propuso una variante de Salsa20 con nonces de 192 bits llamada XSalsa20. [ 8 ] [ 9 ] [ 10 ] XSalsa20 es demostrablemente seguro si Salsa20 es seguro, pero es más adecuado para aplicaciones donde se desean nonces más largos. XSalsa20 introduce la clave y los primeros 128 bits del nonce en un bloque de Salsa20 (sin la suma final, que puede omitirse o restarse después de un bloque Salsa20 estándar), y utiliza 256 bits de la salida como clave para Salsa20 estándar utilizando los últimos 64 bits del nonce y la posición del flujo. Específicamente, los 256 bits de salida utilizados son los que corresponden a las partes no secretas de la entrada: índices 0, 5, 10, 15, 6, 7, 8 y 9.
Selección eSTREAM de Salsa20
Salsa20/12 ha sido seleccionado como diseño de Fase 3 para el Perfil 1 (software) por el proyecto eSTREAM , recibiendo la puntuación de votación ponderada más alta de cualquier algoritmo del Perfil 1 al final de la Fase 2. [ 11 ] Salsa20 había sido previamente seleccionado como diseño Focus de Fase 2 para el Perfil 1 (software) y como diseño de Fase 2 para el Perfil 2 (hardware) por el proyecto eSTREAM, [ 12 ] pero no avanzó a la Fase 3 para el Perfil 2 porque eSTREAM consideró que probablemente no era un buen candidato para entornos de hardware con recursos extremadamente limitados. [ 13 ]
El comité eSTREAM recomienda el uso de Salsa20/12, la variante de 12 cartuchos, por "combinar un rendimiento muy bueno con un margen de seguridad cómodo". [ 14 ]
Criptoanálisis de Salsa20
A partir de 2015, no hay ataques publicados sobre Salsa20/12 o el Salsa20/20 completo; el mejor ataque conocido [ 3 ] rompe 8 de las 12 o 20 rondas.
En 2005, Paul Crowley informó de un ataque a Salsa20/5 con una complejidad temporal estimada de 2 165 y ganó el premio de Bernstein de 1000 dólares estadounidenses por el "criptoanálisis de Salsa20 más interesante". [ 15 ] Este ataque y todos los ataques posteriores se basan en el criptoanálisis diferencial truncado . En 2006, Fischer, Meier, Berbain, Biasse y Robshaw informaron de un ataque a Salsa20/6 con una complejidad temporal estimada de 2 177 y un ataque de clave relacionada a Salsa20/7 con una complejidad temporal estimada de 2 217. [ 16 ]
En 2007, Tsunoo et al. anunciaron un criptoanálisis de Salsa20 que rompe 8 de 20 rondas para recuperar la clave secreta de 256 bits en 2 255 operaciones, utilizando 2 11,37 pares de secuencias de claves. [ 17 ] Sin embargo, este ataque no parece ser competitivo con el ataque de fuerza bruta.
En 2008, Aumasson, Fischer, Khazaei, Meier y Rechberger informaron de un ataque criptoanalítico contra Salsa20/7 con una complejidad temporal de 2¹⁵¹ y de un ataque contra Salsa20/8 con una complejidad temporal estimada de 2²⁵¹ . Este ataque utiliza el nuevo concepto de bits de clave neutrales probabilísticos para la detección probabilística de un diferencial truncado. El ataque puede adaptarse para romper Salsa20/7 con una clave de 128 bits. [ 3 ]
En 2012, el ataque de Aumasson et al. fue mejorado por Shi et al. contra Salsa20/7 (clave de 128 bits) a una complejidad temporal de 2 109 y Salsa20/8 (clave de 256 bits) a 2 250 . [ 18 ]
En 2013, Mouha y Preneel publicaron una prueba [ 19 ] de que 15 rondas de Salsa20 eran seguras a 128 bits contra el criptoanálisis diferencial . (Específicamente, no tiene ninguna característica diferencial con una probabilidad mayor que 2 −130 , por lo que el criptoanálisis diferencial sería más difícil que el agotamiento de la clave de 128 bits).
En 2025, Dey et al. informaron de un ataque criptoanalítico contra Salsa20/8 con una complejidad temporal de 2 245,84 y datos que ascienden a 2 99,47 . [ 20 ]
Variante ChaCha
En 2008, Bernstein publicó la familia de cifrados ChaCha , estrechamente relacionada , que busca aumentar la difusión por ronda al tiempo que logra el mismo rendimiento o uno ligeramente mejor. [ 21 ] El artículo de Aumasson et al. también ataca ChaCha, logrando una ronda menos (para ChaCha6 de 256 bits con complejidad 2 139 , ChaCha7 con complejidad 2 248 y ChaCha6 de 128 bits dentro de 2 107 ) pero afirma que el ataque no logra romper ChaCha7 de 128 bits. [ 3 ]
Al igual que Salsa20, el estado inicial de ChaCha incluye una constante de 128 bits, una clave de 256 bits, un contador de 64 bits y un nonce de 64 bits (en la versión original; como se describe más adelante, una versión de ChaCha de RFC 7539 es ligeramente diferente), organizados como una matriz de 4×4 de palabras de 32 bits. [ 21 ] Pero ChaCha reorganiza algunas de las palabras en el estado inicial:
La constante es la misma que Salsa20 ("expandir k de 32 bytes"). ChaCha reemplaza el cuarto de ronda de Salsa20 QR(a, b, c, d)con:
a += b; d ^= a; d <<<= 16; c += d; b ^= c; b <<<= 12; a += b; d ^= a; d <<<= 8; c += d; b ^= c; b <<<= 7;
Nótese que esta versión actualiza cada palabra dos veces, mientras que el cuarto de ronda de Salsa20 actualiza cada palabra solo una vez. Además, el cuarto de ronda de ChaCha difunde los cambios más rápidamente. En promedio, después de cambiar 1 bit de entrada, el cuarto de ronda de Salsa20 cambiará 8 bits de salida, mientras que ChaCha cambiará 12,5 bits de salida. [ 5 ]
La ronda de cuartos de ChaCha tiene el mismo número de sumas, xors y rotaciones de bits que la ronda de cuartos de Salsa20, pero el hecho de que dos de las rotaciones sean múltiplos de 8 permite una pequeña optimización en algunas arquitecturas, incluida la x86. [ 22 ] Además, el formato de entrada se ha reorganizado para admitir una optimización de implementación SSE eficiente descubierta para Salsa20. En lugar de alternar rondas hacia abajo por columnas y a través de filas, se realizan hacia abajo por columnas y a lo largo de diagonales. [ 5 ] : 4 Al igual que Salsa20, ChaCha organiza las dieciséis palabras de 32 bits en una matriz de 4×4. Si indexamos los elementos de la matriz de 0 a 15
Entonces, una ronda doble en ChaCha es:
// Ronda impar QR(0, 4, 8, 12) // columna 1 QR(1, 5, 9, 13) // columna 2 QR(2, 6, 10, 14) // columna 3 QR(3, 7, 11, 15) // columna 4 // Redondo par QR(0, 5, 10, 15) // diagonal 1 (diagonal principal) QR(1, 6, 11, 12) // diagonal 2 QR(2, 7, 8, 13) // diagonal 3 QR(3, 4, 9, 14) // diagonal 4
ChaCha20 utiliza 10 iteraciones de la ronda doble. [ 23 ] A continuación se muestra una implementación en C/C++.
#include <stdint.h> #define ROTL(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) #define QR(a, b, c, d) ( \ a += b, d ^= a, d = ROTL(d, 16), \ c += d, b ^= c, b = ROTL(b, 12), \ a += b, d ^= a, d = ROTL(d, 8), \ c += d, b ^= c, b = ROTL(b, 7)) #define ROUNDS 20void chacha_block ( uint32_t out [ 16 ], uint32_t const in [ 16 ]) { int i ; uint32_t x [ 16 ];for ( i = 0 ; i < 16 ; ++ i ) x [ i ] = in [ i ]; // 10 bucles × 2 rondas/bucle = 20 rondas for ( i = 0 ; i < ROUNDS ; i += 2 ) { // Ronda impar QR ( x [ 0 ], x [ 4 ], x [ 8 ], x [ 12 ]); // columna 1 QR ( x [ 1 ], x [ 5 ], x [ 9 ], x [ 13 ]); // columna 2 QR ( x [ 2 ], x [ 6 ], x [ 10 ], x [ 14 ]); // columna 3 QR ( x [ 3 ], x [ 7 ], x [ 11 ], x [ 15 ]); // columna 4 // Redondo par QR ( x [ 0 ], x [ 5 ], x [ 10 ], x [ 15 ]); // diagonal 1 (diagonal principal) QR ( x [ 1 ], x [ 6 ], x [ 11 ], x [ 12 ]); // diagonal 2 QR ( x [ 2 ], x [ 7 ], x [ 8 ], x [ 13 ]); // diagonal 3 QR ( x [ 3 ], x [ 4 ], x [ 9 ], x [ 14 ]); // diagonal 4 } para ( i =0 ; i < 16 ; ++ i ) out [ i ] = x [ i ] + in [ i ]; }ChaCha es la base de la función hash BLAKE , finalista en la competición de funciones hash del NIST , y de sus sucesoras más rápidas, BLAKE2 y BLAKE3. También define una variante que utiliza dieciséis palabras de 64 bits (1024 bits de estado), con constantes de rotación ajustadas en consecuencia.
XChaCha
Aunque Bernstein no lo anunció, la prueba de seguridad de XSalsa20 se extiende directamente a un cifrado XChaCha análogo . Se utiliza la clave y los primeros 128 bits del nonce (en las palabras de entrada 12 a 15) para formar un bloque de entrada ChaCha, y luego se realiza la operación de bloque (omitiendo la suma final). Las palabras de salida 0-3 y 12-15 (aquellas palabras que corresponden a palabras no clave de la entrada) forman la clave utilizada para el ChaCha ordinario (con los últimos 64 bits del nonce y 64 bits del contador de bloque). [ 24 ]
ChaCha de tamaño reducido
Aumasson argumenta en 2020 que 8 rondas de ChaCha (ChaCha8) probablemente proporcionan suficiente resistencia al criptoanálisis futuro para el mismo nivel de seguridad , lo que resulta en una aceleración de 2,5×. [ 25 ] Un compromiso ChaCha12 (basado en la recomendación de eSTREAM de un Salsa de 12 rondas) [ 26 ] también se utiliza. [ 27 ] El conjunto de pruebas de rendimiento de eSTREAM incluye ChaCha8 y ChaCha12. [ 21 ]
Adopción de ChaCha20
Google seleccionó ChaCha20 junto con el código de autenticación de mensajes Poly1305 de Bernstein en SPDY , que estaba destinado a reemplazar a TLS sobre TCP . [ 28 ] En el proceso, propusieron una nueva construcción de cifrado autenticado que combina ambos algoritmos, que se llama ChaCha20-Poly1305 . ChaCha20 y Poly1305 se utilizan ahora en el protocolo QUIC , que reemplaza a SPDY y es utilizado por HTTP/3 . [ 29 ] [ 30 ]
Poco después de que Google adoptara TLS, los algoritmos ChaCha20 y Poly1305 también se utilizaron para un nuevo chacha20-poly1305@openssh.comcifrado en OpenSSH . [ 31 ] [ 32 ] Posteriormente, esto permitió que OpenSSH evitara cualquier dependencia de OpenSSL , mediante una opción de compilación. [ 33 ]
ChaCha20 también se utiliza para el arc4randomgenerador de números aleatorios en los sistemas operativos FreeBSD , [ 34 ] OpenBSD , [ 35 ] y NetBSD, [ 36 ] en lugar del RC4 defectuoso , y en DragonFly BSD [ 37 ] para la subrutina CSPRNG del kernel. [ 38 ] [ 39 ] A partir de la versión 4.8, el kernel de Linux utiliza el algoritmo ChaCha20 para generar datos para el dispositivo no bloqueante /dev/urandom . [ 40 ] [ 41 ] [ 42 ] ChaCha8 se utiliza para el PRNG predeterminado en Golang . [ 43 ] El CSPRNG de Rust utiliza ChaCha12. [ 26 ]
ChaCha20 suele ofrecer un mejor rendimiento que el algoritmo de cifrado avanzado (AES), más extendido, en sistemas donde la CPU no cuenta con aceleración AES (como el conjunto de instrucciones AES para procesadores x86). Por consiguiente, ChaCha20 a veces se prefiere a AES en ciertos casos de uso que involucran dispositivos móviles , que en su mayoría utilizan CPU basadas en ARM . [ 44 ] [ 45 ] Los aceleradores de hardware especializados para ChaCha20 también son menos complejos en comparación con los aceleradores AES. [ 46 ]
ChaCha20-Poly1305 (versión IETF; véase más abajo) es el algoritmo exclusivo utilizado por el sistema VPN WireGuard , a partir de la versión 1 del protocolo. [ 47 ]
Adiantum (cifrado) utiliza XChaCha12. [ 48 ]
Estándares de Internet
Se ha publicado una referencia de implementación para ChaCha20 en RFC 7539. La implementación del IETF modificó el algoritmo publicado por Bernstein cambiando el nonce de 64 bits y el contador de bloques de 64 bits a un nonce de 96 bits y un contador de bloques de 32 bits. [ 49 ] El nombre no se cambió cuando se modificó el algoritmo, ya que es criptográficamente insignificante (ambos forman lo que un criptógrafo reconocería como un nonce de 128 bits), pero el cambio de interfaz podría ser una fuente de confusión para los desarrolladores. Debido al contador de bloques reducido, la longitud máxima del mensaje que se puede cifrar de forma segura con la variante del IETF es de 2 32 bloques de 64 bytes (256 GiB ). Para aplicaciones donde esto no es suficiente, como el cifrado de archivos o discos, RFC 7539 propone usar el algoritmo original con un nonce de 64 bits.
El uso de ChaCha20 en IKE e IPsec se ha estandarizado en el RFC 7634. La estandarización de su uso en TLS se publica en el RFC 7905 .
En 2018, el RFC 7539 fue reemplazado por el RFC 8439. El RFC 8439 incorpora algunas erratas y añade consideraciones de seguridad adicionales. [ 50 ]
Véase también
- Speck : un cifrado de suma, rotación y XOR desarrollado por la NSA.
- ChaCha20-Poly1305 : un esquema AEAD que combina ChaCha20 con la MAC Poly1305.
Notas
- ↑ Dado que la mayor parte del trabajo consiste en realizar las rondas repetidas, el número de rondas es inversamente proporcional al rendimiento. Es decir, reducir a la mitad el número de rondas prácticamente duplica el rendimiento. Por lo tanto, las variantes con menos rondas son considerablemente más rápidas.
Referencias
- 1 2 Daniel J. Bernstein (24-12-2007). "La familia de cifradores de flujo Salsa20" ( PDF) . cr.yp.to.
- ↑ Daniel J. Bernstein (16 de mayo de 2013). "Velocidad de Salsa 20; software Salsa20" .
- 1 2 3 4 Jean-Philippe Aumasson; Simon Fischer; Shahram Khazaei; Willi Meier; Christian Rechberger (14 de marzo de 2008). "Nuevas características de los bailes latinos" (PDF) . Asociación Internacional para la Investigación Criptológica .
- ↑ Bernstein, Daniel J. (27-04-2005). "Diseño de Salsa20" (PDF) . Recuperado el 27-02-2026 .
- 1 2 3 4 Bernstein, Daniel (28 de enero de 2008), ChaCha, una variante de Salsa20 (PDF) , consultado el 3 de junio de 2018
- ↑ Daniel J. Bernstein (16 de mayo de 2013). "Snuffle 2005: la función de cifrado Salsa20" .
- ↑ "Salsa20: Velocidad del software" . 11 de mayo de 2007.
- ↑ Daniel J. Bernstein. "Ampliación del nonce Salsa20 (actualizado en 2011)" (PDF) . cr.yp.to. Consultado el 18 de agosto de 2022 .
- ↑ Daniel J. Bernstein. "Ampliando el nonce Salsa20 (versión original)" (PDF) . cr.yp.to. Consultado el 18 de agosto de 2022 .
- ↑ "Salsa20/12" . ECRYPT II . Archivado del original el 26 de febrero de 2018. Consultado el 22 de agosto de 2017 .
- ↑ "El proyecto eSTREAM: Fin de la fase 2" . eSTREAM . 29 de abril de 2008. Archivado del original el 9 de julio de 2016. Consultado el 19 de abril de 2007 .
- ↑ Hongjun Wu (30 de marzo de 2007). "eSTREAM FASE 3: Fin de la Fase 1" . eSTREAM. Archivado del original el 3 de marzo de 2016. Consultado el 30 de marzo de 2006 .
- ↑ "eSTREAM: Informe breve sobre el final de la segunda fase" (PDF) . eSTREAM. 26 de marzo de 2007. Archivado del original (PDF) el 9 de abril de 2016. Consultado el 19 de abril de 2007 .
- ↑ «Salsa20/12, La página del portafolio eSTREAM» . www.ecrypt.eu.org .
- ↑ Paul Crowley (09-02-2006). "Criptoanálisis diferencial truncado de cinco rondas de Salsa20" .
- ↑ Simon Fischer; Willi Meier; Côme Berbain; Jean-François Biasse; MJB Robshaw (2006). "No aleatoriedad en los candidatos eSTREAM Salsa20 y TSC-4". Progress in Cryptology - INDOCRYPT 2006: 7.ª Conferencia Internacional sobre Criptología en India, Calcuta, India, 11-13 de diciembre de 2006, Actas . Lecture Notes in Computer Science. Vol. 4329. pp. 2–16 . CiteSeerX 10.1.1.121.7248 . doi : 10.1007/11941378_2 . ISBN 978-3-540-49767-7.
- ↑ Yukiyasu Tsunoo; Teruo Saito; Hiroyasu Kubo; Tomoyasu Suzaki; Hiroki Nakashima (2 de enero de 2007). «Criptoanálisis diferencial de Salsa20/8» (PDF) . ECRIPTA . Archivado desde el original (PDF) el 25 de febrero de 2021 . Consultado el 11 de enero de 2010 .
- ↑ Zhenqing Shi; Bin Zhang; Dengguo Feng; Wenling Wu (2012). "Ataques mejorados de recuperación de claves en Salsa20 y ChaCha de ronda reducida". Seguridad de la información y criptología – ICISC 2012. Notas de clase en ciencias de la computación. Vol. 7839. págs. 337–351 . doi : 10.1007/978-3-642-37682-5_24 . ISBN 978-3-642-37681-8.
- ↑ Nicky Mouha; Bart Preneel (2013). "Hacia la búsqueda de características diferenciales óptimas para ARX: aplicación a Salsa20" (PDF) . Asociación Internacional para la Investigación Criptológica .
- ^ Dey, Sabyasachi; Maitra, Subhamoy; Sarkar, Santanu; Sharma, Nitin Kumar (2025). "Criptoanálisis significativamente mejorado de Salsa20 con criterios de dos rondas" . Archivo ePrint de criptología .
- 1 2 3 Daniel J. Bernstein (25-04-2008). "La familia ChaCha de cifradores de flujo" .
- ↑ Neves, Samuel (2009-10-07), Implementaciones más rápidas de ChaCha para procesadores Intel , archivado del original el 28-03-2017 , recuperado el 07-09-2016 ,
dos de estas constantes son múltiplos de 8; esto permite una rotación de 1 instrucción en las CPU Core2 y posteriores de Intel usando la
instrucción
pshufb
- ↑ Y. Nir; A. Langley (mayo de 2015). "ChaCha20 y Poly1305 para protocolos IETF: RFC 7539" .
- ↑ Arciszewski, Scott (10 de enero de 2020). "XChaCha: ChaCha con nonce extendido y AEAD_XChaCha20_Poly1305 (borrador de Internet caducado)" . Ietf Datatracker .
- ↑ Aumasson, Jean-Philippe (2020). Demasiadas criptomonedas (PDF) . Simposio de Criptomonedas del Mundo Real.
- 1 2 "rand_chacha: considerar ChaCha12 (o posiblemente ChaCha8) en lugar de ChaCha20 · Problema #932 · rust-random/rand" . GitHub .
- ↑ "ChaCha" . Introducción a la criptografía .
- ↑ "Haz el ChaCha: mejor rendimiento móvil con criptografía" . El blog de Cloudflare . 23 de febrero de 2015. Consultado el 13 de julio de 2021 .
- ↑ Thomson, Martin; Turner, Sean (mayo de 2021). "RFC 9001" . datatracker.ietf.org . Consultado el 13 de julio de 2021 .
- ↑ Bishop, Mike (2 de febrero de 2021). "borrador: IETF QUIC HTTP" . datatracker.ietf.org . Recuperado el 13 de julio de 2021 .
- ↑ Miller, Damien (2016-05-03). "ssh/PROTOCOL.chacha20poly1305" . Referencia cruzada de BSD para superusuarios: PROTOCOL.chacha20poly1305 . Recuperado el 2016-09-07 .
- ↑ Murenin, Constantine A. (11 de diciembre de 2013). Unknown Lamer (ed.). "OpenSSH tiene un nuevo cifrado: Chacha20-poly1305, de DJ Bernstein" . Slashdot . Consultado el 7 de septiembre de 2016 .
- ↑ Murenin, Constantine A. (30 de abril de 2014). Soulskill (ed.). "OpenSSH ya no tiene que depender de OpenSSL" . Slashdot . Recuperado el 7 de septiembre de 2016 .
- ↑ "Revisión 317015" . 16/04/2017 . Consultado el 16/03/2018 .
Reemplazar el algoritmo RC4 para generar números aleatorios seguros en el núcleo con Chacha20.
- ↑ guenther (Philip Guenther), ed. (13-09-2015). "libc/crypt/arc4random.c" . Referencia cruzada de Super User's BSD: arc4random.c . Recuperado el 07-09-2016 .
Generador de números aleatorios basado en ChaCha para OpenBSD.
- ↑ riastradh (Taylor Campbell), ed. (25-03-2016). "libc/gen/arc4random.c" . Referencia cruzada de Super User's BSD: arc4random.c . Recuperado el 07-09-2016 .
API arc4random(3) heredada de OpenBSD reimplementada usando ChaCha20 PRF, con estado por hilo.
- ↑ "kern/subr_csprng.c" . Referencia cruzada BSD del superusuario: subr_csprng.c . 4 de noviembre de 2015. Consultado el 7 de septiembre de 2016 .
chacha_encrypt_bytes - ↑ "Uso e implementación de ChaCha" . 7 de septiembre de 2016. Consultado el 7 de septiembre de 2016 .
- ↑ "arc4random(3)" . Páginas del manual de NetBSD . 16 de noviembre de 2014. Archivado del original el 6 de julio de 2020. Consultado el 7 de septiembre de 2016 .
- ↑ Corbet, Jonathan. "Reemplazando /dev/urandom" . Linux Weekly News . Consultado el 20 de septiembre de 2016 .
- ↑ "Fusionar la etiqueta 'random_for_linus' de git.kernel.org/pub/scm/linux/kernel/git/tytso/random" . Árbol fuente del kernel de Linux . Consultado el 20 de septiembre de 2016.
random: reemplazar el grupo no bloqueante con un CRNG basado en Chacha20
- ↑ Michael Larabel (25-07-2016). "/dev/random muestra mejoras para Linux 4.8" . Phoronix . Consultado el 03-10-2016 .
- ↑ Cox, Russ; Valsorda, Filippo. "Aleatoriedad segura en Go 1.22 - El lenguaje de programación Go" . go.dev .
- ↑ "¿Qué atractivo tiene usar ChaCha20 en lugar de AES?" . Cryptography Stack Exchange . 12/04/2016.
- ↑ "Estudio de rendimiento SSL de AES-NI en Calomel.org" .
- ↑ Pfau, Johannes; Reuter, Maximilian; Harbaum, Tanja; Hofmann, Klaus; Becker, Jurgen (septiembre de 2019). "Una perspectiva de hardware sobre los cifrados ChaCha: implementaciones escalables de Chacha8/12/20 que van desde 476 slices hasta tasas de bits de 175 Gbit/s". 32.ª Conferencia Internacional IEEE sobre Sistemas en Chip (SOCC) de 2019. págs. 294–299 . doi : 10.1109/SOCC46988.2019.1570548289 . ISBN 978-1-7281-3483-3.
- ↑ "Protocolo y criptografía" . WireGuard . Jason A. Donenfeld . Consultado el 4 de julio de 2018 .
- ↑ Edge, Jake (16 de enero de 2019). "Adiantum: cifrado para el extremo inferior" . LWN.net .
- 1 2 "ChaCha20 y Poly1305 para protocolos IETF" (PDF) . Consultado el 7 de agosto de 2017.
Cambios respecto a ChaCha estándar. La división del número de secuencia de bloque nonce se cambió de 64:64 a 96:32 [...] El estado de ChaCha20 se inicializa de la siguiente manera:
- ↑ Encabezado de RFC 7539.
Enlaces externos
- Snuffle 2005: la función de cifrado Salsa20
- Especificación de Salsa20 ( PDF )
- Salsa20/8 y Salsa20/12 (PDF)
- El proyecto eSTREAM: Salsa20 archivado el 18 de agosto de 2022 en Wayback Machine.
- La familia de cifradores de flujo ChaCha
- Uso e implementación de Salsa20
- Implementación y visualización didáctica de la familia de cifrado ChaCha en CrypTool 2
- Demostración de ChaCha20 en Excel. Ejemplo de implementación y demostración en Excel (sin macros) por Tim Wambach.
- Cifrados de flujo
- Generadores de números pseudoaleatorios criptográficamente seguros
- Estándares de Internet
- Software de dominio público con código fuente