เนื่องจากการรวบรวมขยะไม่ได้กำหนดไว้แล้วทำไมจึงไม่ใช้ในการสร้างหมายเลขสุ่มที่ปลอดภัย


13

ฉันได้รับ / dev / random เป็นแหล่งข้อมูลที่ดีของเอนโทรปีและเป็นสิ่งที่ใช้กันทั่วไป - มันก็เหมือนกับที่ฉันอ่านบน GC อย่างน้อยใน Java ดูเหมือนว่าเป็นที่ยอมรับว่า daemon การรวบรวมขยะเรียกใช้งานแบบไม่กำหนดค่า . ถ้าเป็นจริงทำไมเราไม่ใช้เวลาของการรวบรวมขยะเป็นแหล่งของเอนโทรปีแทนที่จะเป็นตัวแปร / dev / random?


7
ลองดูที่เอกสารสำหรับฟังก์ชั่น rand () ใน C-library มาตรฐาน พวกเขาเรียกว่าโดยเฉพาะในขณะที่พวกเขาให้สิ่งที่ปรากฏตัวเลขสุ่มพวกเขาไม่สามารถใช้เพื่อความปลอดภัย คนเก็บขยะทั่วไปของคุณอาจตกอยู่ในหมวดหมู่เดียวกัน หากคุณจะใช้เพื่อความปลอดภัยคุณต้องตรวจสอบให้แน่ใจว่าคุณใช้ตัวรวบรวมขยะที่ปลอดภัยด้วยการเข้ารหัส
DXM

15
บางสิ่งบางอย่างที่ nondeterministic ยังคงสามารถคาดเดาได้สูง
วงล้อประหลาด

7
ในกรณีนี้ "ไม่ จำกัด " เป็นคำอธิบายที่ไม่ดี ตัวเก็บรวบรวมขยะเป็นระบบที่กำหนดไว้อย่างสมบูรณ์และหากคุณมีความรู้เต็มรูปแบบเกี่ยวกับสถานะและสถานะของโปรแกรมที่ใช้งานคุณสามารถคาดการณ์ผลลัพธ์ได้อย่างแม่นยำ
Gort the Robot

4
@DXM คุณรู้จักการใช้งานที่ดีสำหรับตัวรวบรวมขยะที่ปลอดภัยหรือไม่ ;)
AJMansfield

7
"ผู้ใดก็ตามที่พิจารณาวิธีการทางคณิตศาสตร์ในการสร้างเลขสุ่มอยู่ในสภาพบาป" - John von Neumann
Mark Adler

คำตอบ:


58

"ไม่ระบุ" และ "สุ่ม" เป็นแนวคิดที่แตกต่างกันสองประการ

การทำงานที่แน่นอนของตัวรวบรวมขยะไม่ได้ถูกระบุและขึ้นอยู่กับตัวรวบรวมขยะ (โดยทั่วไปจะใช้งานโดย VM ที่มีการเรียงลำดับ แต่ไม่จำเป็น)

ดังนั้นคุณไม่มีเวลาที่ระบุ (เช่นที่กำหนดไว้) ที่จะเก็บรวบรวมขยะ

อย่างไรก็ตามการใช้งานที่กำหนดจะปฏิบัติตามกฎบางอย่างและมีโอกาสสูงที่การรันสองครั้งในภายหลังของโปรแกรมเดียวกันจะมีรูปแบบการรวบรวมขยะที่คล้ายกันมาก

ดังนั้นเอนโทรปีที่จัดทำโดยผู้รวบรวมขยะจะต่ำมาก (และการค้นหาว่าส่วนใดที่คุณสามารถใช้งานได้จริงเพราะเอนโทรปีจะยุ่งยาก)

เป็นการเปรียบเทียบ: A HashMapใน Java ไม่รับประกันการเรียกใช้คำสั่งใด ๆ สำหรับสมาชิก (โดยพื้นฐานแล้วเพราะการรับประกันว่ามันจะเพิ่มโอเวอร์เฮดที่ไม่คุ้มค่ากับการจ่ายส่วนใหญ่) อย่างไรก็ตามสำหรับให้การดำเนินงานและได้รับชุดของการแทรกการลบ / คุณสามารถแน่นอนคำนวณเพื่อผล เพียงเพราะไม่มีการรับประกันสำหรับคำสั่งซื้อใด ๆ ไม่ได้หมายความว่าคำสั่งซื้อจะสุ่ม


20
ฉันคิดว่ามันน่าจะเป็นคำแถลงที่ยุติธรรมที่จะบอกว่าหากคอมพิวเตอร์ทำสิ่งที่ไม่ได้กำหนดไว้จริงคอมพิวเตอร์จะเสีย
Schilcote

non-deterministic อาจหมายถึงว่ามันต้องอาศัยบางสถานะภายนอกของโปรแกรมที่อยู่ในมือซึ่งอาจเป็นตัวกำหนดได้ แต่จะไม่เกี่ยวข้องกับตัวโปรแกรมอย่างสมบูรณ์และอาจแตกต่างกันในแต่ละครั้งที่โปรแกรมทำงาน
asmeurer

@ ผู้ตรวจสอบฉันไม่คิดว่าฉันได้ยินคำศัพท์เหล่านี้ในบริบทดังกล่าว ในความเป็นจริงฉันไม่แน่ใจด้วยซ้ำว่าคุณหมายถึงอะไร: ทุกโปรแกรมที่รับอินพุตภายนอก (นั่นคือโปรแกรมที่มีประโยชน์มากที่สุด) "อาศัยสถานะภายนอกบางอย่าง" แต่นั่นไม่ได้ทำให้มันไม่ได้กำหนด
us2012

2
@Schilcote: ซีพียูที่ทันสมัยบางตัวมี RNG ที่ไม่ได้กำหนดไว้ล่วงหน้า (จริง) นำมาใช้ในฮาร์ดแวร์ สิ่งเหล่านี้ไม่สามารถกำหนดได้จริงถึงฟิสิกส์ระดับควอนตัม
MSalters

2
@Schilcote แม้ไม่มีคำสั่ง RNG พิเศษ (RDRAND ของ Intel และ RDSEED) คอมพิวเตอร์ก็ไม่ได้กำหนดอย่างสมบูรณ์ การกำหนดเวลาบางอย่างไม่ได้ระบุอย่างสมบูรณ์และอาจขึ้นอยู่กับปัจจัยภายนอกเช่นอุณหภูมิ
CodesInChaos

8

ประการแรกเราต้องระวังไม่ให้ตกหลุมพรางของการให้เหตุผลโดยใช้คำพูดเพียงอย่างเดียว ตัวอย่างเช่นเราสามารถถามได้เนื่องจาก NFA เป็น "หุ่นยนต์ จำกัด ที่ไม่ได้กำหนด" ทำไมเราไม่ใช้มันเพื่อรับตัวเลขสุ่ม ในกรณีนั้นอาจเป็นเพราะนั่นไม่ใช่สิ่งที่ "ไม่ได้กำหนด" ใน NFA ในความเป็นจริงเมื่อเราจำลอง NFA บนอินพุตที่กำหนดพฤติกรรมของการจำลองนั้นกำหนดขึ้นอย่างสมบูรณ์แบบ

"Deterministic" เป็นวลีที่โหลด สำหรับนักเขียนโปรแกรมคอมพิวเตอร์หรือนักวิทยาศาสตร์คอมพิวเตอร์พฤติกรรมที่ไม่ได้กำหนดไว้ก็หมายถึง "การกำหนดพฤติกรรมที่แน่นอนมีความซับซ้อนในการคิด" และขึ้นอยู่กับปัจจัยหลายอย่างรวมถึงอินพุตของโปรแกรม

อย่างไรก็ตามนั่นไม่ได้หมายความว่ามันไม่ได้กำหนดให้ใครบางคนที่มีแรงจูงใจในการโจมตีระบบเข้ารหัส บางครั้งปัจจัยด้านสิ่งแวดล้อมและปัจจัยการผลิตสามารถตรึงลงและรูปแบบที่ทำซ้ำได้เกิดจากพฤติกรรม "ไม่กำหนด"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.