Come determinare lo stato di un generatore di numeri casuali?

3

È sempre stato detto che per ottenere forti numeri di crittografia nel calcolo, è necessario un buon generatore di numeri casuali. Senza una buona fonte di casualità, potrebbe essere possibile per un utente malintenzionato determinare lo stato del generatore di numeri casuali e prevedere i successivi numeri casuali. Ovviamente questo significa che hanno o potrebbero avere le tue chiavi di crittografia e cose del genere.

So che questo deve essere un attacco molto reale, ma l'ho sempre considerato uno teorico perché non ho idea di come sarebbe stato fatto. Quale sarebbe un buon scenario del mondo reale sarebbe in grado di sfruttare la prevedibilità di un generatore di numeri casuali non tanto buono (ma meglio di "la quantità di tempo da quando hai aperto il prompt dei comandi")?

Inoltre, sarebbe possibile generare una chiave con il suddetto generatore e quindi richiedere a un utente malintenzionato di ricreare quella chiave utilizzando solo una conoscenza approssimativa del sistema su cui è stato eseguito il generatore?

Oppure, sto completamente fraintendendo la vulnerabilità in un generatore di numeri casuali più poveri?

    
posta Nicholas Dechert 03.11.2016 - 17:00
fonte

1 risposta

3

Un numero elevato di protocolli sicuri dipende da numeri pseudo casuali casuali o sicuri. Anche gli ID di sessione creati dalla maggior parte delle applicazioni Web per tenere traccia di quale richiesta Web appartiene a quale utente dipende da stringhe casuali generate con numeri casuali.

Se, ad esempio, potessi prevedere l'id della sessione successiva generata da un'applicazione web, potrei dirottare questa sessione.

I numeri casuali vengono utilizzati per creare chiavi di sessione in vari protocolli (ssl, ssh, ...). Se potessi prevedere queste chiavi, potrei decifrare i dati inviati in queste sessioni. Vengono anche usati come valori nonce e, se posso prevederli, posso rompere un numero di protocolli che dipendono dal fatto che le nonces non siano prevedibili.

come arrivare allo stato

Per indovinare lo stato di un generatore di numeri casuali, di solito devi osservare molti numeri generati dal RNG.

Questo non significa che devi osservare l'applicazione che richiede questi numeri. Se si ha accesso allo stesso RNG (che è possibile se si ha accesso al server fisico in cui risiede l'applicazione della vittima), è possibile richiedere semplicemente un milione o dieci milioni di numeri utilizzando un altro programma. Ma di solito non si ha accesso diretto all'RNG, quindi è necessario osservare passivamente le telecomunicazioni per un lungo periodo o ingannare il server per fornire più di questi numeri (ad esempio, collegandosi come utente normale e richiedendo rotazione della chiave di crittografia 100 volte al secondo in un protocollo mal progettato che consente questo).

Una qualità di buoni generatori di numeri casuali è che hanno periodi molto lunghi, ad es. ci vuole un numero enorme di invocazioni prima che inizino a ripetersi.

Supponiamo ad esempio che tu abbia un generatore veramente cattivo che inizia a ripetere la sequenza di numeri dopo solo 256 invocazioni. Ora, se riesci a osservare alcuni di questi numeri casuali, puoi facilmente individuare in quale punto della sequenza si trova il generatore di numeri casuali e prevedere correttamente tutti i numeri futuri generati.

Un buon generatore dovrebbe anche emettere numeri che superano vari test statistici. Ciò significa che per esempio tutti i numeri nello spazio di output dovrebbero essere generati con la stessa frequenza, che non dovrebbero esserci pattern rilevabili (ad esempio l'RNG sempre alternando numeri pari e dispari) ecc.

Se riesci a rilevare un modello specifico in un RNG, oltre a essere in grado di prevedere parti di un futuro numero "casuale", potresti capire che questo schema si verifica sempre quando gli 8 bit meno importanti nel RNG sono in una certa configurazione. Se sei riuscito a identificare alcuni di questi pattern che ti permettono di dedurre parti dello stato del RNG, potresti combinare queste osservazioni per ottenere una parte più ampia dell'intero stato.

I buoni RNG dovrebbero tenere conto dell'intero stato per ogni bit di output che producono. Ma dì che ne hai uno che non lo fa. Ad esempio, si supponga di avere un RNG che produce numeri il cui bit più basso dipende solo da un singolo bit di stato RNG. Ciò significa che l'RNG perde parte del suo stato interno con ogni numero che produce. E se il bit più basso dipendesse invece da due bit di stato interno, l'RNG avrebbe comunque perso importanti informazioni probabilistiche sullo stato di questi due bit con ogni numero prodotto.

    
risposta data 03.11.2016 - 17:44
fonte