Generar un verdadero número aleatorio es difícil. La mayoría de las computadoras usan una combinación de algoritmos matemáticos y tanta entropía como puedan encontrar. Sin embargo, eso es más difícil de lo que uno podría imaginar.
Algoritmo
Primero, el algoritmo. Las computadoras usan algo llamado generador de números pseudoaleatorios (PRNG). Un PRNG toma un valor inicial y escupe bits o bytes que parecen aleatorios. Las secuencias de bytes de estos algoritmos deben pasar pruebas estadísticas estándar si el generador se considera seguro.
Los algoritmos también tienen períodos extremadamente largos. Es decir, aunque cada PRNG puede comenzar a repetir una secuencia en algún momento (ningún PRNG puede ser verdaderamente aleatorio), debe pasar un tiempo realmente largo (por ejemplo, 10 ^ 60 bytes) antes de que una secuencia repita su salida.
Un punto importante, cualquier PRNG producirá la misma secuencia dada la misma semilla. Esto no es un defecto, es por diseño. Ningún PRNG debe recibir la misma semilla, si se considera seguro.
Lo cual nos lleva al siguiente punto …
Semilla inicial o entropía
Cuando las personas de seguridad piensan en números aleatorios y sus generadores, piensan en términos de entropía. Esto se parece mucho al concepto de entropía en física. Cerca, pero no exactamente lo mismo. En cualquier caso, cuando queremos sembrar un PRNG, queremos bits que sean altamente entrópicos o no adivinables.
Ahora, a primera vista, esto puede parecer una tarea simple. No lo es.
Por ejemplo, algunos elementos que pueden parecer altamente entrópicos pero no lo son (podrían adivinarse o repetirse):
- Hora actual: adivinable
- ID del proceso: a menudo es la misma al reiniciar
- Tiempo de actividad: puede ser adivinable, a veces detectable
- Ruido ambiental: en una sala de máquinas puede ser constante o sin micrófono externo
- Cientos de subprocesos paralelos se ejecutan para generar datos, ¡pueden comportarse igual siempre!
- Temperatura ambiente: puede estar en estado estable
- Luz ambiental: computadoras a menudo en habitaciones interiores
- Ondas de radio ambientales: pueden verse abrumadas por los EM cercanos
Entonces, ¿cómo se generan las semillas más seguras?
Un método usa la desintegración radiactiva. Un contador Gieger o un detector similar escucha un isótopo radiactivo que rastrea el tiempo entre las desintegraciones o el recuento de desintegración dentro de un período de tiempo corto. La desintegración atómica en una escala de tiempo corta es verdaderamente aleatoria.
Otro método, y mi favorito personal, es usar una lámpara de lava con una cámara. En esta configuración, una lámpara de lava tiene un montón de líquido de colores burbujeantes flotando hacia arriba y hacia abajo y una cámara externa recoge la imagen y la convierte en un valor digital (a menudo con hash). La variabilidad fundamental del líquido en la lámpara crea la entropía. lavarand [dot] org solía ejecutar un servicio gratuito que suministraba números aleatorios generados por lámparas de lava. Lamentablemente, ya no.
Debo agregar que teóricamente / dev / random proporciona números aleatorios y / dev / srandom proporciona números aleatorios seguros. Sin embargo, ambos son a menudo PRNG y no pura generación de bits entrópicos. Si los valores de estas fuentes son verdaderamente seguros depende de la implementación del hardware.
Resumen
Los generadores de números aleatorios contienen dos partes: un generador inicial inicial entrópico y un generador de números pseudoaleatorios. La semilla se pasa al PRNG que proporciona la secuencia final de bytes de números aleatorios.