Pentru un CSPRNG aș spune că faptul că poate repeta blocuri este a lucru bun; prezicerea că un model nu se poate repeta este problematică. Singurul motiv pentru care este de obicei acceptabil este că șansa de repetare a blocurilor mai mari este oricum neglijabilă.
Să presupunem că ați folosi un CSPRNG pentru a crea un set de blocuri de 128 de biți, dimensiunea blocului AES. Un milion este cam $2^{20}$. te-ai aștepta la o șansă de $1 - (1 - {1 \over 2^{128}})^{1000000} \aprox 2^{-108}$ pentru ca blocul inițial să fie repetat și {1000000 $ \peste 2^{128}} \aproximativ 2^{-(128 - 20)} = 2^{-108}$ pentru ca orice coliziune în primul milion de blocuri să aibă loc. Motivul pentru care aceste valori sunt aproximativ aceleași este că un milion este aproape nimic pentru valorile pe 128 de biți. După cum puteți vedea, probabilitatea unei coliziuni este atât de mică încât poate fi considerată neglijabilă. Acesta este motivul pentru care un cifr de flux precum AES-CTR poate fi considerat ca un CSPRNG în sine.
În general, CSPRNG-urile au o stare internă mare, ceea ce înseamnă că este imposibil de știut când se repetă PRNG. Mai important, șansa ca ei să lovească un ciclu este extrem de scăzută (dacă este lovit un ciclu, atunci CSPRNG ar genera același model - mare - în repetare). Deci, din cauza impredictibilității, puteți utiliza un CSPRNG ca stream cipher. Acest lucru este valabil și pentru AES / CTR, desigur, dacă te uiți la alte modele decât 128 de biți exact în locul potrivit. Evident, un model de un singur bit se va repeta extrem adesea - doar că nu poți ști ce valoare de biți vei găsi la o anumită poziție. Problema cu AES-CTR este că va atinge un ciclu exact după ce contorul a fost epuizat.
Cu toate acestea, deoarece multe CSPRNG implementari nu au fost proiectate pentru a genera același flux determinist, ar trebui să fiți extrem de atent de a utiliza unul ca un stream cipher. De exemplu, ei pot reînsămânța, pot folosi sămânța dată ca entropie suplimentară, pot genera rezultate diferite atunci când metodele sunt numite diferit sau chiar au algoritmul revizuit. Dacă aveți ghinion, nu veți putea niciodată să regenerați același flux de chei și datele dvs. s-ar pierde (vezi de ex. getRawKey()
pe dispozitive Android).
Desigur, AES-CTR va fi, în general, mult mai rapid decât un CSPRNG. Dacă nu vă place AES sau nu aveți accelerare hardware, atunci un cifru de flux precum ChaCha ar fi în mod normal calea de urmat. De obicei, ați folosi aceste cifruri într-un mod autentificat folosind GMAC (AES-GCM) sau Poly1305.
În literatura criptografică veți găsi adesea că termenii „cifrare în flux” și „CSPRNG” sunt folosiți interschimbabil, dar aveți grijă la diferențele practice din ultimele două secțiuni.