Algoritmo de Cifrado ChaCha20
ChaCha es una familia de cifrados de flujo de Daniel J. Bernstein basados en una variante de Salsa20. ChaCha20 es un algoritmo de cifrado por flujo, lo que indica que el proceso de cifrado se hace bit a bit sobre un mensaje o información que se desee cifrar. Los algoritmos de cifrado por flujo son de llave privada, por lo que se requiere la misma llave para cifrar y descifrar.
El número 20 viene de que ChaCha20 realiza 20 rondas de funciones no lineales para poder cifrar información, es más rápido que el algoritmo de cifrado AES y su diseñador lo recomienda para aplicaciones criptográficas típicas.
ChaCha20 está diseñado para ser soportado por dispositivos que no posean una capacidad de procesamiento tan grande como lo son dispositivos IoT, teléfonos celulares, relojes inteligentes, etc. ya que los algoritmos de cifrado por flujo están diseñados para ser rápidos y resistente a errores.
¿Cómo funciona Chacha20?
Chacha20 se basa en la idea de generar una secuencia de números pseudoaleatorios llamada “flujo de cifrado” y luego combinarla con los datos que se desean cifrar mediante una operación XOR, para ello utiliza bloques de 512 bits, donde cada bloque consta de 16 palabras de 32 bits. Estos bloques se utilizan como base para generar el flujo de cifrado. El proceso implica aplicar 20 rondas de operaciones al bloque para mezclar y ocultar su contenido.
Cada ronda se compone de una serie de operaciones ARX (Adición, Rotación, XOR), que modifican los valores de las palabras en el bloque. Después Chacha20 hace uso de una clave secreta para iniciar el proceso de cifrado, esta clave se combina con los bloques de datos para generar el flujo de cifrado. Es esencial mantener la clave en secreto, ya que es la base para la seguridad del cifrado. La estructura del bloque Chacha20 asegura que una cuarta parte del espacio del bloque esté ocupada por la clave secreta.
Chacha20 también utiliza un nonce (número utilizado una vez “number used only once”) y un contador para asegurar que cada bloque de datos cifrados sea único. El nonce es un valor arbitrario que se combina con la clave secreta para generar el flujo de cifrado. El contador es un valor que se incrementa cada vez que se cifra un nuevo bloque. Juntos, el nonce y el contador aseguran que el flujo de cifrado generado sea diferente para cada bloque.
Una vez que se tiene la clave secreta, el nonce y el contador, se inicia el proceso de generación del flujo de cifrado y se aplican 20 rondas de operaciones al bloque de 512 bits. Cada ronda modifica las palabras del bloque en función de los valores actuales y de las operaciones ARX.
Cuando se tiene el flujo de cifrado, este se combina con los datos originales mediante una operación XOR. Esto significa que cada bit de los datos originales se mezcla con el flujo de cifrado correspondiente. El resultado es el texto cifrado. Dado que el flujo de cifrado es pseudoaleatorio y depende de la clave secreta, el nonce y el contador, solo las personas con la misma clave secreta pueden generar el mismo flujo y descifrar los datos.
Como se puede ver, ChaCha20 solo genera una secuencia pseudoaleatoria para poder hacer el cifrado mediante una operación XOR, las entradas del algoritmo son únicamente la llave simétrica generada también de manera aleatoria y el nonce además del contador, el texto en claro nunca entra en el algoritmo de cifrado, sino que este es el que se opera con el flujo presudoaleatorio generado por el algoritmo.
¿Cuáles son sus ventajas sobre otros algoritmos de cifrado?
Chacha20 es más seguro en la práctica que su versión anterior Salsa20, debido a su mecanismo de mezcla más efectivo. Chacha20 utiliza una operación de cuarto de ronda (quarter-round) que mejora significativamente la mezcla de datos dentro de bloques de 512 bits en comparación a Salsa20, porque los bloques al ser un tamaño más pequeño (32 bits), comparado con el tamaño de los bloques de Salsa20 (64 bits), garantizan una reducción en el acceso a la memoria y mejora la amigabilidad con la caché. Además, cada palabra se actualiza dos veces en la operación de cuarto de ronda de Chacha20, y cada palabra influye en las otras tres, lo que mejora su efectividad en la mezcla de datos.
En comparación con otros algoritmos de cifrado por bloques como AES, Chacha20 es mucho más rápido, al hacer un cifrado bit a bit, además, no se necesita de un hardware específico y complejo como el que usa AES, que al estar estandarizado utiliza un hardware optimizado que aceleran sus complejos cálculos de cifrado, Chacha20 utiliza operaciones sencillas para poder cifrar, en concreto las operaciones ARX, que solo consisten en sumas, rotaciones y una operación XOR.
¿Hay algún ataque conocido a este algoritmo?
A pesar de la seguridad y alta confiabilidad de Chacha20, no ha estado exento de ataques, uno de los más conocidos fue en 2008, aunque se efectúo en un Chacha de 7 rondas y no en uno de 20, se basó en la observación de un concepto llamado “Probabilistically neutral bit” (PN-bit), que fue introducido por Aumasson et al. en su trabajo “New features of Latin dances” publicado en FSE 2008. El ataque en sí se centró en la búsqueda de bits neutrales probabilísticos en la salida de las rondas de Chacha de 7 rondas.
Un bit neutral probabilístico es un bit en la salida del cifrador que es igualmente probable de ser 0 o 1, independientemente de la clave utilizada para el cifrado. La observación clave aquí fue que, si se puede identificar un bit neutro probabilístico en la salida de una ronda, se puede utilizar para deducir información sobre el estado interno del cifrador y, en última instancia, recuperar la clave.
El ataque se basó en la explotación de estas propiedades de los bits neutrales probabilísticos para deducir información de la clave. Aunque este ataque demostró la vulnerabilidad de Chacha de 7 rondas, es importante tener en cuenta que otras versiones de Chacha, como Chacha20 han sido diseñadas para tener un mayor número de rondas precisamente para hacer que estos tipos de ataques sean ineficaces.
Conclusiones
ChaCha20 es uno de los algoritmos de cifrado más importantes para asegurar la confidencialidad de la comunicación a través de un canal que siempre se asume que es inseguro, sus propiedades como la rapidez y la independencia de hardware específico lo hacen uno de los mejores algoritmos de cifrado por flujo que existen ya que con operaciones fácilmente operables se puede lograr una seguridad bastante buena ya que a día de hoy no se conocen ataques exitosos al algoritmo. Es recomendable usarlo para aplicaciones que no requieran dispositivos de una alta capacidad de procesamiento, aunque no se encuentre estandarizado por autoridades como el NIST u otros institutos que brindan estandarizaciones a algoritmos de cifrado simétrico o asimétrico, es importante recordar que es uno de los algoritmos más seguros, que garantizan la confidencialidad de la información además de tener una alta eficiencia.
Referencias.
[1]. Aldeco, R. A. (2023), 2 — Criptography — Encryption. UNAM, Facultad de Ingeniería.
[2]: Sabyasachi Dey, Santanu Sarkar, A theoretical investigation on the distinguishers of Salsa and ChaCha, Discrete Applied Mathematics, Volume 302, 2021, Pages 147–162, ISSN 0166–218X, https://doi.org/10.1016/j.dam.2021.06.017. https://www.sciencedirect.com/science/article/pii/S0166218X21002547
[3]: Business Transformation. (2022). Researchers at TII study the benefits and performance of AES versus CHACHA20 algorithms. Bizness Transform. https://www.biznesstransform.com/researchers-at-tii-study-the-benefits-and-performance-of-aes-versus-chacha20-algorithms/
[4]: Loup Vaillant. The design of Chacha20. (2017). https://loup-vaillant.fr/tutorials/chacha20-design
[5]: Shotaro Miyashita, Ryoma Ito, Atsuko Miyaji, PNB-focused Differential Cryptanalysis of ChaCha Stream Cipher (2021) https://eprint.iacr.org/2021/1537.pdf