2015-09-01 12 views
9

Come sappiamo, il Mersenne Twister is not crytographically secure:Esiste un CSPRNG C++ 11?

Mersenne Twister non è crittograficamente sicuro. (MT si basa su una ricorsione lineare. Qualsiasi numero di sequenza pseudocasuale generato da una ricorsività lineare è insicuro, poiché da sufficientemente lungo subsequencje delle uscite, si può prevedere il resto delle uscite.)

Ma molte fonti, come Stephan T. Lavavej e anche this website. Il consiglio è quasi sempre (testualmente) per utilizzare il Mersenne Twister come questo:

auto engine = mt19937{random_device{}()}; 

vengono in diversi gusti, come l'utilizzo di std::seed_seq o complicati modi di manipolare std::tm, ma questo è l'approccio più semplice.

Anche se std::random_deviceis not always reliable:

std::random_device può essere attuata in termini di un motore numero pseudo-casuale definito dall'implementazione se una sorgente non deterministica (ad esempio un dispositivo hardware) non è disponibile per l'implementazione. In questo caso, ogni oggetto std::random_device può generare la stessa sequenza numerica.

Il /dev/urandom vs /dev/random dibattito rages on.

Ma mentre la libreria standard fornisce una buona raccolta di PRNG, non sembra fornire alcun CSPRNG. Preferisco attenermi alla libreria standard piuttosto che usare POSIX, intestazioni solo Linux, ecc. È possibile manipolare il Mersenne Twister per renderlo crittograficamente sicuro?

+0

Per downsoter, come posso migliorare la mia domanda? – user5287986

+0

Not downvoter (in realtà upvoted), ma penso che dovresti rendere i link cliccabili. – dandan78

+11

* Il Mersenne Twister può essere manipolato per renderlo crittograficamente sicuro? * No. –

risposta

5

Visual Studio garantisce che random_device è crittograficamente sicuro e non-deterministica: https://msdn.microsoft.com/en-us/library/bb982250.aspx

Se volete qualcosa di più veloce o cross-platform, si potrebbe ad esempio uso GnuTLS: http://gnutls.org/manual/html_node/Random-number-generation.html Esso fornisce numeri casuali di qualità regolabile. GNUTLS_RND_RANDOM è quello che vuoi, penso.

Come molte persone hanno già detto, si prega di dimenticare MT in contesti crittografici.