สำหรับ CSPRNG ฉันจะบอกว่าความจริงที่ว่ามันสามารถบล็อกซ้ำได้คือ สิ่งที่ดี; การทำนายว่ารูปแบบไม่สามารถทำซ้ำได้นั้นเป็นปัญหา เหตุผลเดียวที่ยอมรับได้คือโอกาสเกิดซ้ำของบล็อกขนาดใหญ่นั้นน้อยมากอยู่ดี
สมมติว่าคุณต้องการใช้ CSPRNG เพื่อสร้างชุดของบล็อก 128 บิต ซึ่งเป็นขนาดบล็อกของ AES ประมาณล้านนึงครับ $2^{20}$. คุณจะคาดหวังโอกาสที่จะ $1 - (1 - {1 \มากกว่า 2^{128}})^{1000000} \ประมาณ 2^{-108}$ สำหรับบล็อกเริ่มต้นที่จะทำซ้ำและ ${1000000 \มากกว่า 2^{128}} \ประมาณ 2^{-(128 - 20)} = 2^{-108}$ สำหรับการชนกันในล้านบล็อกแรกที่จะเกิดขึ้น เหตุผลที่ค่าเหล่านี้มีค่าใกล้เคียงกันคือหนึ่งล้านมีค่าน้อยกว่าค่าใดสำหรับค่า 128 บิต อย่างที่คุณเห็น โอกาสที่จะเกิดการชนมีน้อยมากจนแทบไม่มีนัยสำคัญ นี่คือเหตุผลว่าทำไมการเข้ารหัสของสตรีม เช่น AES-CTR จึงถูกมองว่าเป็น CSPRNG นั่นเอง
โดยทั่วไป CSPRNG มีสถานะภายในขนาดใหญ่ ซึ่งหมายความว่าเป็นไปไม่ได้ที่จะรู้ เมื่อไร PRNG ซ้ำ ที่สำคัญโอกาสที่พวกเขาโดน รอบ ต่ำมาก (หากเกิดการวนซ้ำ CSPRNG จะสร้างรูปแบบซ้ำๆ กันขนาดใหญ่) ดังนั้นเนื่องจากความคาดเดาไม่ได้ คุณจึงใช้ CSPRNG เป็นรหัสสตรีมได้ นี่เป็นเรื่องจริงสำหรับ AES / CTR เช่นกัน หากคุณดูรูปแบบอื่นที่ไม่ใช่ 128 บิต ในสถานที่ที่เหมาะสม เห็นได้ชัดว่ารูปแบบของบิตเดียวจะทำซ้ำ อย่างที่สุด บ่อยครั้งที่คุณไม่สามารถรู้ได้ว่าคุณจะพบค่าบิตใดในตำแหน่งที่กำหนด ปัญหาของ AES-CTR คือมันจะเข้าสู่วงจรอย่างแม่นยำหลังจากที่ตัวนับหมดลง
อย่างไรก็ตาม เนื่องจาก CSPRNG หลายๆ การใช้งาน ยังไม่ได้รับการออกแบบ เพื่อสร้างสตรีมเชิงกำหนดแบบเดียวกัน คุณควรจะเป็น ระมัดระวังเป็นอย่างยิ่ง ของการใช้อันหนึ่งเป็นรหัสสตรีม ตัวอย่างเช่น พวกเขาอาจทำการรีซีด ใช้เมล็ดพันธุ์ที่กำหนดเป็นเอนโทรปีเพิ่มเติม สร้างผลลัพธ์ที่แตกต่างกันเมื่อเมธอดถูกเรียกแตกต่างกัน หรือแม้แต่มีการแก้ไขอัลกอริทึม หากคุณโชคไม่ดี คุณจะไม่สามารถสร้างสตรีมคีย์เดิมขึ้นมาใหม่ได้ และข้อมูลของคุณจะสูญหาย (ดูเช่น getRawKey()
บนอุปกรณ์ Android)
แน่นอน โดยทั่วไป AES-CTR จะเร็วกว่า CSPRNG เช่นกัน หากคุณไม่ชอบ AES หรือไม่มีการเร่งด้วยฮาร์ดแวร์ การเข้ารหัสสตรีมเช่น ChaCha มักจะเป็นวิธีที่จะไป โดยปกติแล้ว คุณจะใช้การเข้ารหัสเหล่านี้ในโหมดตรวจสอบสิทธิ์โดยใช้ GMAC (AES-GCM) หรือ Poly1305
ในเอกสารเกี่ยวกับการเข้ารหัส คุณมักจะพบว่าคำว่า "stream cipher" และ "CSPRNG" ใช้แทนกันได้ แต่ระวังความแตกต่างในทางปฏิบัติในสองส่วนสุดท้าย