Sono preoccupato che un PRNG SHA-1 non possa produrre una chiave di crittografia AES-256 con i previsti 256 bit di sicurezza, o addirittura una chiave cifrata sicura in cui sono previsti oltre 165 bit di sicurezza.
SHA-1 PRNG è l'unico generatore di numeri casuali sicuro puro Java fornito da Java senza librerie di terze parti. (Sono pienamente a conoscenza di librerie di terze parti che offrono altri algoritmi.) Un'implementazione può essere vista qui . L'algoritmo inizia con uno stato costituito da 160 bit estratti da una fonte esterna. Poiché l'algoritmo utilizza questi dati tiene traccia di quale byte è stato utilizzato per l'ultima volta, un numero compreso tra uno e venti e richiede altri 5 bit di informazioni da rappresentare.
Una volta esauriti i 160 bit, i successivi 160 bit vengono ricavati calcolando:
stato (n + 1) = stato (n) + SHA1 (stato (n)) + I (SHA1 (stato (n))
dove I (x) = 1 se x = 0 e I (x) = 0 se x! = 1
Questo è interamente determinato dai 160 bit di stato esistenti.
Ciò significa che se si forniscono a qualcuno 165 bit di informazioni, è possibile calcolare l'output dal PRNG SHA-1 in qualsiasi momento futuro. Quindi se ho un codice AES-256 e so che la chiave è stata generata usando SHA-1 PRNG, devo solo testare 2 ^ 165 combinazioni possibili, non 2 ^ 256. Ciò sembrerebbe indebolire significativamente il codice.
Siccome la legge sulla conservazione delle informazioni dice che le informazioni non possono mai essere create, non vedo alcun modo in cui un algoritmo il cui stato interno consista di soli 165 bit di informazione possa mai emettere 256 bit di informazione.
Se ciò è vero, e SHA-1 PRNG fornito con Java può generare solo chiavi deboli, che cosa si dovrebbe fare?
Esiste una risorsa che elenca il numero di bit di informazioni incorporati in una funzione PRNG sicura in modo da garantire che l'algoritmo abbia più bit della chiave di crittografia?