¿Cómo se puede construir un nuevo generador de números pseudoaleatorios criptográficamente útil?

Ese es un desafío muy difícil.

Primero, existen herramientas para examinar distribuciones, aleatoriedad, etc. Probablemente desee crear una colección decente de esos, porque no hay otra forma obvia de probar la aleatoriedad.

En segundo lugar, están las características necesarias. Para ser criptográficamente seguro, no debe haber una cadena finita de salida que brinde suficiente información para conocer el estado interno y, por lo tanto, el siguiente número. Tampoco debe un atacante forzar errores en el cifrado (causando así que se soliciten más datos aleatorios) dar como resultado patrones explotables. El generador tampoco debe permitir que los datos de temporización expongan nada. Obviamente, esto debe demostrarse matemáticamente, pero ¿cómo es una pregunta que no puedo responder?

Así que ahora tenemos un conjunto de pruebas. Eso es bueno. Típicamente, los sistemas prng funcionan aplicando iterativamente funciones unidireccionales y luego obteniendo la salida aplicando otra función unidireccional a la salida. Los mejores sistemas parecen usar dos o tres funciones principales, rotando datos entre ellas. Debe tener un poco de cuidado, tales funciones generalmente no les gustan las entradas cortas. Linux usa información de hardware como una fuente adicional de aleatoriedad, para garantizar que sea lo más difícil posible predecir valores posteriores.

Mi sugerencia sería mucho estado interno y una fuente externa de aleatoriedad incidental.

He creado uno basado en el caos : ¿Son los números aleatorios realmente aleatorios si se generan a partir de algoritmos?