Đối với CSPRNG, tôi muốn nói rằng thực tế là nó có thể lặp lại các khối là một điều tốt; dự đoán rằng một mô hình không thể lặp lại là vấn đề. Lý do duy nhất tại sao nó thường được chấp nhận là cơ hội lặp lại các khối lớn hơn là không đáng kể.
Giả sử bạn muốn sử dụng CSPRNG để tạo một tập hợp các khối 128 bit, kích thước khối của AES. một triệu là khoảng $2^{20}$. bạn sẽ mong đợi một cơ hội của $1 - (1 - {1 \over 2^{128}})^{1000000} \approx 2^{-108}$ để khối ban đầu được lặp lại và ${1000000 \over 2^{128}} \approx 2^{-(128 - 20)} = 2^{-108}$ đối với bất kỳ va chạm nào trong một triệu khối đầu tiên xảy ra. Lý do tại sao các giá trị này gần giống nhau là vì một triệu chẳng là gì đối với các giá trị 128 bit. Như bạn có thể thấy, khả năng xảy ra va chạm thấp đến mức có thể coi là không đáng kể. Đây là lý do tại sao mật mã dòng như AES-CTR có thể được coi là chính CSPRNG.
Nói chung, CSPRNG có trạng thái bên trong lớn, điều đó có nghĩa là không thể biết khi nào PRNG lặp lại. Quan trọng hơn, cơ hội mà họ đạt được một đi xe đạp cực kỳ thấp (nếu một chu kỳ bị tấn công thì CSPRNG sẽ tạo ra cùng một mẫu - lớn - lặp lại). Vì vậy, do tính không thể đoán trước, bạn có thể sử dụng CSPRNG làm mật mã luồng. Tất nhiên, điều này cũng đúng với AES / CTR, nếu bạn nhìn vào các mẫu khác với 128 bit ở chính xác đúng vị trí. Rõ ràng là một mẫu của một bit sẽ lặp lại cực kì thường xuyên - chỉ là bạn không thể biết mình sẽ tìm thấy giá trị bit nào ở một vị trí nhất định. Vấn đề với AES-CTR là nó sẽ đạt một chu kỳ chính xác sau khi bộ đếm đã cạn kiệt.
Tuy nhiên, vì nhiều CSPRNG triển khai chưa được thiết kế để tạo ra cùng một luồng xác định, bạn nên cực kỳ cẩn thận của việc sử dụng một như một mật mã dòng. Chẳng hạn, chúng có thể gieo lại, sử dụng hạt giống đã cho làm entropy bổ sung, tạo đầu ra khác khi các phương thức được gọi khác nhau hoặc thậm chí sửa đổi thuật toán. Nếu không may, bạn sẽ không bao giờ có thể tạo lại cùng một luồng khóa và dữ liệu của bạn sẽ bị mất (xem ví dụ: getRawKey()
trên thiết bị Android).
Tất nhiên, AES-CTR nói chung cũng sẽ nhanh hơn rất nhiều so với CSPRNG. Nếu bạn không thích AES hoặc không có khả năng tăng tốc phần cứng thì mật mã luồng chẳng hạn như ChaCha thường là cách tốt nhất. Thông thường, bạn sẽ sử dụng các mật mã này trong chế độ được xác thực bằng GMAC (AES-GCM) hoặc Poly1305.
Trong tài liệu về mật mã, bạn sẽ thường thấy rằng các thuật ngữ "mật mã dòng" và "CSPRNG" được sử dụng thay thế cho nhau, nhưng hãy cẩn thận với những khác biệt thực tế trong hai phần cuối.