Permítame complementar las otras respuestas explicando, con cierto nivel de detalle, cómo funciona un PRNG con un grupo de entropía. Esto es un poco de una simplificación excesiva, ya que la implementación actual de Linux usa múltiples pools. Pero debería ayudar a darle una idea básica de cómo funciona el esquema.
Primero, contiene tres partes clave:
-
Un grupo de entropía. Esto es básicamente una matriz de bytes. Un objetivo clave del sistema es garantizar que un atacante no conozca estos bytes.
-
A PRNG. Este es un componente algorítmico que opera en el grupo de entropía para producir resultados aleatorios.
-
Una colección de sondas de entropía. Estas aleatorias 'mías' provienen de actividades como la red y el disco y las agregan al grupo de entropía.
El PRNG "saca" el grupo de entropía. El algoritmo exacto es complicado, pero la idea básica es que realiza una operación de hash criptográficamente segura en el grupo, genera parte del hash y mezcla parte del hash de nuevo en el grupo. (En el código de Linux actual, en realidad utiliza dos operaciones SHA1).
Las sondas "llenan" el grupo de entropía. El algoritmo exacto es aún más complicado (GFSR torcido), pero la idea básica es que la agrupación se mezcle y que la información de las sondas sea XOR en la agrupación.
Además, el sistema mantiene una medida de cuánta entropía hay en el grupo. Se supone que la producción aleatoria "agota" el grupo y que la adición de entropía "llena" el grupo. Hay un sentido teórico en el que esto es cierto, pero efectivamente no importa.
Por ejemplo, supongamos un conjunto de 2.048 bytes y un atacante que no sabe nada sobre el contenido del conjunto. Y luego supongamos que ve 8 bytes de salida de la agrupación. En teoría, eso descarta todas las condiciones iniciales posibles excepto 1 en 2 ^ 64 y deja solo aquellas que producirían esos 8 bytes exactos. Pero no hay una forma conocida, ni siquiera concebible, en que un atacante podría usar esa información.
Sin agregación de entropía adicional y con 1GB de salida del PRNG, un atacante tiene toda la información que necesita para determinar la condición inicial del grupo y predecir el próximo resultado del grupo. El problema es que no hay otro método conocido para hacerlo que no sea intentar todas las posibles condiciones iniciales de 2 ^ (8 * 2048).
A efectos prácticos, solo hay dos ataques posibles:
-
Adivina los contenidos añadidos de la agrupación. Esto falla si hay más de, digamos, 128 bits de datos desconocidos mezclados en el conjunto Un atacante no puede probar 2 ^ 128 o más combinaciones.
-
Adivina el contenido del grupo en algún momento posterior. Pero esto requiere adivinar todo .
En resumen, a menos que haya un defecto en el algoritmo, la salida de la agrupación no revela información útil sobre el contenido de la agrupación. Mientras un atacante no pueda predecir o adivinar todos la información mezclada en el grupo hasta el punto en que se extrajo del grupo, no puede predecir lo que saldrá del grupo. (¡Suponiendo que no pueda mirar dentro de la piscina, por supuesto!)