Grain es un cifrado de flujo enviado a eSTREAM en 2004 por Martin Hell, Thomas Johansson y Willi Meier. Ha sido seleccionado para la cartera final de eSTREAM para el Perfil 2 por el proyecto eSTREAM. Grain está diseñado principalmente para entornos de hardware restringidos. Acepta una clave de 80 bits y un IV de 64 bits . Las especificaciones no recomiendan una longitud máxima de salida por par (clave, iv). Se han identificado y corregido varias debilidades potenciales en el cifrado en Grain 128a , que ahora es el cifrado recomendado para usar en entornos de hardware que brindan seguridad y autenticación de 128 bits.
El estado interno de 160 bits de Grain consta de un registro de desplazamiento de retroalimentación lineal (LFSR) de 80 bits y un registro de desplazamiento de retroalimentación no lineal (NLFSR) de 80 bits. Grain actualiza un bit del estado LFSR y un bit del estado NLFSR por cada bit de texto cifrado liberado por una función de filtro no lineal. El NLFSR de 80 bits se actualiza con una función booleana no lineal de 5 a 1 y una entrada lineal de 1 bit seleccionada del LFSR. La función no lineal de 5 a 1 toma como entrada 5 bits del estado NLFSR. El LFSR de 80 bits se actualiza con una función lineal de 6 a 1. Durante las operaciones de codificación, la salida del cifrado se retroalimenta adicionalmente como entradas lineales en las funciones de actualización NLFSR y LFSR.
En la versión original de Grain, versión 0.0, un bit del NLFSR de 80 bits y cuatro bits del LFSR de 80 bits se suministran a una función booleana no lineal de 5 a 1 (que se elige para que esté equilibrada, sea inmune a la correlación de primer orden y tenga grado algebraico 3) y la salida se combina linealmente con 1 bit del NLFSR de 80 bits y se libera como salida.
En la versión actualizada 1.0 de Grain, un bit del NLFSR de 80 bits y cuatro bits del LFSR de 80 bits se suministran a una función booleana no lineal de 5 a 1 (ligeramente revisada) y la salida se combina linealmente con 7 bits del NLFSR de 80 bits y se libera como salida.
Para inicializar el cifrado, la clave de 80 bits se carga directamente en el NLFSR de 80 bits y el IV de 64 bits se carga en los 64 bits bajos del LFSR y los 16 bits altos restantes del LFSR se llenan con unos. El cifrado se sella durante 160 rondas donde los 160 bits del flujo de clave generado se retroalimentan linealmente a las funciones de actualización del LFSR y del NLFSR. El cifrado no libera ninguna salida de flujo de clave durante el proceso de inicialización.
Los autores de Grain analizan las tasas de difusión completas del proceso de inicialización de Grain en las especificaciones de Grain Versión 1.0: "Para la inicialización con dos IV diferentes, que difieren solo en un bit, la probabilidad de que un bit del registro de desplazamiento sea el mismo para ambas inicializaciones debería ser cercana a 0,5. Las simulaciones muestran que esto se logra después de 160 ciclos de reloj".
El cifrado está diseñado para permitir que se realicen hasta 16 rondas en paralelo, lo que permite implementaciones más rápidas a costa de un mayor uso de hardware.
El tamaño de la clave es de 80 bits y el tamaño del IV está especificado en 64 bits. Los autores afirman que el cifrado está diseñado de tal manera que no debería ser posible ningún ataque más rápido que una búsqueda exhaustiva de la clave, por lo que el mejor ataque debería requerir una complejidad computacional no significativamente inferior a 2 80 .
En las especificaciones originales de Grain Versión 0.0, [1] los autores afirman: "Grain proporciona una seguridad superior a la de otros cifrados conocidos destinados a ser utilizados en aplicaciones de hardware. Ejemplos conocidos de estos cifrados son E0 utilizado en Bluetooth y A5/1 utilizado en GSM . Estos cifrados, aunque también tienen una implementación de hardware muy pequeña, han demostrado ser muy inseguros. En comparación con E0 y A5/1 , Grain proporciona una mayor seguridad manteniendo una pequeña complejidad de hardware".
Los autores citan el ataque contra E0 [2] que requería una complejidad de 2,40 y 2,35 tramas (una trama tiene una longitud de 2745 bits). El cifrado original de Grain versión 0.0 fue descifrado mediante un ataque de recuperación de clave [3] que requería una complejidad de 2,43 cálculos y 2,38 bits de flujo de clave para determinar la clave de 80 bits.
En las especificaciones revisadas de la versión 1.0 de Grain, [4] el cifrador tiene una función de salida ligeramente revisada y la función de retroalimentación NLFSR recibió un cambio menor. Las especificaciones afirman: "La función de filtro es bastante pequeña, solo 5 variables y la no linealidad 12. Sin embargo, esto se compensa en parte por el hecho de que una de las entradas se toma del NLFSR. El bit de entrada del NLFSR dependerá de manera no lineal [ sic ] de otros bits en el estado, tanto del LFSR como del NLFSR. La pequeña función de filtro también se compensa agregando 7 bits linealmente [ sic ] del NLFSR en posiciones adecuadas para formar la función de salida".
A partir de octubre de 2006, no se conocen ataques de recuperación de clave mejores que los ataques de fuerza bruta contra Grain versión 1.0.
Sin embargo, en septiembre de 2006 Ozgul Kucuk publicó un ataque de clave relacionada en el artículo "Ataque de resincronización de diapositivas en la inicialización de Grain 1.0". [5] El artículo afirma: "Encontramos claves relacionadas y valores iniciales del cifrado de flujo Grain 1.0. Para cualquier par (K, IV) existe un par (K', IV') relacionado con una probabilidad de 1/22 que genera un flujo de claves desplazado 1 bit. Aunque esto aún no da como resultado un ataque de recuperación de clave eficiente, indica una debilidad en la inicialización que podría superarse [ sic ] con un poco de esfuerzo".
{{cite web}}
: CS1 maint: varios nombres: lista de autores ( enlace ){{cite web}}
: CS1 maint: varios nombres: lista de autores ( enlace ){{cite web}}
: CS1 maint: varios nombres: lista de autores ( enlace )