Quando generi una chiave privata, lo fai con una fonte di casualità. Se tale fonte di casualità può emettere N diversi flussi di bit, allora, al massimo, si può ottenere N una chiave privata diversa. Qui è dove ci piace parlare di entropy , che è una misura di quanto è grande N . Quando si dice che la fonte della casualità offre "100 bit di entropia", significa che (approssimativamente) N = 2 100 .
L'utente malintenzionato vorrà ottenere la tua chiave privata. Se sa che usi una sorgente debole con un N basso (ad esempio, solo 40 bit di entropia), allora può, sulla propria macchina, enumerare tutti i possibili output dalla sorgente casuale e risolvere la chiave privata corrispondente.
Ad esempio, supponiamo di aver usato un seme PRNG con l'ora corrente, espresso in microsecondi. Questo è l'ora conosciuta dalla tua macchina. L'attaccante presume che la tua macchina sia ragionevolmente ben impostata con l'ora corrente, diciamo entro 10 secondi. Quindi, dal punto di vista dell'attaccante, il seme per il tuo PRNG è noto in un intervallo di 10 secondi; dal momento che il PRNG usa il tempo in microsecondi, questo lo lascia con N = 10000000 possibili semi. L'attaccante poi dice a se stesso: "SE quel tipo ha usato il valore di seme x , POI il suo codice ha prodotto il valore della chiave privata K x ; vediamo se questo corrisponde alla sua chiave pubblica ... No. Quindi non ha usato x . Proviamo ancora con x + 1 (e così via). "
Quindi un PRNG debole è mortale in tali situazioni.
Come puoi rilevare un PRNG debole? Beh, il più delle volte non puoi. Un PRNG molto povero può sembrare povero dall'inizio; ad esempio, se generi due chiavi private e ottieni il doppio della stessa, allora probabilmente c'è qualcosa di sbagliato ... ma, come mostra l'esempio "time as seed", questo non è sempre facile da rilevare: il tempo scorre continuamente, quindi tu mai riutilizzare un seme. Eppure questo è debole. Perché la debolezza deriva da quanto sia difficile indovinare lo stato interno della sorgente casuale, che non è lo stesso di essere statisticamente di parte.
Una grande distorsione statistica è rilevabile ed è un'evidente debolezza; ma un PRNG può essere debole senza essere rilevabile come tale.
Se sei un cattivo e vuoi fare un PRNG debole non rilevabile , allora puoi prendere una buona cifra di blocco (ad esempio, AES ), scegliere un valore chiave K e crittografare i valori successivi di un contatore, partendo da 0. Questo produrrà un flusso molto lungo di byte pseudocasuali che nessuno sarà in grado di dimostrare in modo non casuale, proprio perché AES è bravo nella crittografia delle cose. Ma tu, in quanto cattivo, conosci K , quindi puoi facilmente prevedere l'intero stream da solo.
L'unico modo affidabile per rilevare un PRNG debole è di esaminare il metodo esatto con cui funziona il PRNG, fino ai minimi dettagli: quali eventi fisici raccolgono, perché questi eventi possono essere considerati " casuale ", come sono mescolati insieme con algoritmi crittografici per produrre byte pseudocasuali. Non puoi farlo con un hardware RNG opaco, da qui l'attuale serie di voci.