¿Es posible predecir random.random () de Python si se siembra constantemente con valores altos de entropía?

1

Me interesa entender si es posible predecir Python 3 random.random() cuando se siembran con un alto valor de entropía de un sistema físico, como un lanzamiento de dados.

En otras palabras, ¿es random.random() una buena función que toma "entropía" y la reduce a un valor delimitado determinista impredecible o no?

A mi entender, pasa todas las pruebas de aleatoriedad que encontré.

No me interesan las buenas prácticas y es mejor utilizar /dev/urandom , secretos u otras fuentes de buenos valores aleatorios. Eso es un hecho conocido.

Cosas a considerar:

  • El generador aleatorio se siembra con un alto valor de entropía y solo se usa una vez para generar un valor único desde el estado inicial antes de que se vuelva a sembrar.
  • El generador se siembra con una nueva semilla para cada número.
  • La semilla tiene una alta entropía, alrededor de 256 bits o una entropía o más.

La razón por la que quiero hacer esto es que me permita usar random.choise , que es una forma extremadamente conveniente de transformar una semilla en una opción. Aquí hay una implementación aproximada de la idea:

  1. random.random se siembra con una semilla de alta entropía.
  2. Se usa random.choice .
  3. random.random se siembra con una nueva semilla de alta entropía.
  4. Se usa random.choice .
  5. ... una y otra vez.

¿La lista de opciones resultante es predecible?

    
pregunta PyWebDesign 12.12.2017 - 15:26
fuente

2 respuestas

3

Si lo reinicia después de cada vez que dibuja un número, será tan seguro como con lo que lo reinicie. Piensa en esto, de esta manera. Su fuente de semilla genera una serie de números xi . Los ejecuta a través del generador de números aleatorios de Pythons, generando esencialmente una nueva serie de números f (x i ) . Dado que f no comprueba la distribución (y un generador de números aleatorios no debería), solo habrá aplicado una transformación bastante inútil.

Esto no significa que lo que estás haciendo es una buena idea. Me parece un truco feo. Los trucos feos introducen complejidades que pueden conducir a errores que pueden llevar a vulnerabilidades. Si yo fuera tú, solo escribiría mi propio método securePick y lo utilizaría. No debería tomar muchas líneas de código.

    
respondido por el Anders 12.12.2017 - 17:20
fuente
2

¿Es posible predecir los números random.random () de python? Si tiene acceso a la máquina, es determinista y absolutamente posible. Eso es cierto para todos los generadores de números pseudoaleatorios.

¿Puedes predecir el siguiente número según los números anteriores? En teoría, cualquier generador de números pseudoaleatorios se puede averiguar desde el exterior mirando hacia adentro, aunque en la práctica, un generador de números pseudoaleatorios fuerte llevará una cantidad de tiempo muy poco práctica.

Incluso si se reinicia cada vez que se usa, si la forma en que se reinicia no es realmente aleatoria, es un generador de pseudo números y todas las afirmaciones anteriores siguen siendo ciertas.

Si está sembrado con un número aleatorio verdadero, debes usar el generador de números aleatorios reales y evitar el generador de pseudo números.

Si pasara verdaderos números aleatorios para generar el generador de números aleatorios, ¿el resultado sería aleatorio? Esa es una pregunta interesante. Dependería de la implementación. Si la implementación fuera simplemente usar la semilla como el número aleatorio, y la semilla era un número aleatorio verdadero que se reiniciaba constantemente, entonces sí, sería aleatoria. En la mayoría de los casos, supongo, pasar un número aleatorio verdadero a un generador de números pseudoaleatorios haría que el número sea pseudoaleatorio. Esa es mi suposición educada, al menos, esa pregunta en particular sería más ideal para los expertos en criptografía que para los expertos en seguridad. Es una pregunta interesante, pero una vez más, no es práctico de ninguna manera que pueda pensar.

No puedo hablar demasiado sobre cómo strong python random.random() es, pero La documentación de Python para estados aleatorios :

  

Los generadores seudoaleatorios de este módulo no deben utilizarse con fines de seguridad. Use os.urandom () o SystemRandom si necesita un generador de números pseudoaleatorios seguro criptográficamente.

La respuesta corta es sí, es posible. random.random() parece específicamente que se usa para la aleatoriedad, no para la seguridad, así que úselo en consecuencia.

    
respondido por el Goose 12.12.2017 - 16:07
fuente

Lea otras preguntas en las etiquetas