Pregunta

Bien, supongo que esto es completamente subjetivo y demás, pero estaba pensando en las fuentes de entropía para generadores de números aleatorios. Resulta que la mayoría de los generadores están sembrados con la hora actual, ¿correcto? Bueno, tenía curiosidad sobre qué otras fuentes podrían usarse para generar números aleatorios (La definición libre) perfectamente válidos.

Usar múltiples fuentes (como tiempo + tiempo de búsqueda de HDD actual [Estamos siendo fantásticos aquí]) juntos crearía un "más aleatorio" número de una sola fuente? ¿Cuáles son los límites lógicos de la cantidad de fuentes? ¿Cuánto es realmente suficiente? ¿Se elige el tiempo simplemente porque es conveniente?

Disculpe si este tipo de cosas no está permitido, pero tengo curiosidad sobre la teoría detrás de las fuentes.

¿Fue útil?

Solución

El artículo de Wikipedia sobre Generador de números aleatorios de hardware enumera un par de fuentes interesantes para números aleatorios usando propiedades físicas.

Mis favoritos:

  • Una fuente de radiación de desintegración nuclear detectada por un contador Geiger conectado a una PC.
  • Fotones viajando a través de un espejo semitransparente. Los eventos mutuamente excluyentes (reflexión & # 8212; transmisión) se detectan y se asocian a "0". o "1" valores de bits respectivamente.
  • Ruido térmico de una resistencia, amplificado para proporcionar una fuente de voltaje aleatorio.
  • Ruido de avalancha generado por un diodo de avalancha. (¿Qué tan genial es eso?)
  • Ruido atmosférico, detectado por un receptor de radio conectado a una PC

La sección de problemas del artículo de Wikipedia también describe la fragilidad de muchos de estos fuentes / sensores. Los sensores casi siempre producen números cada vez más aleatorios a medida que envejecen / se degradan. Estas fuentes físicas deben verificarse constantemente mediante pruebas estadísticas que puedan analizar los datos generados, asegurando que los instrumentos no se hayan roto en silencio.

Otros consejos

SGI alguna vez usó fotos de una lámpara de lava en varias '' fases glob '' como fuente de entropía, que eventualmente se convirtió en un generador de números aleatorios de código abierto llamado LavaRnd .

Utilizo Random.ORG , proporcionan datos aleatorios gratuitos del ruido atmosférico, que utilizo para periódicamente volver a sembrar un Mersene-Twister RNG. Es lo más aleatorio posible sin dependencias de hardware.

No te preocupes por un " bueno " semilla para un generador de números aleatorios. Las propiedades estadísticas de la secuencia no dependen de cómo se siembra el generador. Sin embargo, hay otras cosas. preocuparse por. Consulte Errores en la generación de números aleatorios .

En cuanto a los generadores de números aleatorios de hardware, estas fuentes físicas deben medirse y el proceso de medición tiene errores sistemáticos. Puede encontrar '' pseudo '' números aleatorios para tener mayor calidad que "real" números aleatorios.

El kernel de Linux utiliza el tiempo de interrupción del dispositivo (mouse, teclado, discos duros) para generar entropía. Hay un buen artículo en Wikipedia sobre entropía.

Los RNG modernos se comparan con las correlaciones en las semillas cercanas y se ejecutan varios cientos de iteraciones después de la siembra. Entonces, la respuesta desafortunadamente aburrida pero verdadera es que realmente no importa mucho.

Hablando en general, el uso de procesos físicos aleatorios debe verificarse para que se ajusten a una distribución uniforme y de lo contrario se desvíen.

En mi opinión, a menudo es mejor usar un generador de números pseudoaleatorios muy bien entendido.

He usado un programa de cifrado que usaba el movimiento del mouse del usuario para generar números aleatorios. El único problema fue que el programa tuvo que pausar y pedirle al usuario que moviera el mouse al azar durante unos segundos para que funcione correctamente, lo que no siempre es práctico.

Encontré HotBits hace varios años: los números se generan a partir de la desintegración radiactiva, realmente números aleatorios .

Hay límites en la cantidad de números que puede descargar por día, pero siempre me ha divertido usarlos como semillas realmente, realmente aleatorias para RNG.

Algunos TPM (Trusted Platform Module) " chips " tener un hardware RNG. Desafortunadamente, el TPM (Broadcom) en mi computadora portátil Dell carece de esta característica, pero muchas computadoras vendidas hoy vienen con un RNG de hardware que utiliza procesos mecánicos cuánticos verdaderamente impredecibles. Intel ha implementado la variedad de ruido térmico.

Además, no use el tiempo actual solo para sembrar un RNG con fines criptográficos, o cualquier aplicación donde la imprevisibilidad sea importante. Probablemente esté bien usar algunos bits de bajo orden del momento junto con varias otras fuentes.

Una pregunta similar puede serle útil.

Lo siento, llego tarde a esta discusión (¿qué hace 3 años y medio ahora?), pero tengo un interés reavivado en la generación de PRN y fuentes alternativas de entropía. El desarrollador de kernel de Linux Rusty Russell recientemente tuvo una discusión sobre su blog sobre fuentes alternativas de entropía (otras que / dev / urandom ).

Pero, no estoy tan impresionado con sus elecciones; la dirección MAC de una NIC nunca cambia (aunque es única de todas las demás), y el PID parece un tamaño de muestra demasiado pequeño.

He incursionado con un Mersenne Twister (en mi caja de Linux) que está sembrado con el siguiente algoritmo Solicito cualquier comentario / retroalimentación si alguien está dispuesto e interesado:

  1. Cree un búfer de matriz de 64 bits + 256 bits * número de / proc archivos a continuación.
  2. Coloque el valor del contador de marca de tiempo (TSC) en los primeros 64 bits de este búfer.
  3. Para cada uno de los siguientes archivos / proc , calcule la suma SHA256:

    • /proc/meminfo
    • /proc/self/maps
    • /proc/self/smaps
    • /proc/interrupts
    • /proc/diskstats
    • /proc/self/stat

      Coloque cada valor hash de 256 bits en su propia área de la matriz creada en (1).

  4. Cree un hash SHA256 de todo este búfer. NOTA: podría (y probablemente debería) usar una función hash diferente completamente independiente de las funciones SHA: esta técnica se ha propuesto como una "protección". contra funciones hash débiles.

Ahora tengo 256 bits de datos de entropía aleatorios (suficientes) HOPEFULLY para sembrar mi Mersenne Twister. Utilizo lo anterior para completar el comienzo de la matriz MT (624 enteros de 32 bits) y luego inicializo el resto de esa matriz con el código del autor MT. Además, podría usar una función hash diferente (por ejemplo, SHA384, SHA512), pero necesitaría un buffer de matriz de diferente tamaño (obviamente).

El código original de Mersenne Twister requería una sola semilla de 32 bits, pero creo que eso es terriblemente inadecuado. Ejecutando " simplemente " 2 ^ 32-1 MT diferentes en busca de romper la criptografía no está fuera del alcance de las posibilidades prácticas en la actualidad.

Me encantaría leer los comentarios de alguien sobre esto. La crítica es más que bienvenida. Defenderé mi uso de los archivos / proc como se indica arriba porque están cambiando constantemente (especialmente los archivos / proc / self / * , y el TSC siempre produce un valor diferente valor (resolución de nanosegundos [o mejor], IIRC). He ejecutado pruebas rigurosas en este (por la suma de varios cientos de mil millones bits), y parece estar pasando con gran éxito. Pero eso es probablemente más testimonio de la solidez del Mersenne Twister como PRNG que de cómo estoy sembrando

Por supuesto, estos no son totalmente impermeables a que alguien los piratee, pero no veo que todos estos (y SHA *) sean pirateados y rotos en mi vida.

Algunos usan la entrada del teclado (tiempos de espera entre pulsaciones de teclas), escuché que creo que en una novela se puede usar la recepción estática de radio, pero, por supuesto, eso requiere otro hardware y software ...

Ruido en la parte superior del espectro de fondo de microondas cósmico. Por supuesto, primero debe eliminar algo de anisotropía, objetos en primer plano, ruido de detector correlacionado, velocidades de galaxias y grupos locales, polarizaciones, etc. Muchos persisten las dificultades .

La fuente de semilla no es tan importante. Más importante es el algoritmo generador de pseudo números. Sin embargo, he escuchado hace algún tiempo sobre la generación de semillas para algunas operaciones bancarias. Tomaron muchos factores juntos:

  • tiempo
  • temperatura del procesador
  • velocidad del ventilador
  • voltaje de la CPU
  • No recuerdo más :)

Incluso si algunos de estos parámetros no cambian mucho a tiempo, puede ponerlos en una buena función de hashing.

¿Cómo generar un buen número aleatorio?

¿Quizás podamos tener en cuenta un número infinito de universos? Si esto es cierto, que todo el tiempo se crean nuevos universos paralelos, podemos hacer algo como esto:

int Random() {
    return Universe.object_id % MAX_INT;
}

En cada momento deberíamos estar en otra rama de universos paralelos, por lo que deberíamos tener una identificación diferente. El único problema es cómo obtener el objeto Universe :)

¿Qué hay de girar un hilo que manipulará alguna variable en un bucle cerrado durante un período de tiempo fijo antes de que se elimine? Lo que termine depende de la velocidad del procesador, la carga del sistema, etc. Muy curioso, pero mejor que solo srand (time (NULL)) ...

  

No te preocupes por un " bueno " semilla para un generador de números aleatorios. Las propiedades estadísticas de la secuencia no dependen de cómo se siembra el generador.

No estoy de acuerdo con el consejo de John D. Cook . Si siembras el Mersenne Twister con todos los bits puestos a cero excepto uno, inicialmente generará números que son cualquier cosa menos aleatorios. Al generador le lleva mucho tiempo convertir este estado en algo que pase las pruebas estadísticas. Simplemente establecer los primeros 32 bits del generador en una semilla tendrá un efecto similar. Además, si todo el estado se establece en cero, el generador producirá ceros sin fin.

El código RNG escrito correctamente tendrá un algoritmo de siembra escrito correctamente que acepte, digamos, un valor de 64 bits y siembra el generador para que produzca números aleatorios decentes para cada entrada posible. Entonces, si está utilizando una biblioteca confiable, cualquier semilla servirá. Pero si hackeas tu propia implementación, entonces debes tener cuidado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top