¿Cómo predecir C rand ()? [duplicar]

12

¿Hay alguna forma práctica de predecir la salida de C rand () anterior / siguiente si tengo algunos de los valores? ¿Cuántos valores necesito? ¿Tienen que ser consecuentes? Si depende del compilador, ¿para qué implementaciones es posible y cómo?

    
pregunta Smit Johnth 27.02.2013 - 20:16
fuente

1 respuesta

12

Depende de la implementación rand() ... el estándar (POSIX / Single Unix) proporciona una implementación de ejemplo pero cualquier sistema es libre de tener algo mejor.

Puede ver el código de ejemplo allí . Si se usa ese código exacto, entonces el estado interno es un número entero de 32 bits, y es suficiente para obtener dos valores de salida sucesivos de 16 bits para volver a calcular el estado interno. En realidad, cualquier 32 bits de salida es suficiente, con el algoritmo de reconstrucción genérico conocido como "fuerza bruta": no tomará mucho tiempo, para una computadora, probar todos los estados internos posibles de 32 bits hasta que se encuentre uno, que coincida con el Salida observada. Es posible volver a calcular el estado waaaaaaaaay más rápido haciendo un álgebra lineal, pero como la fuerza bruta funciona bien, ¿para qué molestarse?

En los sistemas Linux habituales, rand() es un alias para random() que es mucho mejor, pero aún no es "bueno", en lo que respecta a la aleatoriedad. La función srandom() aún inicializa el estado interno con una semilla de 32 bits, que es susceptible a la fuerza bruta. Usted acaba de perder los atajos de álgebra lineal; O, al menos, las cosas requieren un poco más de matemáticas. random() no es un PRNG criptográficamente seguro y su estado interno se puede reconstruir observando algunos bits de salida. El método más simple sigue siendo la fuerza bruta, y funciona bien.

(Además, si la aplicación no se molestó en llamar a srandom() , entonces la semilla inicial es siempre 1, por lo que la fuerza bruta funcionará muy bien ).

    
respondido por el Tom Leek 27.02.2013 - 20:45
fuente

Lea otras preguntas en las etiquetas