Parte I. Contextualización De La Investigación
1.5. Marco Teórico
1.5.5. Aleatoriedad Y Pseudoaleatoriedad
Muchos esquemas criptográficos tienen sus bases en la aleatoriedad de la generación de claves, para ello se necesita un generador de números aleatorios o RNG en sus siglas en inglés. El propósito de la información aleatoria es que sea impredecible para un atacante, incluso si éste realiza pasos con el fin de romper la aleatoriedad. Sin embargo, generar números aleatorios es muy desafiante, incluso en un mundo ideal donde se emplea información “aleatoria real”. Las computadoras cuentan con mecanismos para generar información aleatoria, pero en muchos de los casos esta información puede ser predecible o influenciada por un atacante para derrotar el mecanismo de aleatoriedad.
Existen varias dificultades al emplear información aleatoria real, la primera es la dificultad de generarla, la segunda es que fuentes aleatorias reales, tales como generadores de números
32
aleatorios basados en fenómenos físicos se pueden romper, quizá el generador será predecible en ciertas formas, y lo peor de todo es que no hay forma de determinar cuándo se romperá. Y un tercer problema consiste en determinar qué tanta entropía se puede extraer de un evento físico, a menos de que se cuente con un hardware dedicado para el generador de información aleatoria, es extremadamente difícil determinar qué tanta entropía se obtiene con el mecanismo.
Es por ello que una alternativa de la información aleatoria real es usar información pseudoaleatoria. Este tipo de información es generada a partir de una semilla por un algoritmo determinístico. Si se conoce la semilla, se puede predecir la información aleatoria.
Tradicionalmente los generadores de información pseudoaleatoria o PRNGs en sus siglas en inglés, no son muy seguros contra un adversario inteligente. Estos generadores están diseñados para eliminar artefactos estadísticos, no para contener un atacante inteligente (Ferguson, Schneier, & Kohno, 2010).
𝐷ado 𝑋 un conjunto finito de estados, un PRNG es un algoritmo basado en una estructura de la forma (X, x , T, U, G), donde 𝑥 es la semilla, U es el conjunto finito de posibles
observaciones, 𝑇 y 𝐺 son las funciones de transición y salida respectivamente (Pulido, 2008), es decir: 𝑇: 𝑋 → 𝑋 ; 𝐺: 𝑋 → 𝑈.
El periodo 𝜌 del generador es la cantidad de números aleatorios que pueden ser mapeados antes de que la secuencia de números se repita (Grun & Rotter, 2010).
En (Brent, 2006) se listan los siguientes requerimientos para un buen PRNG:
Uniformidad: Los números generados (𝑥 , 𝑥 , …) deben ser distribuidos uniformemente sobre 𝑋.
Independencia: Cualquier subsecuencia de la secuencia completa (𝑥 , 𝑥 , …) de los números aleatorios deben ser estadísticamente independiente.
33
Periodo extenso: Para un PRNG con periodo 𝜌, se debería mapear a lo mucho
𝜌 / números aleatorios
Inicialización: Cualquier elección de una semilla debe arrojar números aleatorios similares.
Salto: Algunos PRNG proveen la posibilidad de saltar a una posición específica de la secuencia.
Repetibilidad: Especialmente cuando se hacen simulaciones de debugging, es crucial que la misma secuencia de números aleatorios pueda ser generada una y otra vez.
Portabilidad: Un PRNG debe producir exactamente la misma secuencia de números aleatorios para cualquier computadora en la que se ejecute.
Eficiencia: PRNGs deben consumir el menor tiempo posible del total de la simulación.
Impredecibilidad: Una verdadera secuencia de números aleatorios es impredecible. Algunos de los PRNGs más conocidos que se mencionan en (Grun & Rotter, 2010) son:
Generadores basados en recurrencias
Se definen a partir de una semilla dada y una relación de recurrencia de la forma de la ecuación 31.
𝑥 = 𝑇(𝑥 ) (31)
La cual proporciona números pseudoaleatorios 𝑢 definidos a partir de la relación presentada en la ecuación 32.
𝑢 = 𝑔(𝑥 ) (32)
Por el hecho de ser 𝑋 finito, la sucesión de estados es periódica y dicho periodo no puede exceder el cardinal del espacio de estados 𝑋. Este tipo de generador tiene un factor limitante, ya
34
que emplea enteros de 32 bits como variables de estado, de esta forma no puede tener un periodo mayor que 𝜌 = 2 ≈ 10 , lo cual lo hace muy pequeño para un uso práctico.
Generadores Basados En Congruencias
Los generadores basados en congruencias lineales han sido muy utilizados dada su simplicidad y eficiencia, se definen por medio de la ecuación 33.
𝑥 = (𝑎𝑥 + 𝑏)𝑚𝑜𝑑 𝑚 (33)
Donde 𝑎 es el multiplicador, 𝑏 el incremento y 𝑚 el módulo. En (Lewis, Goodman, & Miller, 1969) se demostró que si 𝑎 = 7 , 𝑏 = 0, 𝑚 = 2 − 1, se obtiene un generador con un periodo máximo de 𝜌 = 2 − 2. Pese a que este generador ha sido considerado un “estándar mínimo” por un largo periodo de tiempo, en la actualidad no es viable para simulaciones a larga escala, debido a su periodo tan corto, un computador moderno recorrerá el periodo entero en menos de un minuto.
Generadores de Fibonacci rezagados
Este tipo de generadores fue propuesto hace más de 50 años y han sido considerados como confiables. Su vector de estado 𝑋 consiste de los últimos 𝑘 números de 32 bits aleatorios extraídos de acuerdo a la relación generalizada de la recurrencia de Fibonacci definida en la ecuación 34.
x = (x ± x ) mod m (0 < s < k ≤ n) (34)
Para un módulo de la forma 𝑚 = 2 y el par de parámetros (𝑘, 𝑠), el generador tiene un periodo de 𝜌 = 2 (2 − 1), y para el caso particular donde los argumentos son iguales a (100,37) el periodo será 𝜌 ≈ 2 . En (Marsaglia & Tsang, 2004) se propone usar el generador con rezagos de (97,33) con una secuencia aritmética de la forma (𝑐 − 𝑗𝑑) 𝑚𝑜𝑑 𝑝 con constantes
35
Generadores recursivos de múltiple combinación
Este tipo de generadores se definen a partir de los rezagados de Fibonacci como una generalización de estos introduciendo más términos y coeficientes arbitrarios en la recurrencia tal y como se muestra en la ecuación 35.
x = (a x + a x +··· + a x ) mod m. (35)
Los generadores basados en congruencias son un caso especial de los generadores recursivos de múltiple combinación para un 𝑘 = 1, mientras que los generadores de Fibonacci rezagados son recursivos de múltiple combinación para los cuales dos de los coeficientes 𝑎 son
±1 y los otros coeficientes son ceros. Los autores en (L’Ecuyer, Simard, Chen, & Kelton, 2002) lograron combinar estos dos generadores y obtuvieron un generador recursivo de múltiple combinación el cual tiene un periodo de 𝜌 ≈ 2 ≈ 10 .
Generadores de mersenne twister
Estos no operan sobre números enteros o de precisión doble, sino en vectores de bits individuales, lo cual permite ejecutar un código rápido basado en cambios de bits y operaciones lógicas entre ellos, logrando un salto rápido en la secuencia de números aleatorios. Toda la aritmética es hecha sobre módulo 2. La variable de estado 𝛴 es un vector de 𝑘 ceros y unos dados por la ecuación 36, y las reglas de mapeo e iteración se presentan en las ecuaciones 37 y 38.
𝛴 = 𝑨𝛴 (36)
𝑟 = 𝑩𝛴 (37)
𝑢 = 𝑟 𝑙 2
(38)
Con la matriz de transición 𝑨de dimensiones 𝑘 × 𝑘, la matriz resultante de
36
del algoritmo dado como un número de doble precisión, puesto que estos tienen solo una mantisa de 53-bits, usualmente se tiene que 𝑤 ≤ 53 mientras que 𝑘 ≫ 𝑤.
El generador de Mersenne Twister más comúnmente usado en la actualidad es el
MT19937 (“Mersenne Twister: A random number generator (since 1997/10)”, 1998) , publicado en 1998 con una licencia GNU, es el PRNG nativo en las librerías de NumPy y MATLAB. MT19937 tiene un 𝑘 = 19937, y un periodo 𝜌 = 2 ≈ 10 , lo cual deja un espacio de números aleatorios lo suficientemente grande para realizar simulaciones a gran escala.
En el contexto de un sistema criptográfico, hay que reforzar los requerimientos. Incluso si un atacante observa mucho la información aleatoria generada por el PRNG, éste no debería ser capaz de predecir algo respecto al resto de la salida del generador, lo que se conoce como un generador de números pseudoaleatorios criptográficamente seguro o CSPRNG en sus siglas en inglés (Ferguson et al., 2010).
Existen CSPRNGs razonablemente rápidos basados en algoritmos de encriptación como AES y funciones hash. Las funciones de encriptación toman una clave K y un texto plano P, retornando un texto cifrado.
𝐶 = 𝐸(𝐾, 𝑃)
Estas funciones pueden usarse como generadores de números pseudoaleatorios de tres formas como se especifica en (Grun & Rotter, 2010):
En el modo de retroalimentación de salida: Se escoge una clave K y algún texto plano S para generar 𝐶 = 𝐸(𝐾, 𝑆). Los números aleatorios son generados al iterar la encriptación
37
En el modo contador: Se escoge una clave K y se obtiene una secuencia de textos cifrados al encriptar un contador que se incrementa en uno para cada número extraído,
𝐶 = 𝐸(𝐾, 𝑆 + 𝑗).
En el modo contador de clave: es complementario al modo anterior, los números secuenciales se usan como clave para encriptar un texto plano fijo 𝐶 = 𝐸(𝑆 + 𝑗, 𝑃). Los números pseudoaleatorios se obtienen del texto cifrado usando la correspondiente función de mapeo dada en la ecuación 39.
𝑟 = 𝐷(𝐶 ) (39)
El periodo del generador basado en modo contador (de clave) obviamente no puede ser más grande que el rango de valores que el contador puede asumir. Por esta razón, se deben emplear contadores extensos con cientos de bits. CSPRNGs en modo contador (de clave) no tienen variables de estado internas, cada número aleatorio es generado independientemente de todos los números previos y subsecuentes. Esto tiene dos ventajas interesantes: saltar hacia adelante es trivial y muchos de los números pseudoaleatorios pueden generarse en paralelo sacando provecho de multiprocesamiento en los procesadores actuales, o de las potentes tarjetas gráficas de hoy día.
Para el criptosistema que se propone, se empleará la pseudoaleatoriedad en algunas partes como en la generación de los parámetros iniciales de la clave y la aplicación de máscaras sobre imágenes. Si bien es cierto que se debería emplear un CSPRNG al tratarse de un esquema de criptografía, para la propuesta se empleó el PRNG de Mersenne Twister, esto pues es la única librería de código abierto nativa en MATLAB (Perkins, 2005) para la generación de números pseudoaleatorios con un periodo considerablemente grande, y las implementaciones de CSPRNG
38
en MATLAB son generalmente de pago, lo cual no es viable para este proyecto de propósito académico.
39