ISAAC (Indirection, Shift, Accumulate, Add and Count) es un generador de números pseudoaleatorios , desarrollado en 1996 por Robert J. Jenkins Jr., como un desarrollo de los algoritmos IA e IBAA desarrollados por él. Este generador está catalogado como generador de números pseudoaleatorios criptorresistentes , aunque no se ha realizado una prueba completa y rigurosa.
El programador estadounidense Robert John Jenkins Jr. fue a Berkeley en 1993 para obtener un doctorado en informática teórica , después de graduarse de la Universidad Carnegie Mellon en 1989 y cuatro años en Oracle . A pesar de que estudiar en Berkeley fue una prueba seria para Jenkins -tuvo que dejarlo después de un año- fue aquí donde comenzó su trabajo en el estudio de generadores de números pseudoaleatorios como parte del curso de criptografía de Manuel Blum . . En julio de 1993, Jenkins comenzó a experimentar con números pseudoaleatorios para los procesadores Intel 486 y, en abril de 1994, se había desarrollado ISAAC. Es cierto que el artículo que describe su trabajo se publicó solo dos años después, en febrero de 1996. [una]
El algoritmo de cifrado RC4 [2] [3] consta de dos pasos: la generación de una secuencia de bits pseudoaleatorios y el módulo dos de suma bit a bit de esta secuencia de texto sin formato .
En la etapa de generar una secuencia pseudoaleatoria, n juega un papel importante : el tamaño del S-box , la matriz de datos, que en realidad determina el estado interno de RC4 . Las siguientes variables también se usan en RC4: i y j son iteradores que se ejecutan a través de valores, una clave de matriz de longitud de longitud , en la que la clave se almacena de una manera especial, y una matriz S (también conocida como bloque S). Datos de salida: la matriz z es una secuencia pseudoaleatoria .
Considere el algoritmo usando n = 8 como ejemplo . Primero , la matriz S se llena con números del 0 al , la matriz Key se llena con una secuencia de palabras de n bits. Si la longitud de la clave es menor que la longitud de S, entonces la secuencia se repite hasta que su longitud sea igual a . Entonces el algoritmo funciona así:
yo = 0; j = 0; mientras yo < 256 //256 = 2^n j = (j + S[i] + Clave[longitud de mod i]) mod 256; intercambiar S[i] y S[j]; yo++;Después de esta etapa, la etapa de inicialización, sigue la etapa de la generación real de la secuencia pseudoaleatoria:
yo = 0; j = 0; mientras yo < 256 j = (j + S[i]) módulo 256; intercambiar S[i] y S[j]; z[i] = S[(S[i] + S[j]) módulo 256]; yo++;La salida es una secuencia de longitud n, con la ayuda de la cual se cifra el texto sin formato.
IA (Indirection, Addition) es un algoritmo desarrollado por Jenkins para que pueda cumplir con los siguientes requisitos [4] :
Datos de entrada del algoritmo IA: matriz S , compuesta por elementos de 0 a , distribuidos aleatoriamente en la matriz, iteradores i y j . La matriz de datos de salida z es el resultado del algoritmo. Además, los valores de las celdas en la matriz, es decir, la longitud de las palabras, debe ser mayor que el bit, Jenkins en su trabajo toma K = 32 bits, esta es la longitud de la palabra que se usa en todos los algoritmos descritos aquí.
IBAA (Indirection, Barrelshift, Accumulate and Add) es un algoritmo creado por Jenkins basado en IA. El autor cree que IBAA tiene las siguientes ventajas además de las ventajas ya disponibles para IA [5] :
A diferencia de RC4 e IA, IBAA se basa en cambios cíclicos de datos de bits hacia la izquierda. La implementación de IBAA utiliza el mismo conjunto de variables que IA, con la única diferencia de que se suman los acumuladores a y b , así como la función de desplazamiento de barril , función que realiza el desplazamiento cíclico mencionado anteriormente.
barril (j) : desplaza cíclicamente todos los bits en una matriz de 32 bits hacia la izquierda en 19 bits. También se puede dar por la fórmula , donde
La operación >> aquí significa desplazamiento aritmético a la derecha .
ISAAC (Indirection, Shift, Accumulate, Add and Count) es un algoritmo de números pseudoaleatorios, cuyo principio es más difícil de recordar que los principios de IA e IBAA, pero tiene una serie de ventajas sobre ellos [6] . Al diseñar ISAAC, se le presentó la siguiente lista de requisitos:
A diferencia de la mayoría de los generadores de números pseudoaleatorios, que se basan en cifrados de flujo , ISAAC está diseñado sin el uso de registros de desplazamiento de retroalimentación lineal.
El número medio de instrucciones de máquina necesarias para obtener un valor de 32 bits es 18,75. La versión de 64 bits de ISAAC (ISAAC-64) requiere 19 instrucciones para obtener un valor de 64 bits.
Al igual que en los algoritmos anteriores, ISAAC cuenta con un arreglo S que define el estado interno del sistema, compuesto también por elementos ubicados aleatoriamente en el arreglo desde 0 hasta una longitud de K bits, un iterador i y tres variables a , b y c , responsable de los estados anteriores del generador, la matriz de datos de salida z tiene la misma longitud que S . Sin embargo, además de estas variables, aquí también se introducen variables , que determinan el valor de la función que depende de ambos iteradores:
.
En su artículo, Jenkins sugiere .
El esquema de operación del generador en un paso arbitrario para n = 8, K = 32 es el siguiente:
c = c + 1; b = b + c; yo = 0; mientras yo < 255 x = S[i]; a = f(a, i) + S[i + 128 mod 256]; S[i] = a + b + S[x>>2 mod 256]; z[i] = x + S[S[i]>>10 mod 256]; b = z[i]; yo++;En su sitio web personal, el autor de ISAAC anunció una competencia para piratear el generador: el primero que pueda especificar el número utilizado como semilla ( semilla en inglés ) para generar los primeros 2560 valores emitidos por el generador recibirá $ 1000 premio de Jenkins. Sin embargo, hasta ahora nadie ha sido capaz de hacer frente a esta tarea. Sin embargo, ISAAC ha sido considerado en los escritos de varios criptoanalistas.
En 2001, se publicó un artículo [7] , en el que Marina Pudovkina describía un ataque basado en textos sin formato , con el que se puede encontrar el estado inicial del generador a partir de un pequeño segmento de los datos de salida, y también daba una estimación precisa de la complejidad de tal ataque. Usando el algoritmo descrito en el artículo, Pudovkina logró reducir la complejidad de la piratería a , mientras que la complejidad de la búsqueda exhaustiva [8] . Según sus cálculos, para , la complejidad del descifrado por búsqueda exhaustiva es , mientras que usando el algoritmo de Pudovkina, este número podría reducirse a . Tal complejidad, sin embargo, sigue siendo demasiado grande para llamar a ISAAC un generador de números pseudoaleatorios vulnerable, resume el criptoanalista en su artículo.
En su artículo de 2006 [9] , Omasson describe cuatro conjuntos de estados iniciales "débiles" que pueden cruzarse entre sí. Los estados débiles son aquellos estados en los que algunos de los elementos son aleatorios y los elementos restantes tienen el mismo valor. Si es el estado inicial, entonces se puede definir usando la relación: , luego se define como , el conjunto se define como , mientras que se especifica de la siguiente manera: . El autor consideró el algoritmo ISAAC con los mismos valores dados anteriormente (es decir , n = 8, K = 32) y calculó el número de estados débiles para cada uno de los conjuntos. Porque este número era estados, para - estados, para - , pero es un subconjunto de . La presencia de tales estados aún no significa que ISAAC pueda ser pirateado fácilmente, pero son debilidades potenciales del algoritmo, por lo que Omasson propuso una versión modificada de ISAAC - ISAAC + [10] .
ISAAC+La entrada en algún paso es la misma que en ISAAC, los números a , b y c , el arreglo S , compuesto por 256 palabras de 32 bits, la salida es un arreglo z de la misma dimensión que S. En la descripción de la función, en lugar de desplazamientos de bits lógicos >> y <<, se utilizan >>> y <<< cíclicos, es decir, se utiliza la función
La forma en que S[i] y z[i] se inician en cada paso también ha cambiado; en ambos casos, se utiliza XOR bit a bit. Es decir, en lugar de
S[i] = a + b + S[x>>2 mod 256]; z[i] = x + S[S[i]>>10 mod 256];ISAAC+ utiliza:
S[i] = a ⊕ b + S[x>>>2 mod 256]; z[i] = x + a ⊕ S[S[i]>>>10 mod 256]; Ataque de Paul-Pranil. CríticaEn el mismo 2006, Paul y Praenil publicaron un artículo [11] en el que estudiaron un ataque distintivo en algunos generadores similares a RC4 de transmisión, incluidos IA e ISAAC . En su trabajo, muestran que la complejidad de romper ISAAC es solo [12] . Omasson no descartó este ataque [13] y señaló el inicio erróneo del algoritmo por parte de Paul y Prenil, por lo que se hizo posible reducir tanto la complejidad de romperlo.
Muchas implementaciones de ISAAC son lo suficientemente rápidas y confiables como para que este generador de números pseudoaleatorios se haya vuelto bastante común. ISAAC se utiliza, por ejemplo, en la utilidad de Unix shred (Unix) [14] para cifrar datos reescritos. El generador de números aleatorios basado en ISAAC se implementa en una de las bibliotecas matemáticas de Java más comunes, Apache Commons Math [15] .