În primul rând, câteva definiții:
- Un PRNG este un generator de numere pseudoaleatoare. Poate fi unul foarte slab, sau unul cu proprietăți matematice foarte puternice. Nu contează pentru această definiție.
- Un CSPRNG este a PRNG securizat criptografic. Este un PRNG, cu unele cerințe puternice.
În dumneavoastră legătură, autorul scrie despre CSPRNG-uri, dar numindu-le PRNG-uri. Elementul „criptografic sigur” este implicat de această cerință:
Șirurile de biți generate ar trebui să „arate aleatoriu” unui adversar.
Într-adevăr, CSPRNG sunt necesare atunci când ieșirea PRNG trebuie să fie imposibil de distins de aleatorietatea perfect uniformă (aceasta implică că ieșirea este imprevizibilă). Acest lucru este cerut de unii algoritmi criptografici.
Majoritatea CSPRNG furnizate de sistemele de operare își vor actualiza starea internă de la intrare aleatorie, astfel încât, chiar dacă semințele sau starea interioară se scurg la un moment dat, se va corecta automat la o stare securizată. Dar aceasta nu este o cerință pentru un CSPRNG. Unele CSPRNG furnizate de bibliotecile criptografice nu își actualizează starea automat, în timp ce altele fac.
CSPRNG poate fi folosit întotdeauna în loc de PRNG atunci când nu este nevoie să se poată genera aceeași ieșire de două ori. De exemplu, când se generează niveluri de jocuri video dintr-o sămânță sau când fuzzing, este important să puteți reproduce rezultatul. În acest caz, ar trebui utilizat un PRNG sau un CSPRNG care nu își actualizează automat starea interioară din alte surse decât sămânța sa inițială. Ar putea fi folosit și un cifru de flux, dar un simplu PRNG ar putea fi mai mult decât destul și altele eficient, in functie de cerinte.
Pentru a răspunde direct la întrebările dvs.: trebuie să utilizați un CSPRNG atunci când este specificat de algoritmul criptografic (ceea ce este adesea cazul). Și trebuie să utilizați un PRNG sau un CSPRNG care nu își actualizează automat starea interioară atunci când este necesară reproducerea ieșirii sale. Pentru celelalte cazuri, de cele mai multe ori ce fel de RNG utilizați nu contează.
De asemenea, dacă aveți nevoie într-un fel de o ieșire reproductibilă care nu poate fi distinsă de aleatorietatea perfect uniformă, atunci aveți nevoie de o stream cipher, nu un PRNG.