Esiste un modo pratico per prevedere l'output C / R precedente / successivo se ho alcuni valori? Di quanti valori ho bisogno? Devono essere conseguenti? Se dipende dal compilatore - per quali implementazioni è possibile e come?
Esiste un modo pratico per prevedere l'output C / R precedente / successivo se ho alcuni valori? Di quanti valori ho bisogno? Devono essere conseguenti? Se dipende dal compilatore - per quali implementazioni è possibile e come?
Dipende dall'implementazione rand()
... lo standard (POSIX / Single Unix) fornisce un'implementazione di esempio ma qualsiasi sistema è libero di avere qualcosa di meglio.
Puoi vedere il codice di esempio lì . Se viene utilizzato quel codice esatto, lo stato interno è un numero intero a 32 bit e è sufficiente ottenere due valori di uscita a 16 bit successivi per ricalcolare lo stato interno. In realtà, qualsiasi 32 bit di output sono sufficienti, con l'algoritmo di ricostruzione generico noto come "forza bruta": non ci vorrà molto tempo, per un computer, per provare tutti i possibili stati interni a 32 bit finché non si trova uno, che corrisponde al uscita osservata. È possibile ricalcolare lo stato waaaaaaaaay più velocemente facendo qualche algebra lineare, ma dato che la forza bruta funziona bene, perché preoccuparsi?
Nei soliti sistemi Linux, rand()
è un alias per random()
che è molto meglio, ma non ancora "buono", per quanto riguarda la casualità. La funzione srandom()
inizializza ancora lo stato interno con un seme a 32 bit, che è suscettibile di forza bruta. Perdi le scorciatoie algebriche lineari; o, almeno, le cose richiedono un po 'più di matematica. random()
non è un PRNG crittograficamente sicuro e il suo stato interno può essere ricostruito osservando alcuni bit di uscita. Il metodo più semplice è ancora forza bruta, e funziona bene.
(Inoltre, se l'applicazione non si preoccupa di chiamare srandom()
, il seed iniziale è sempre 1, quindi la forza bruta funzionerà molto .