Đầu tiên, một số định nghĩa:
- PRNG là một trình tạo số giả ngẫu nhiên. Nó có thể là một cái rất kém, hoặc một cái có tính chất toán học rất mạnh. Nó không quan trọng đối với định nghĩa này.
- CSPRNG là một PRNG bảo mật bằng mật mã. Nó là một PRNG, với một số yêu cầu mạnh mẽ.
trong bạn liên kết, tác giả đang viết về CSPRNG, nhưng gọi chúng là PRNG. Yếu tố "bảo mật bằng mật mã" được ngụ ý bởi yêu cầu này:
Các chuỗi bit được tạo sẽ "trông ngẫu nhiên" đối với kẻ thù.
Thật vậy, CSPRNG được yêu cầu khi đầu ra của PRNG phải không thể phân biệt được với tính ngẫu nhiên hoàn toàn đồng nhất (điều này có nghĩa là đầu ra không thể đoán trước). Điều này được yêu cầu bởi một số thuật toán mật mã.
Hầu hết CSPRNG do hệ điều hành cung cấp sẽ cập nhật trạng thái bên trong của chúng từ đầu vào ngẫu nhiên, do đó ngay cả khi hạt giống hoặc trạng thái bên trong bị rò rỉ tại một số điểm, nó sẽ tự động sửa thành trạng thái bảo mật. Nhưng đây không phải là yêu cầu đối với CSPRNG. Một số CSPRNG được cung cấp bởi các thư viện mật mã không tự động cập nhật trạng thái của chúng, trong khi những CSPRNG khác thì có.
CSPRNG luôn có thể được sử dụng thay cho PRNG khi không cần có khả năng tạo ra cùng một đầu ra hai lần. Ví dụ: khi tạo cấp độ trò chơi điện tử từ hạt giống hoặc khi lông tơ, điều quan trọng là có thể tái tạo đầu ra. Trong những trường hợp đó, nên sử dụng PRNG hoặc CSPRNG không tự động cập nhật trạng thái bên trong của nó từ các nguồn khác ngoài hạt giống ban đầu của nó. Mật mã luồng cũng có thể được sử dụng, nhưng một PRNG đơn giản có thể nhiều hơn đầy đủ và hơn thế nữa có hiệu quả, tùy theo yêu cầu.
Để trả lời trực tiếp các câu hỏi của bạn: bạn phải sử dụng CSPRNG khi nó được chỉ định bởi thuật toán mật mã (trường hợp này thường xảy ra). Và bạn phải sử dụng PRNG hoặc CSPRNG không tự động cập nhật trạng thái bên trong của nó khi cần sao chép đầu ra của nó. Đối với các trường hợp khác, hầu hết thời gian bạn sử dụng loại RNG nào không quan trọng.
Ngoài ra, nếu bạn bằng cách nào đó cần một đầu ra có thể lặp lại không thể phân biệt được với tính ngẫu nhiên hoàn toàn đồng nhất, thì bạn cần một dòng mật mã, không phải là PRNG.