¿Es posible alimentar a una red neuronal la salida de un generador de números aleatorios y esperar que aprenda la función hash (o generador), para que pueda predecir cuál será el próximo número pseudoaleatorio generado ?
¿Ya existe algo como esto? Si ya se ha investigado sobre esto o algo relacionado (a la predicción de números pseudoaleatorios), ¿alguien puede señalarme los recursos correctos?
Actualmente, estoy mirando esta biblioteca y sus enlaces relacionados. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent
Respuestas:
Si estamos hablando de un RNG perfecto, la respuesta es un claro no . Es imposible predecir un número verdaderamente aleatorio, de lo contrario no sería realmente aleatorio.
Cuando hablamos de pseudo RNG, las cosas cambian un poco. Dependiendo de la calidad del PRNG, el problema varía de fácil a casi imposible. Por supuesto, un PRNG muy débil como el que publicó XKCD podría predecirse fácilmente por una red neuronal con poco entrenamiento. Pero en el mundo real las cosas se ven diferentes.
La red neuronal podría ser entrenada para encontrar ciertos patrones en el historial de números aleatorios generados por un PRNG para predecir el siguiente bit. Cuanto más fuerte sea el PRNG, se necesitarán más neuronas de entrada, suponiendo que esté usando una neurona por cada bit de aleatoriedad anterior generado por el PRNG. Cuanto menos predecible sea el PRNG, se necesitarán más datos para encontrar algún tipo de patrón. Para PRNG fuertes esto no es factible.
En una nota positiva, es útil que pueda generar una cantidad arbitraria de patrones de entrenamiento para la red neuronal, suponiendo que tenga control sobre el PRNG y que pueda producir tantos números aleatorios como desee.
Debido a que los PRNG modernos son un componente clave para la criptografía, se ha llevado a cabo una extensa investigación para verificar que son "lo suficientemente aleatorios" para resistir tales ataques de predicción. Por lo tanto, estoy bastante seguro de que no es posible con los recursos informáticos disponibles actualmente construir una red neuronal para atacar con éxito un PRNG que se considera seguro para la criptografía.
También vale la pena señalar que no es necesario predecir exactamente la salida de un PRNG para romper la criptografía; podría ser suficiente para predecir el siguiente bit con una certeza de un poco más del 50% para debilitar significativamente una implementación. Entonces, si puede construir una red neuronal que predice el próximo bit de un PRNG (considerado seguro para la criptografía) con una tasa de éxito del 55%, probablemente saldrá en los titulares de las noticias de seguridad durante bastante tiempo.
fuente
Siendo un novato en el aprendizaje automático, hice este experimento (usando Scikit-learn):
Generó un gran número (N) de extracciones pseudoaleatorias, utilizando la función python random.choices para seleccionar N números de 90.
Entrenó a un clasificador MLP con datos de entrenamiento compuestos de la siguiente manera:
En la práctica, apunté a una función que dado N números, podría predecir el siguiente.
Pidió al clasificador entrenado que prediga los números restantes.
Resultados:
por supuesto, el clasificador obtuvo una puntuación ganadora comparable con la de adivinanzas aleatorias u otras técnicas no basadas en redes neuronales (comparé los resultados con varios clasificadores disponibles en las bibliotecas de aprendizaje de scikit)
sin embargo, si genero extracciones de lotería pseudoaleatorias con una función de distribución específica, los números pronosticados por la red neuronal se generan aproximadamente con la misma curva de distribución (si traza las ocurrencias de los números aleatorios y las predicciones de la red neuronal, puedes ver que los dos tienen la misma tendencia, incluso si en la curva de predicciones hay muchos picos, ¿entonces quizás la red neuronal puede aprender sobre distribuciones de números pseudoaleatorios?
Si reduzco el tamaño del conjunto de entrenamiento por debajo de cierto límite, veo que el clasificador comienza a predecir siempre los mismos pocos números, que se encuentran entre los más frecuentes en la generación pseudoaleatoria. Por extraño que parezca (o tal vez no), este comportamiento parece aumentar ligeramente la puntuación ganadora.
fuente
Antigua pregunta, pero pensé que valía una respuesta práctica. Me topé con él justo después de mirar una guía de cómo construir dicha red neuronal, demostrando el eco de la randint de Python como ejemplo . Aquí está el código final sin una explicación detallada, aún bastante simple y útil en caso de que el enlace se desconecte:
¡Acabo de intentarlo y de hecho funciona bastante bien! Tomó solo un par de minutos en mi viejo netbook lento. Aquí está mi propia salida, diferente del enlace anterior y puede ver que la coincidencia no es perfecta, por lo que supongo que los criterios de salida son demasiado permisivos:
fuente
Si un generador de números aleatorios de psuedo está arrojando números, en el análisis de estos números podrá determinar el algoritmo que los produjo porque los números no son aleatorios, están determinados por ese algoritmo y no son casuales. Si el mundo está compuesto de leyes físicas que se pueden entender y replicar, la aparente aleatoriedad que observamos en los eventos se debe a esas leyes físicas. y el generador de psuedo ya no existe, y es una aleatoriedad real que, según su definición, es indeterminable y presenta una paradoja. ¿Cómo pueden las reglas crear aleatoriedad por definición? Nuestra percepción aparente de la aleatoriedad de los eventos que observamos es una alusión y, en realidad, es una certeza que no podemos predecir.
fuente
Además de lo que dijo Demento, la extensión de la aleatoriedad en el Algoritmo de generación de números aleatorios es la cuestión clave. Los siguientes son algunos diseños que pueden debilitar el RNG:
Secuencias ocultas
Supongamos que se trata de las pocas secuencias de caracteres anteriores generadas: (Solo se usa un ejemplo, para el uso práctico de un rango mayor)
Inicialmente, no puede observar ningún patrón en las generaciones, pero al cambiarlos a codificación Base64 y luego a hexadecimal, obtenemos lo siguiente:
Ahora, si restamos cada número del anterior, obtenemos esto:
Esto indica que el algoritmo simplemente agrega 0x97C4EB6A al valor anterior, trunca el resultado a un número de 32 bits y Base64 codifica los datos.
Lo anterior es un ejemplo básico. Los algoritmos y sistemas de ML actuales son lo suficientemente capaces de aprender y predecir patrones más complejos.
Dependencia del tiempo
Algunos algoritmos RNG usan el tiempo como la entrada principal para generar números aleatorios, especialmente los creados por los propios desarrolladores para ser utilizados dentro de su aplicación.
Siempre que se implementen algoritmos RNG débiles que parecen ser estocásticos, se pueden extrapolar hacia adelante o hacia atrás con una precisión perfecta en caso de que haya suficiente conjunto de datos disponible.
fuente