El generador de números pseudoaleatorios ( PRNG , en inglés pseudorandom number generator , PRNG ) es un algoritmo que genera una secuencia de números , cuyos elementos son casi independientes entre sí y obedecen a una distribución determinada (normalmente uniforme discreta ).
La informática moderna hace un uso extensivo de los números pseudoaleatorios en una variedad de aplicaciones, desde Monte Carlo y la simulación hasta la criptografía . Al mismo tiempo, la calidad de los resultados obtenidos depende directamente de la calidad de los PRNG utilizados. Esta circunstancia es enfatizada por el conocido aforismo del matemático del ORNL Robert Caviu: " La generación de números aleatorios es demasiado importante para dejarla al azar ".
Las fuentes de números aleatorios reales son extremadamente difíciles de encontrar. Los ruidos físicos [1] como los detectores de eventos de radiación ionizante , el ruido de disparo en una resistencia o la radiación cósmica [2] pueden ser tales fuentes. Sin embargo, estos dispositivos rara vez se utilizan en aplicaciones de seguridad de red. Los ataques brutales a tales dispositivos también causan dificultades.
Las fuentes físicas de números aleatorios tienen una serie de desventajas:
Al mismo tiempo, los números aleatorios obtenidos de una fuente física se pueden utilizar como elemento generador (semilla inglesa) para los PRNG de software. Dichos generadores combinados se utilizan en criptografía, loterías, máquinas tragamonedas. [3]
John von Neumann consideró inaceptable el uso de generadores físicos de números aleatorios en tecnología informática, ya que si fuera necesario verificar cálculos, repetir acciones anteriores requeriría la reproducción de un número aleatorio, mientras que generar un nuevo número aleatorio es inaceptable. El registro y almacenamiento preliminar de los números aleatorios generados implicaría la posibilidad de leerlos. El mecanismo de lectura de datos era uno de los eslabones más débiles de las computadoras de la década de 1940. John von Neumann dio el siguiente método del cuadrado medio [4] para obtener números pseudoaleatorios de diez dígitos:
Se eleva al cuadrado un número de diez cifras, luego se toma un número de diez cifras de la mitad del cuadrado del número, que se vuelve a elevar al cuadrado, y así sucesivamente.Por ejemplo, para números de 4 dígitos, a partir de 1234, obtenemos , donde tomamos los 4 dígitos del medio (agregando un cero al principio, si es necesario). Luego elevamos al cuadrado el número resultante , y así sucesivamente. La desventaja de este método es el conjunto limitado de PSCH debido al hecho de que la secuencia hace un bucle - .
En 1951, D. G. Lemer propuso un método lineal congruente , [5] cuya esencia es especificar una secuencia de números enteros mediante una fórmula recursiva donde son números enteros y cumplen las siguientes condiciones: . La desventaja de este método es la dependencia de , ya que , así como el hecho de que el PFC realiza un bucle.
La mayoría de los PRNG deterministas corresponden a la 1994:en]1 [estructura propuesta por P. Lecuer . Por lo general , y el estado del generador viene dado por la fórmula recursiva para . valor de salida del generador ; es una secuencia de números pseudoaleatorios. Como es finito, deben existir unos finitos y tales que . Esto significa que las condiciones y se cumplirán para todos , porque las funciones y son deterministas. Por lo tanto, resulta que la secuencia es periódica. El período PRNG se denomina mínimo positivo . [3]
Los más comunes son el método congruencial lineal , el método de Fibonacci con retrasos , el registro de desplazamiento con retroalimentación lineal , el registro de desplazamiento con retroalimentación generalizada .
De los PRNG modernos, también se ha generalizado el " vórtice de Mersenne " propuesto en 1997 por Matsumoto y Nishimura . Sus ventajas son un período colosal (2 19937 −1), una distribución uniforme en 623 dimensiones (el método lineal congruente da una distribución más o menos uniforme en un máximo de 5 dimensiones), generación rápida de números aleatorios (2-3 veces más rápido que PRNG estándar utilizando el método lineal congruente). Sin embargo, existen algoritmos que reconocen la secuencia generada por el vórtice de Mersenne como no aleatoria.
Se incluye un generador de números pseudoaleatorios en muchos procesadores modernos , por ejemplo, RdRand se incluye en el conjunto de instrucciones IA-32. [6]
Una variación de PRNG son GPSB (PRBG), generadores de bits pseudoaleatorios, así como varios cifrados de flujo .
La siguiente es una lista de generadores que históricamente se han destacado en el campo de la generación de números pseudoaleatorios, ya sea por su importancia histórica o porque fueron un modelo innovador para su época. Además, a pesar de que se trata de un PRNG, algunos de ellos pueden ser aplicables en el campo de la criptografía.
Algoritmo | Los autores | Enlaces | Descripción | |
---|---|---|---|---|
medio cuadrado | Juan von Neummann | 1946 | [7] | PRNG, que se considera de baja calidad pero de gran importancia histórica como uno de los primeros algoritmos. |
Generador de Lehmer / Método congruencial lineal | DH Lehmer | 1951 | [ocho] | También es conocido como el método de las congruencias lineales multiplicativas y ha sido muy influyente en esta área de investigación. También se conoce como el Método Lineal Congruencial, cuya base ha mejorado con el tiempo. |
Generador de retrasos de Fibonacci | GJ Mitchell; DP Moore | 1958 | [9] | Un algoritmo muy influyente en el estudio de los procesos de generación de números aleatorios, inspirando a otros grandes autores posteriores como G. Marsaglia, creador de un test de calidad de números aleatorios llamado "Diehard", por ejemplo. |
Registro de desplazamiento de retroalimentación lineal (LFSR) / Oscilador Tausworthe | RC Tausworth | 1965 | [diez] | Un generador cuyo diseño influyó en muchos otros PRNG posteriores. Por lo tanto, es muy importante históricamente. También conocido como el generador de Tausworthe. |
Generador Wichmann & Hill | BA Wichmann; Colina DI | mil novecientos ochenta y dos | [once] | Una combinación de tres LCG pequeños adecuados para procesadores de 16 bits. Ampliamente utilizado en muchos programas, por ejemplo, se usó en Excel 2003 y algunas versiones posteriores para la función RAND en Excel y fue el generador predeterminado en Python hasta la versión 2.2. |
Regla 30 | Wolfram, Esteban | 1983 | [12] | Generador basado en autómatas celulares. |
Generador Blum-Blum-Shub | Bloom, Manuel ; L.Blum; M. Shub | 1986 | [13] | Es considerado uno de los generadores más seguros desde el punto de vista criptográfico, principalmente por la incorporación en su fórmula de investigaciones y conceptos tomados de la teoría de números. Por este algoritmo de Blum , Manuel recibió el Premio Alan Turing de 1995. |
generador park-miller | Parque SK; kw molinero | 1988 | [catorce] | Una implementación concreta del generador Lehmer, muy utilizado porque está incluido en C++ como la función minstd_rand0 desde C++11. |
BELLOTA | RS Wikramaratna | 1989 | [quince] | Su nombre proviene del acrónimo inglés ACORN, que significa ″Número aleatorio congruente aditivo″. |
MIXMAX | GK Sabiduría; NG Ter-Arutyunyan-Savvidy | 1991 | [dieciséis] | Este es un generador que pertenece a la clase de generadores lineales congruentes de matrices, una generalización del método de congruencias lineales. La lógica de la familia de generadores MIXMAX se basa en los resultados de la teoría ergódica y la mecánica clásica. |
Agregar con llevar | G. Marsaglia | 1991 | [17] | Modificación de generadores de Fibonacci con retraso. |
Restar con préstamo | G. Marsaglia; A. Zamán | 1991 | [17] | Algoritmo derivado de generadores de Fibonacci con retardo. |
isaac | RJ Jenkins Jr. | 1993 | [Dieciocho] | Generador de datos criptográficos criptográficamente seguros (CSPRNG) desarrollado por Robert J. Jenkins. |
Mersenne Twister, Montana | M. Matsumoto; T. Nishimura | 1996 | [19] | Este es probablemente el generador más conocido de esta lista, principalmente porque es un algoritmo implementado en la función RAND de los lenguajes de programación Python y R, además de su fuerte presencia en juegos electrónicos como Pro Evolution Soccer (PES). |
Xorshift | G. Marsaglia | 2003 | [veinte] | Este es un subtipo muy rápido de generadores LFSR. Marsaglia también propuso un generador xorwow como mejora, en el que la salida del generador xorshift se suma con una secuencia de Weyl. El generador xorwow es el generador predeterminado en la biblioteca nVidia CUDA API CURAND para GPU. |
Algoritmo de fortuna | Schneier, Bruce ; nils ferguson | 2003 | [21] | El algoritmo se considera criptográficamente seguro. CSPRNG, bien conocido por estar integrado en los sistemas y productos de Apple. |
Lineal de período largo bien equidistribuido (WELL) | F. Panneton; P. L'Ecuyer; Matsumoto | 2006 | [22] | Un algoritmo conocido como complemento del Mersenne Twister (MT), que busca deliberadamente ocultar sus debilidades. |
Sistema de Aleatorización Avanzado (ARS) | J. Salmón; M. Moraes; R. Dror; d shaw | 2011 | [23] | Una versión simplificada del cifrado de bloque AES que proporciona un rendimiento muy alto en un sistema compatible con AES-NI. |
tres fritos | J. Salmon, M. Moraes, R. Dror y D. Shaw | 2011 | [23] | Una versión simplificada del cifrado de bloques Threefish adecuado para la implementación de GPU. |
filox (filox) | J. Salmon, M. Moraes, R. Dror y D. Shaw | 2011 | [23] | Simplificación y modificación del cifrado de bloque Threefish con la adición de S-box. |
Generador Congruencial Permutado (PCG) | ME O'Neill | 2014 | [24] | Modelo obtenido por el método lineal congruente. |
Generador de bits de ciclo aleatorio (RCB) | R. Cookman | 2016 | [25] | El RCB se describe como un generador de patrones de bits diseñado para superar algunas de las deficiencias de Mersenne Twist (MT) y la limitación de período corto/longitud de bits de los generadores de desplazamiento/módulo. |
Secuencia de Weyl cuadrada media RNG | B. Widynski | 2017 | [26] | Una variación del método original de cuadrados medios de John von Neumann. |
Xoroshiro128+ | D. Blackman; Santa Vigna | 2018 | [27] | Modificación del generador Xorshift de G. Marsaglia, uno de los generadores más rápidos en los procesadores modernos de 64 bits. Los generadores relacionados son xoroshiro128**, xoshiro256+ y xoshiro256***. |
MELG de 64 bits (MELG-64) | S. Harase; t.kimoto | 2018 | [28] | Implementación de generadores F2 lineales de 64 bits con período de Mersenne primario. |
Cuadrados RNG | B. Widynski | 2020 | [29] | Una versión basada en contador de Middle Square Weyl Sequence RNG. Similar en diseño al Philox, pero mucho más rápido. |
Itamaracá (Ita) | DH Pereira | 2021 | [treinta] | Conocido como el primer algoritmo PRNG basado en la función de valor absoluto. Itamaracá es también un modelo simple y rápido que genera secuencias aperiódicas de números aleatorios. |
Una solución alternativa es crear un conjunto de una gran cantidad de números aleatorios y publicarlo en algún tipo de diccionario , llamado " bloque de una sola vez ". Sin embargo, incluso estos conjuntos proporcionan una fuente de números muy limitada en comparación con el número requerido por las aplicaciones de seguridad de la red. Si bien estos conjuntos proporcionan aleatoriedad estadística, no son lo suficientemente seguros, ya que un atacante podría obtener una copia del diccionario.
Ningún algoritmo determinista puede generar números completamente aleatorios, solo puede aproximar algunas de sus propiedades. Como dijo John von Neumann , " Cualquiera que tenga debilidad por los métodos aritméticos para obtener números aleatorios es un pecador sin duda ".
Cualquier PRNG con recursos limitados tarde o temprano se atasca: comienza a repetir la misma secuencia de números. La duración de los ciclos PRNG depende del propio generador y es aproximadamente , donde es el tamaño del estado interno en bits, aunque los generadores lineales congruentes y LFSR tienen ciclos de orden máximo [31] . Si la secuencia PRNG generada converge en ciclos demasiado cortos, dicho PRNG se vuelve predecible e inadecuado para aplicaciones prácticas.
La mayoría de los generadores aritméticos simples, aunque rápidos, adolecen de muchas deficiencias graves:
En particular, el algoritmo RANDU , que se ha utilizado en computadoras centrales durante décadas , resultó ser muy pobre [32] [33] , lo que genera dudas sobre la confiabilidad de los resultados de muchos estudios que utilizan este algoritmo.
Junto con la necesidad de generar secuencias fácilmente reproducibles de números aleatorios, también existe la necesidad de generar números completamente impredecibles o simplemente completamente aleatorios. Dichos generadores se denominan generadores de números aleatorios (RNG - English random number generator, RNG ). Dado que dichos generadores se usan con mayor frecuencia para generar claves simétricas y asimétricas únicas para el cifrado, generalmente se crean a partir de una combinación de un PRNG criptográficamente fuerte y una fuente de entropía externa (y esta combinación ahora se conoce comúnmente como RNG).
Casi todos los principales fabricantes de microchips suministran RNG de hardware con varias fuentes de entropía, utilizando varios métodos para eliminar la previsibilidad inevitable. Sin embargo, por el momento, la velocidad de recolección de números aleatorios por parte de todos los microchips existentes (varios miles de bits por segundo) no iguala la velocidad de los procesadores modernos.
En la investigación moderna, se están haciendo intentos de utilizar la medición de las propiedades físicas de los objetos (por ejemplo, la temperatura ) o incluso las fluctuaciones cuánticas del vacío como fuente de entropía para RNG. [34]
En las computadoras personales, los autores de software RNG utilizan fuentes de entropía mucho más rápidas, como el ruido de la tarjeta de sonido o el contador del reloj del procesador . La recolección de entropía fue el punto más vulnerable del RNG. Este problema aún no está completamente resuelto en muchos dispositivos (como las tarjetas inteligentes ) que siguen siendo vulnerables de esta manera. [35] Muchos RNG utilizan métodos tradicionales probados, aunque lentos, de recolección de entropía, como medir la respuesta del usuario ( movimiento del mouse , etc.), como en PGP y Yarrow [36] , o interacciones entre hilos , como en Java seguro al azar.
Si se utiliza la hora actual como fuente de entropía, entonces para obtener un número entero de 0 a N , basta con calcular el resto de dividir la hora actual en milisegundos por el número N +1. La desventaja de este RNG es que produce el mismo número por un milisegundo.
Fuente de entropía | PRNG | Ventajas | Defectos | |
---|---|---|---|---|
/dev/aleatorio en UNIX / Linux | Contador de reloj del procesador, sin embargo, solo se recopila durante las interrupciones de hardware | LFSR , con hash de salida a través de SHA-1 | Disponible en todos los Unixes, una fuente confiable de entropía | Se “calienta” durante mucho tiempo, puede “atascarse” durante mucho tiempo o funciona como un PRNG ( /dev/urandom ) |
Milenrama de Bruce Schneier [36] | Métodos tradicionales | AES -256 y SHA-1 pequeño estado interno | Diseño flexible criptorresistente | Lento |
API criptográfica de Microsoft | Hora actual, tamaño del disco duro, memoria libre, número de proceso y nombre NETBIOS de la computadora | Hash MD5 del estado interno, tamaño de 128 bits | Integrado en Windows, no se atasca | Depende en gran medida del proveedor criptográfico (CSP) utilizado. |
Java seguro aleatorio | Comunicación entre hilos | SHA-1 - hash de estado interno (1024 bits) | Gran estado interno | Colección de entropía lenta |
RdRand por Intel [37] | corrientes de ruido | Construcción de PFS basada en la lectura de bits "aleatorios" de valores de corrientes [37] | Muy rápido, no se atasca. | El desarrollo original, las propiedades se dan solo de acuerdo con la aprobación de los desarrolladores. |
Uno de los criterios de que PRNG es criptográficamente fuerte es la incapacidad de distinguir los valores de salida de PRNG de una secuencia aleatoria independiente distribuida uniformemente en el intervalo. Sea una familia de PRNG , donde la cardinalidad del conjunto sea igual a . Como se mencionó anteriormente, es un conjunto finito de estados, es una distribución de probabilidad en el espacio de estado utilizado para seleccionar el estado inicial (semilla inglesa), es una función de transición, es el espacio de valores de salida, . Por lo general , y el estado del generador viene dado por la fórmula recursiva para . valor de salida del generador ; es una secuencia de números pseudoaleatorios. Suponga que las funciones de transición y salida se pueden calcular en tiempo polinomial, potencias de . Sea una clase de pruebas estadísticas que intentan en tiempo polinomial distinguir los valores de salida del PRNG de una secuencia aleatoria independiente uniformemente distribuida en el intervalo . Una familia de PRNG se dice buena en términos de tiempo polinomial si existe tal que ninguna de las pruebas puede distinguir los valores de salida del PRNG de una secuencia aleatoria independiente uniformemente distribuida en el intervalo con probabilidad . [3]
Las aplicaciones criptográficas utilizan algoritmos deterministas para generar números aleatorios, generando así una secuencia de números que teóricamente no puede ser aleatoria estadísticamente. Al mismo tiempo, si elige un buen algoritmo, la secuencia numérica resultante ( números pseudoaleatorios ) pasará la mayoría de las pruebas de aleatoriedad. Una de las características de tal secuencia es un largo período de repetición. [3]
Ejemplos de PRNG criptográficamente fuertes conocidos son RC4 [31] , ISAAC [38] , SEAL [39] , SNOW [40] , un algoritmo Blum-Blum-Shub teórico muy lento [31] , así como contadores con hash criptográfico funciones o cifrados de bloque criptográficamente seguros en lugar de la función de salida [31] .
Además, los cifrados criptográficamente fuertes incluyen generadores con múltiples registros de desplazamiento , generadores con transformaciones no lineales y generadores de cifrado mayoritario A5/x . [31]
El generador de números aleatorios se cifra utilizando varias claves secretas obtenidas en cada etapa. Se utiliza un contador con un período largo como entrada al dispositivo de cifrado. Cuando se usa una clave DES de 56 bits , se puede usar un contador con un punto .
La secuencia pseudoaleatoria obtenida por este esquema tiene un período completo: cada valor de salida , , ... se basa en un valor de contador diferente, por lo tanto . Dado que la clave es secreta, cualquier clave secreta no depende del conocimiento de una o más claves secretas anteriores. Para aumentar la fuerza criptográfica del algoritmo, es necesario en cada paso cifrar un número aleatorio con un RNG - . [41]
PRNG del estándar ANSI X9.17 se utiliza en muchas aplicaciones de seguridad financiera y PGP . En el corazón de este PRNG se encuentra triple DES . El generador ANSI X9.17 consta de las siguientes partes:
Los valores aleatorios de entrada son y . es el valor de salida. El cálculo sin conocimiento no es posible en un tiempo razonable y, por lo tanto, el siguiente valor pseudoaleatorio , ya que se realizan tres operaciones de cifrado adicionales para obtener. [42]
Aparte de los obsoletos y conocidos generadores LFSR que se utilizaron ampliamente como PRNG de hardware en el siglo XX, se sabe muy poco sobre los PRNG de hardware modernos, ya que la mayoría de ellos se desarrollan con fines militares o están patentados y se mantienen en secreto . Los generadores RLOS basados en hardware Toyocrypt y LILI-128 fueron pirateados mediante ataques algebraicos [43] [44] .
En la actualidad, se conoce sobre el uso de PRNG hardware implementados en base a ruido de baja potencia en circuitos eléctricos. [45]
El generador de números aleatorios para loterías es un complejo de hardware y software que se utiliza en las loterías en las que es necesario adivinar una combinación de un número determinado de números. Cualquiera de los números posibles tiene la misma probabilidad de ocurrir.
Los intentos de crear un generador de números aleatorios se remontan al 3500 a. mi. y están asociados con el antiguo juego de mesa egipcio Senet . En Senet, dos jugadores juegan en dos lados. Los movimientos se determinan usando 4 palos planos, que pueden considerarse un generador de números aleatorios de esa época. Lanza los cuatro palos a la vez. La puntuación es la siguiente: 1 palo cayó con el lado blanco hacia arriba: 1 punto y un lanzamiento adicional; 2 - 2 puntos; 3 - 3 puntos, 4 - 4 y una tirada extra. Uno de los lados del palo es negro y si los cuatro palos caen con el lado negro hacia arriba, este es el resultado máximo: 5 puntos y un tiro adicional.
El conocido generador de números aleatorios ERNIE se ha utilizado durante muchos años para determinar los números ganadores de la lotería británica.
Los principales requisitos para el software y el equipo utilizados para realizar loterías en la Federación Rusa están establecidos por la Ley Federal No. 138-FZ del 11 de noviembre de 2003 "Sobre Loterías":
En las loterías estatales rusas (Gosloto 5 de 36, Gosloto 6 de 36, Gosloto 6 de 45, Gosloto 7 de 49, Gosloto 4 de 20, "Sportloto" 6 de 49 "") [ 47] Se utilizan tambores de lotería de carga para determinar los ganadores . Los sorteos se retransmiten en directo. [48]
En las loterías estatales rusas ("Rapido", "Keno-Sportloto", "Top-3", "12/24", "Todo por cien"), se utiliza un generador de números aleatorios para determinar los ganadores: un hardware y software sistema certificado por ANO “MIC” y cumpliendo las recomendaciones de FSUE VNIIMS . El dispositivo genera un flujo continuo de ruido aleatorio, que se convierte en números. En un momento dado, se arrebatan del flujo los valores actuales, que son la combinación ganadora de la lotería. [49]
En 2015, el ex director de seguridad de la Asociación de Loterías Multiestatales de EE. UU. , después de ganar $ 16,5 millones, que tenía acceso al software utilizado en los sorteos de lotería, fue acusado de usar algoritmos especiales para determinar la combinación ganadora de la lotería durante varios días al año. [cincuenta]