Dragon es un cifrado de flujo , presentado por primera vez [1] en la conferencia internacional anual ICISC en 2003. En abril de 2005, se presentó al concurso eSTREAM , cuyo objetivo era identificar cifrados de flujo adecuados para uso general en aplicaciones con requisitos de alto rendimiento.
Dragon fue desarrollado por Ed Dawson, Kevin Chen, Matt Henricksen, William Millan, Leonie Simpson, HoonJae Lee y SangJae Moon.
El diseño de cifrados de flujo se ha basado tradicionalmente en la operación de registros de desplazamiento de retroalimentación lineal , ya que estos últimos se entienden bien y satisfacen los criterios estadísticos generalmente aceptados. La no linealidad en el cifrado gamma puede representarse por la acción de un filtro no lineal, por un reloj de circuito irregular, o por ambos. Cuando se implementan en hardware, los cifrados de flujo de bits exhiben un alto rendimiento, pero son bastante lentos cuando se implementan en software . Los cifrados basados en registros de desplazamiento de retroalimentación lineal y que utilizan una pequeña cantidad de retroalimentaciones pueden ser vulnerables a los ataques, pero un aumento en el número de estos últimos puede afectar negativamente la eficiencia del cifrado. Además, la fiabilidad de los cifrados con una función de cambio de estado lineal se cuestiona cuando se utilizan ataques algebraicos. [2]
Los cifrados basados en palabras pueden superar a los cifrados basados en bits tanto en implementaciones de hardware como de software. Encriptan varias veces más datos por iteración que los cifrados que utilizan registros de desplazamiento de retroalimentación lineal de un solo bit. Cuando se implementan en el software, pueden superar incluso a los cifrados de bloques rápidos como AES en casi un orden de magnitud [3] . Aunque es fácil medir el rendimiento de los cifrados basados en palabras, es difícil evaluar con precisión su fuerza.
Dragon se diseñó teniendo en cuenta tanto el rendimiento como la seguridad. Utiliza un registro de desplazamiento de retroalimentación no lineal junto con un filtro no lineal para generar una gamma de cifrado en forma de palabras de 64 bits. Dragon tiene un rendimiento del orden de varios gigabits por segundo y requiere alrededor de 4 kilobytes de memoria.
Dragon se puede utilizar con una clave de 128 bits y un vector de inicialización, o con una clave de 256 bits y un vector de inicialización. Estas versiones se llaman Dragon-128 y Dragon-256, respectivamente. Funcionan casi de manera idéntica, con la excepción del proceso de inicialización de claves.
Ambas versiones del cifrado Dragon se construyen usando un solo registro de desplazamiento de retroalimentación no lineal de 1024 bits y memoria M de 64 bits. El estado inicial se crea usando una clave y un vector de inicialización, respaldado por una función de cambio de estado F. El cambio La función también se utiliza en la generación de secuencias de claves.
Dragon-128 y Dragon-256 usan la misma función F. F es un mapeo reversible de 192 bits a 192 bits: toma 6 x 32 bits como entrada (denotados a, b, c, d, e, f) y emite 6 x 32 bits (indicados a', b', c', d', e', f'). La red consta de tres capas: una capa de mezcla inicial, una capa de caja S y una capa de mezcla final. Las capas de mezcla utilizan la adición de módulo 2 32 y la adición de módulo 2 (⊕). La capa S-box consta de funciones G y H, que a su vez contienen 8 × 32 S-boxes.
Las funciones G y H son cajas S virtuales no lineales de 32 x 32 construidas a partir de dos cajas S de 8 x 32 bits. Los 32 bits de entrada se dividen en cuatro bytes, x = x 0 ‖ x 1 ‖ x 2 ‖ x 3 , donde a ‖ b denota la concatenación de a y b.
Para inicializar la clave, el registro de desplazamiento de retroalimentación no lineal se divide en ocho palabras de 128 bits, denominadas W 0 ... W 7 . La inicialización tiene lugar en dos fases.
Fase 1: "Propagar" el estado de cifrado : durante la primera fase, el estado inicial del registro de desplazamiento de retroalimentación no lineal de 1024 bits y la memoria M de 64 bits se "propaga" utilizando la clave (K) y el vector de inicialización ( IV).
Dragon-128 toma una clave de 128 bits y un IV de 128 bits y "multiplica" el estado del registro de desplazamiento de retroalimentación no lineal de modo que (W 0 ‖ … ‖ W 7 ) = (K ‖ K ' ⊕ IV ' ‖ IV ‖ K ⊕ IV ' ‖ K ' ‖ K ⊕ IV ‖ IV ' ‖ K ' ⊕ IV), donde el número primo indica que las mitades alta y baja de 64 bits se han intercambiado.
Dragon-256 toma una clave de 256 bits y un IV de 128 bits y "multiplica" el estado del registro de desplazamiento de retroalimentación no lineal de modo que (W 0 ‖ … ‖ W 7 ) = (K ‖ K ⊕ IV ‖ ~( K ⊕ IV) ‖IV).
En ambos casos, la memoria M de 64 bits se rellena previamente con el valor constante 0x0000447261676F6E, que es la representación ASCII de la palabra "Dragón".
Fase 2: Mezclar el estado del cifrado : durante la segunda fase, la función de cambio de estado se aplica 16 veces para mezclar el contenido del registro de desplazamiento de retroalimentación no lineal y la memoria M de 64 bits. El argumento de la función de 128 bits F es formado como una combinación lineal de tres palabras de registro de desplazamiento con retroalimentación no lineal, exactamente a ‖ b ‖ c ‖ d = (W 0 ⊕ W 6 ⊕ W 7 ). Además, e ‖ f = M.
El circuito está cronometrado de tal manera que W 7 se omite en el tiempo t, por lo que W i t+1 = W t i-1 , 0 ≤ i ≤ 7. La palabra de retroalimentación de 128 bits que forma el contenido de W 0 t+1 es obtenido sumando módulo 2 W 0 t 0 c (a ' ‖ b ' ‖ c ' ‖ d ' ). Las dos palabras restantes de 32 bits se concatenan y se utilizan para actualizar la memoria: e ' ‖ f ' = M.
Para protegerse contra ataques que requieren el conocimiento de una gran cantidad de elementos de flujo de claves y contra ataques futuros desconocidos, no se pueden crear más de 264 bits de flujo de claves para cada par de K y IV.
Durante la generación del flujo de claves, un registro de desplazamiento de retroalimentación no lineal de 1024 bits se divide en 32 palabras de 32 bits B i , 0 ≤ i ≤ 31. La función F también se usa en el proceso.
En cada iteración, se seleccionan cuatro argumentos F de entrada de 32 bits del registro de desplazamiento de realimentación no lineal de las palabras B 0 , B 9 , B 16 y B 19 . Los dos argumentos restantes son el resultado de la suma módulo 2 de las palabras B 30 y B 31 con M L y M R , respectivamente, donde M L y M R son las palabras baja y alta de la memoria M, respectivamente.
El registro de desplazamiento de retroalimentación no lineal se desplaza dos bits, y B 0 y B 1 se llenan con la acción de retroalimentación de las salidas de función F b ' y c ' respectivamente. La palabra z del flujo de claves de 64 bits se forma mediante la concatenación de a ' y e '. La memoria M de 64 bits actúa como un contador durante la generación del flujo de claves y se incrementa en cada ciclo.
El cifrado Dragon se diseñó teniendo en cuenta tanto el hardware como el software.
Se han realizado evaluaciones de rendimiento [4] , que muestran que Dragon es bastante eficiente tanto en términos de rendimiento como de costos de memoria.
La implementación de Dragon a nivel de hardware permite lograr un alto grado de paralelismo. Las operaciones en los seis argumentos de entrada de la función F se pueden dividir en tres grupos, cada uno con dos argumentos. La premezcla y la posmezcla se implementan mediante sumadores de módulo de 32 bits. Las funciones G y H se implementaron utilizando tablas LUT y operadores XOR. Cuando se fabrica con tecnología Samsung 0.13um ASIC , a una frecuencia de reloj de 2.6 GHz, la latencia mínima es de 2.774 ns a un rendimiento de 23 Gbps.
Para mejorar la velocidad de implementación del hardware, se propuso una estructura informática especial [5] . En un dispositivo Altera FPGA, una implementación eficiente de Dragon logra un rendimiento de 1,06 Gbps.
En 2005, Hakan Englund y Alexander Maximov realizaron estudios de confiabilidad en Dragon [6] , revelando una vulnerabilidad en él. En el mismo año, los autores del cifrado publicaron un artículo [7] negando la posibilidad de una explotación efectiva de esta vulnerabilidad. Sin embargo, en 2007, Joo Yeon Cho y Josef Pieprzyk mejoraron la técnica de ataque propuesta anteriormente [8] . Y aunque tal ataque prácticamente no es factible en la práctica, esto no aumentó la reputación del cifrado.
Después de pasar por dos fases de la competencia eSTREAM , Dragon cipher no llegó a la final y perdió ante competidores más fuertes.