Come prevedere C rand ()? [duplicare]

12

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?

    
posta Smit Johnth 27.02.2013 - 20:16
fonte

1 risposta

12

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 . 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 .

    
risposta data 27.02.2013 - 20:45
fonte

Leggi altre domande sui tag