Permettetemi di integrare le altre risposte spiegando, con un certo livello di dettaglio, come funziona un PRNG con un pool di entropia. Questa è una semplificazione eccessiva, poiché l'attuale implementazione di Linux utilizza più pool. Ma dovrebbe aiutarti a darti un'idea di base su come funziona lo schema.
In primo luogo, contiene tre parti chiave:
-
Un pool di entropia. Questo è fondamentalmente solo una serie di byte. Un obiettivo chiave del sistema è garantire che un utente malintenzionato non conosca questi byte.
-
Un PRNG. Questo è un componente algoritmico che opera sul pool di entropia per produrre output casuali.
-
Una raccolta di sonde entropiche. Questa casualità 'mia' da cose come la rete e l'attività del disco e li aggiunge al pool di entropia.
Il PRNG "disegna" il pool di entropia. L'algoritmo esatto è complicato, ma l'idea di base è che esegua un'operazione di hash crittograficamente protetta sul pool, restituisca parte dell'hash e misuri parte dell'hash nel pool. (Nel codice Linux corrente, in realtà utilizza due operazioni SHA1.)
Le sonde "riempiono" il pool di entropia. L'algoritmo esatto è ancora più complicato (GFSR intrecciato), ma l'idea di base è che il pool viene mescolato e quindi varie informazioni provenienti dalle sonde sono XORed nel pool.
Inoltre, il sistema mantiene una misura di quanto entropia è presente nel pool. Presume che produrre output casuali "esaurisce" il pool e che l'aggiunta di entropia "riempie" il pool. C'è un senso teorico in cui questo è vero, ma in effetti non importa.
Ad esempio, si supponga che un pool di 2048 byte e un utente malintenzionato non sappiano nulla sul contenuto del pool. E poi supponiamo di vedere 8 byte di output dal pool. In teoria, ciò esclude tutti, tranne 1 in 2 ^ 64 possibili condizioni iniziali e lascia solo quelli che produrrebbero quegli esatti 8 byte. Ma non è noto, o addirittura concepibile, che un utente malintenzionato possa utilizzare tali informazioni.
Senza aggiungere entropia aggiuntiva e con 1 GB di output dal PRNG, un utente malintenzionato ha tutte le informazioni di cui ha bisogno per capire le condizioni iniziali del pool e prevedere il prossimo output dal pool. Il problema è che non esiste un metodo noto per farlo oltre a provare tutte le possibili condizioni iniziali 2 ^ (8 * 2048).
Ai fini pratici, ci sono solo due attacchi possibili:
-
Indovina il contenuto aggiunto del pool. Questo fallisce se ci sono più di, ad esempio, 128-bit di dati sconosciuti mescolati nel pool Un utente malintenzionato non può provare 2 ^ 128 o più combinazioni.
-
Indovina il contenuto del pool in un secondo momento. Ma questo richiede di indovinare il intero pool.
In sintesi, a meno che non ci sia un difetto nell'algoritmo, l'output dal pool non rivela informazioni utili sul contenuto del pool. Fintanto che un attaccante non può predire o indovinare tutte le informazioni mescolate nella riserva fino al punto in cui hai tirato fuori dal pool, non può prevedere cosa uscirà dal pool. (Supponendo che non possa guardare all'interno della piscina stessa, ovviamente!)