ประการแรก คำจำกัดความบางประการ:
- PRNG คือ เครื่องกำเนิดตัวเลขสุ่มหลอก. อาจเป็นสิ่งที่ไม่ดีหรือมีคุณสมบัติทางคณิตศาสตร์ที่แข็งแกร่งมาก ไม่สำคัญสำหรับคำจำกัดความนี้
- CSPRNG คือ PRNG ที่ปลอดภัยด้วยการเข้ารหัส. เป็น PRNG ที่มีข้อกำหนดบางอย่างที่เข้มงวด
ในของคุณ ลิงค์ผู้เขียนกำลังเขียนเกี่ยวกับ CSPRNG แต่เรียกมันว่า PRNG องค์ประกอบ "ความปลอดภัยในการเข้ารหัส" เป็นไปตามข้อกำหนดนี้:
สตริงบิตที่สร้างขึ้นควร "ดูสุ่ม" สำหรับฝ่ายตรงข้าม
แท้จริงแล้ว CSPRNG จำเป็นเมื่อเอาต์พุตของ PRNG ต้องแยกไม่ออกจากการสุ่มที่สม่ำเสมออย่างสมบูรณ์ สิ่งนี้จำเป็นสำหรับอัลกอริธึมการเข้ารหัสบางอย่าง
CSPRNG ส่วนใหญ่ที่ให้บริการโดยระบบปฏิบัติการจะอัปเดตสถานะภายในของตนจากการป้อนข้อมูลแบบสุ่ม ดังนั้นแม้ว่าเมล็ดหรือสถานะภายในจะรั่วไหลในบางจุด ก็จะแก้ไขตัวเองเป็นสถานะปลอดภัยโดยอัตโนมัติ แต่นี่ไม่ใช่ข้อกำหนดสำหรับ CSPRNG CSPRNG บางตัวที่ให้บริการโดยไลบรารีเข้ารหัสไม่อัปเดตสถานะโดยอัตโนมัติ ในขณะที่บางรายการอัปเดต
สามารถใช้ CSPRNG แทน PRNG ได้ตลอดเวลาเมื่อไม่จำเป็นต้องสร้างเอาต์พุตเดียวกันซ้ำสองครั้ง ตัวอย่างเช่น เมื่อสร้างระดับวิดีโอเกมจากเมล็ดพันธุ์ หรือเมื่อใด คลุมเครือสิ่งสำคัญคือต้องสามารถสร้างเอาต์พุตซ้ำได้ ในกรณีดังกล่าว ควรใช้ PRNG หรือ CSPRNG ซึ่งไม่อัปเดตสถานะภายในโดยอัตโนมัติจากแหล่งอื่นนอกเหนือจากเมล็ดเริ่มต้น นอกจากนี้ยังสามารถใช้รหัสสตรีมได้ แต่ PRNG แบบง่ายอาจมากกว่านั้น เพียงพอ และอื่น ๆ มีประสิทธิภาพขึ้นอยู่กับข้อกำหนด
ในการตอบคำถามของคุณโดยตรง คุณต้องใช้ CSPRNG เมื่อมีการระบุโดยอัลกอริทึมการเข้ารหัส (ซึ่งมักจะเป็นกรณีนี้) และคุณต้องใช้ PRNG หรือ CSPRNG ซึ่งไม่อัปเดตสถานะภายในโดยอัตโนมัติเมื่อจำเป็นต้องสร้างเอาต์พุตซ้ำ สำหรับกรณีอื่นๆ ส่วนใหญ่แล้วประเภท RNG ที่คุณใช้นั้นไม่สำคัญ
นอกจากนี้ หากคุณต้องการเอาต์พุตที่ทำซ้ำได้ซึ่งแยกไม่ออกจากการสุ่มที่เหมือนกันอย่างสมบูรณ์ คุณจำเป็นต้องมี รหัสสตรีมไม่ใช่ PRNG