ฉันได้ยินมาว่าการสร้างตัวเลขสุ่มในคอมพิวเตอร์นั้นไม่ได้สุ่มจริงๆ แต่ไม่มีวิธีที่มีประสิทธิภาพในการตรวจจับ จะตรวจจับได้อย่างไร?
ฉันได้ยินมาว่าการสร้างตัวเลขสุ่มในคอมพิวเตอร์นั้นไม่ได้สุ่มจริงๆ แต่ไม่มีวิธีที่มีประสิทธิภาพในการตรวจจับ จะตรวจจับได้อย่างไร?
คำตอบ:
คอมพิวเตอร์ถูกสุ่มจริง ๆ :
การสุ่มตัวอย่างที่แท้จริงนั้นเป็นไปไม่ได้สำหรับทัวริง Machines ในแง่ทฤษฎีและคอมพิวเตอร์ส่วนใหญ่ไม่สามารถสร้างผลลัพธ์ที่สุ่มได้อย่างแท้จริง ดังนั้นคอมพิวเตอร์สมัยใหม่บางเครื่องจึงมีฮาร์ดแวร์ที่อนุญาตให้คอมพิวเตอร์เข้าถึงแหล่งภายนอกซึ่งหวังว่าจะมีการสุ่ม ตัวอย่างหนึ่งของวิธีการนี้สามารถทำได้คือการติดตามความผันผวนเล็กน้อยในอุณหภูมิภายในคอมพิวเตอร์ แบบสุ่มสามารถรับได้จากแหล่งภายนอกเช่นกัน แต่จากน้ำเสียงของโพสต์ของคุณฉันไม่คิดว่าแหล่งภายนอกของการสุ่มคือสิ่งที่คุณสนใจ
เมล็ด:
หากไม่มีการเพิ่มภายนอกคอมพิวเตอร์จะกำหนดทุกอย่าง สิ่งนี้นำไปสู่ปัญหาใหญ่: ถ้าคุณเรียกโปรแกรมสร้างหมายเลขสุ่มมันจะให้ผลลัพธ์เหมือนกันทุกครั้งถ้าคุณให้อินพุตเหมือนกัน เห็นได้ชัดว่าเราต้องการโปรแกรมที่แสดงผลตัวเลขสุ่มเพื่อเปลี่ยนพฤติกรรมของมันในแต่ละครั้งที่ทำงาน (ไม่เช่นนั้นเราจะได้รับหมายเลข "สุ่ม" ที่เหมือนกัน แนวคิดหนึ่งคือการให้โปรแกรมป้อนข้อมูลบางอย่างซึ่งจะเปลี่ยนแปลงในแต่ละครั้งที่โปรแกรมทำงานเพื่อให้ตัวเลขที่แตกต่างกันจะถูกส่งออก เราเรียกอินพุตนี้ว่า "เมล็ดพันธุ์" ตัวสร้างตัวเลขสุ่มต้องใช้เวลาในเมล็ดดำเนินการบางอย่างและให้หมายเลขสุ่มแก่เรา
เวลาระบบปัจจุบันเป็นตัวอย่างคลาสสิกของเมล็ด สิ่งนี้จะทำให้สตริงยาวที่มีความเอนโทรปีสูงและหากเวลาถูกติดตามอย่างละเอียดพอสมควร (เช่นถ้านาฬิการะบบของคุณใช้เวลาหลายชั่วโมง "เวลา" เป็นเมล็ดพันธุ์ที่แย่มาก) คุณไม่น่าจะป้อนหมายเลขหลอกเทียม เครื่องกำเนิดหมายเลขเดียวกันสองครั้ง
อัลกอริทึมที่สุ่มเพียงพอ:
ตอนนี้เรามีอัลกอริทึมที่อย่างน้อยมีวิธีที่จะแตกต่างกันในแต่ละครั้งที่ทำงาน เราให้มันเป็นเมล็ดและในขณะที่อัลกอริทึมให้หมายเลขเดียวกันเมื่อได้รับแจ้งด้วยเมล็ดเดียวกันเราต้องการตัวเลขที่สร้างเป็นแบบสุ่ม สิ่งนี้ทำหน้าที่เหมือนด้านบน - คุณรับข้อมูลเข้าบางส่วนและสร้างผลลัพธ์บางอย่าง (หวังว่าจะแตกต่างจากอินพุตที่จะเป็น "สุ่ม")
ทีนี้สมมติว่าคุณคิดอัลกอริธึมของคุณเองเพื่อทำสิ่งนี้และคุณอ้างว่าตัวเลขที่คุณคิดขึ้นมานั้นค่อนข้างใกล้เคียงกับการสุ่มเมื่อคุณให้เมล็ดที่แตกต่างกัน เราจะทดสอบว่ามันดีแค่ไหน?
ตอนนี้เราต้องการอัลกอริทึมที่จะใช้ในเมล็ดดำเนินการบางอย่างและสร้างตัวเลขสุ่ม ที่ง่ายที่สุดอัลกอริทึมก็สามารถส่งออกเมล็ด - มันไม่ได้ให้หมายเลขเดียวกันในแต่ละครั้งและเมล็ดสุ่มให้เราออกสุ่ม แต่ชัดเจนว่าไม่ใช่สิ่งที่เราต้องการ ในทางกลับกันอัลกอริธึมอาจค่อนข้างซับซ้อนเช่นเดียวกับเครื่องกำเนิดไฟฟ้าเทียมปลอมจำนวนมาก เราจะบอกได้อย่างไรว่าอัลกอริธึมใดให้ตัวเลข "สุ่ม" จากเมล็ดที่ไม่จำเป็นต้องสุ่มของเรา หากเราไม่ได้รับอย่างแน่นอนเราจะบอกได้อย่างไรว่าอะไรดีที่สุด?
สุ่มพอที่จะหลอกผู้โจมตี:
ตอนนี้สิ่งที่คุณอาจอ้างถึงคือ Cryptographially Secure Pseudorandom Generators ฉันคิดว่าวิธีที่ดีที่สุดในการอธิบายเรื่องนี้คือในบริบทของข้างต้น - ที่นี่เราใช้การสุ่มของเราสำหรับการเข้ารหัสดังนั้นเมื่อเราออกแบบการทดสอบสิ่งที่เราใส่ใจจริงๆก็คือใครบางคนจะไม่สามารถแตกหักได้ ความปลอดภัยของเราโดยการคาดการณ์สิ่งที่เราสุ่มเลือกหมายเลข ฉันไม่ทราบระดับของความคุ้นเคยกับการเข้ารหัส แต่ลองจินตนาการว่าเรากำลังทำการแทนที่แบบง่าย ๆ --- ตัวอักษรแต่ละตัวจะถูกแทนที่ด้วยตัวอักษรอื่น เราต้องการเลือกการแทนที่เหล่านี้แบบสุ่มดังนั้นจึงเป็นการยากที่ผู้โจมตีจะคาดเดา แต่ถ้าเขาสามารถคิดได้ว่าเครื่องกำเนิดตัวเลขแบบสุ่มของฉันทำงานอย่างไรเขาจะสามารถแก้ปัญหาตัวเลขทั้งหมดได้! ดังนั้นอัลกอริทึมการเข้ารหัสลับจึงต้องใช้ตัวสร้างตัวเลขสุ่มซึ่งยากต่อการเดาโดยเฉพาะ
ด้วยเหตุนี้ CSPRG จึงถูกกำหนดในแง่ของอัลกอริธึมอื่น ๆ ที่แก้ปัญหาได้ดีเพียงใด (ซึ่งเป็นที่มาของคำถามของคุณในที่สุด) โดยเฉพาะสมมุติว่าฉันมี CSPRG ซึ่งฉันจะเรียกว่าอาร์อาร์เป็น CSPRG ถ้าหากไม่มีอัลกอริทึมที่เป็นไปได้ที่สามารถเดาได้ว่าบิตใดจะส่งออกต่อไป สิ่งนี้เป็นจริงแม้ว่าคุณจะรู้บิตก่อนหน้านี้ทั้งหมดที่มันส่งออก!
สมมุติว่าห้าบิตแรกที่ CSPRG ของฉันมีเอาต์พุตคือ 10100 คุณไม่ทราบอินพุตที่ฉันใช้กับโปรแกรม แต่คุณสามารถเข้าถึงรหัสที่ฉันใช้เขียน CSPRG ของฉันได้ ดังนั้นการอ้างสิทธิ์จึงเป็นไปไม่ได้ที่คุณจะเขียนโปรแกรมเพื่อตัดสินใจว่าเอาต์พุตบิตถัดไปจะเป็น 101000 หรือ 101001
ดังนั้นด้วยเหตุผลของการเข้ารหัสบางครั้งความหมายของตัวสร้างตัวเลขหลอกเทียมก็ถูกกำหนดในแง่ของการคาดการณ์ว่ามันจะเป็นอย่างไรกับโปรแกรมอื่น ๆ โปรดทราบว่าสิ่งนี้ยังคงให้สัญชาตญาณของ "การสุ่ม" มาก (ถ้า) ถ้าคุณรู้ว่าผลลัพธ์ที่สุ่มทั้งหมดจะแปลกมันไม่ปลอดภัยและไม่ผ่านการเข้ารหัสแบบสุ่ม - สามัญ
เมื่อเร็ว ๆ นี้ฉันพบโพสต์ที่ดีเกี่ยวกับการสุ่มในการคำนวณใน MIT CSAIL Theory of Computation Group บล็อก: คุณช่วยบอกได้ไหมว่าบิตนั้นสุ่ม?
โพสต์เริ่มต้นด้วยความคิดบางอย่างที่สกัดจากการพูดคุยที่ยอดเยี่ยมของอาวีวิกเดอร์สัน เกี่ยวกับอำนาจและข้อ จำกัด ของการสุ่มในการคำนวณการสำรวจพื้นที่ที่สวยงามของอัลกอริทึมแบบสุ่มและการเชื่อมต่อที่น่าแปลกใจระหว่าง pseudorandomness และ intractability
จากนั้นจะสรุปผลลัพธ์ล่าสุดบางอย่างเกี่ยวกับการเข้ารหัสควอนตัม โดยเฉพาะอย่างยิ่งวิธีการทดสอบอย่างมีประสิทธิภาพว่าเอาต์พุตของอุปกรณ์บางประเภทเป็นการสุ่มอย่างแท้จริง (โปรโตคอลการขยายแบบสุ่ม)
ตัวอย่างเช่นดูผลงานล่าสุดโดยUmesh Vazirani, Thomas Vidick, ลูกเต๋าควอนตัมที่ผ่านการรับรอง (หรือการขยายการสุ่มเลขชี้กำลังที่ทดสอบได้)
บทคัดย่อ: เราแนะนำโปรโตคอลซึ่งอุปกรณ์ควอนตัมคู่หนึ่งอาจถูกนำมาใช้เพื่อสร้างบิตแบบสุ่มที่แท้จริงจากเมล็ดของชุดเครื่องแบบ O (log n) บิตที่สร้างขึ้นนั้นจะสุ่มสุ่มขึ้นอยู่กับการทดสอบทางสถิติอย่างง่ายที่ผู้ใช้สามารถทำได้และบนสมมติฐานที่ว่าอุปกรณ์นั้นปฏิบัติตามหลักการไม่ส่งสัญญาณ ไม่มีการวางสมมติฐานอื่น ๆ ไว้ในการทำงานภายในของอุปกรณ์ ....
สมมติว่าคุณกำลังพูดถึงสถิติแบบสุ่ม - การเข้ารหัสมีความต้องการอื่น ๆ ! - มีการทดสอบความดีแบบพอดีที่สามารถตรวจจับได้ว่าลำดับของตัวเลขเหมาะสมกับการแจกแจงที่กำหนดหรือไม่ คุณสามารถใช้สิ่งเหล่านี้เพื่อทดสอบว่าตัวสร้างตัวเลขสุ่ม (หลอก) เป็นเสียงหรือไม่ (ขึ้นอยู่กับคุณภาพของการทดสอบและความสำคัญที่เลือก)
ชุดทดสอบ Diehardรวมวิธีการที่แตกต่างกัน
นี่เป็นหัวข้อกว้าง ๆ / ซับซ้อนในวิทยาการคอมพิวเตอร์ซึ่งคำตอบอื่น ๆ ของ SamM กล่าวถึงบางข้อ คำถามเฉพาะของคุณน่าจะเกี่ยวกับหากคอมพิวเตอร์มีสิ่งที่เรียกว่าPRNGเช่นเครื่องกำเนิดตัวเลขสุ่มหลอกเราจะตรวจพบได้อย่างไร
คำตอบสั้น ๆ ก็คือ PRNG ที่ไม่สำคัญถูกสร้างขึ้นเพื่อไม่ให้ตรวจจับอัลกอริทึมของมัน โดยทั่วไปถ้า PRNG คือสิ่งที่เรียกว่า "ปลอดภัย" แม้ว่าผู้โจมตีจะรู้ขั้นตอนวิธีที่ใช้ในการสร้างลำดับหลอกเทียมพวกเขาไม่สามารถคาดเดาพารามิเตอร์เฉพาะที่ใช้ในการสร้างลำดับ ด้วยวิธีนี้ pseudorandomness มีความสัมพันธ์ลึกซึ้งกับการเข้ารหัสและเราสามารถพูดคุยเกี่ยวกับ "การทำลาย" PRNG ในลักษณะเดียวกับที่อัลกอริทึมการเข้ารหัสสามารถ "แตก" ได้ มีงานวิจัยมากมายในพื้นที่นี้มันเป็นพื้นที่แอคทีฟแถวหน้าของการเข้ารหัส
สำหรับ "trivial" PRNGs เช่นพูดเป็นเครื่องกำเนิดเชิงเส้นตรงถ้าผู้โจมตีรู้อัลกอริธึมที่ใช้ในการสร้างมันและมันไม่ได้ถูกสร้างขึ้นด้วย"bignums"พื้นที่การค้นหาคือ "ค่อนข้างเล็ก" และผู้โจมตีสามารถหาพารามิเตอร์ในทางทฤษฎี ใช้โดย PRNG โดยเฉพาะอย่างยิ่งโดยกำลังดุร้ายและลองชุดค่าผสมทั้งหมด
PRNGs สามารถใช้งานได้ในทางปฏิบัติ (อีกครั้งขึ้นอยู่กับ "ความปลอดภัย") ในบางกรณีโดยการใช้ชุดทดสอบสถิติเชิงสุ่มขนาดใหญ่ เช่นนี่คือเหตุผลของโปรแกรม"Dieharder" (โดย Brown) นอกจากนี้ยังมีชุด NIST
ความยากลำบากที่แท้จริง / ความแข็งของการทำลาย PRNGs ยังไม่ได้รับการพิสูจน์ทางทฤษฎีอย่างเคร่งครัด แต่โดยพื้นฐานแล้วเกี่ยวข้องกับสิ่งที่เรียกว่า "กับดัก" หรือ"ฟังก์ชันทางเดียว"ซึ่งสามารถคำนวณได้อย่างมีประสิทธิภาพในทิศทางเดียว . มีปัญหาบางอย่างที่เปิดในการเข้ารหัสเกี่ยวกับความแข็งแบบสุ่ม คำถามเหล่านี้เกี่ยวข้องกับการแยกคลาสที่ซับซ้อนเช่นคำถาม P =? NP ที่มีชื่อเสียง
คำถามเกี่ยวกับการทำลาย PRNG ยังเกี่ยวข้องกับความซับซ้อนของ Kolmogorovซึ่งเป็นสนามที่ศึกษาเครื่องจักรทัวริงที่เล็กที่สุดที่สามารถสร้างลำดับได้ การทำลาย PRNG ยังเกี่ยวข้องกับการค้นหาโปรแกรม "สั้นที่สุด" เพื่อคำนวณลำดับหลอกเทียม และความซับซ้อนของ Kolmogorov นั้นไม่สามารถตัดสินใจได้โดยทั่วไป
ในฐานะที่เป็น Gilles ชี้ให้เห็นในความคิดเห็นที่มีอยู่RNGs ที่ใช้ฮาร์ดแวร์สร้างขึ้นจากกระบวนการทางกายภาพทางกายภาพเช่นที่เกี่ยวข้องกับเสียงควอนตัม สิ่งเหล่านี้หากวิศวกรรมถูกต้องจะไม่แตก
ในความเป็นจริงทุกสิ่งทุกอย่างที่คอมพิวเตอร์คลาสสิคทำนั้นถูกกำหนดไว้แล้วในแง่ที่ว่าเมื่อคุณให้งานบางอย่างแก่พวกเขา ดังนั้นหากคุณต้องการมีตัวเลขสุ่มหนึ่งตัวคุณสามารถคำนวณได้ตามเวลา (ขึ้นอยู่กับเวลาป้อนข้อมูลของผู้ใช้) แต่ถ้าคุณต้องการมีตัวเลขสุ่มชุดคุณจะไม่สามารถใช้เวลากับตัวเลขถัดไปได้เนื่องจาก ตัวเลขจะไม่เป็นอิสระอีกต่อไป
สิ่งที่ผู้คนทำคือการใช้เครื่องกำเนิดไฟฟ้าแบบหลอกหลอกซึ่งมีเมล็ดพืชเช่นหมายเลขที่ใช้ในการคำนวณตัวเลขทั้งหมดของเครื่องกำเนิดตัวเลขแบบหลอกเทียม (ในบางกรณีที่มีความซับซ้อนมากขึ้นในการจำลองหรืองานอื่น ๆ อาจจำเป็นต้องมีเมล็ดมากขึ้น หากจำเป็นต้องใช้ตัวเลขสุ่มมากกว่าหนึ่งชุด) เมล็ดมักจะเป็น 0 หรือตัวเลขเฉพาะถ้าคุณต้องการผลลัพธ์ที่ทำซ้ำได้หรือเวลาที่คุณและผลลัพธ์ที่ไม่สามารถผลิตได้แตกต่างกัน
ความจริงที่ว่าเครื่องกำเนิดเลขสุ่มหลอกนั้นดีพออยู่ในความจริงที่ว่าพวกเขาทำตาม "ลักษณะพื้นฐานของการสร้างตัวเลขสุ่มหลอก" เพื่อที่จะคำนวณได้อย่างมีประสิทธิภาพและทำตัวเหมือนตัวเลขสุ่มจริง:
จากแต่ละหมายเลขของลำดับของตัวเลขสุ่มหลอกตัวเลขใหม่จะถูกคำนวณ (โดยปกติเราจะทำงานกับจำนวนเต็ม) อย่างไรก็ตามมีรอบระยะเวลา, n, ในลำดับของตัวสร้างตัวเลขแบบหลอกเทียมที่เตรียมไว้เพื่อทำงานในฐานเฉพาะที่มีจำนวน จำกัด ของบิตที่มีอยู่เพื่อแสดงตัวเลข (เช่นไบนารี) ถ้า n นี้ไม่ใหญ่พอที่จะมีปัญหาร้ายแรง แต่ไม่ต้องกังวลนักวิทยาศาสตร์คอมพิวเตอร์เลือกเมล็ดและพารามิเตอร์อื่น ๆ ของเครื่องกำเนิดไฟฟ้าแบบหลอกเทียมดีเพื่อให้มี n ที่ดี
ตัวอย่างเช่นตัวสร้างตัวเลขแบบสุ่มหลอกที่เป็นไปได้ด้วยวิธีการเชิงเส้นเชิงเส้นซึ่งเป็นหนึ่งในอัลกอริทึมกำเนิดสัญญาณหลอกแบบสุ่มที่เก่าแก่ที่สุดและดีที่สุดที่รู้ว่าสามารถกำหนดตาม:
มันมีค่าสี่ค่า:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0 โดยที่:
x0 คือค่าเริ่มต้น a, c และ m เป็นค่าคงที่โดยที่: m> a, m> c และสร้างลำดับที่มี fornula:
x_ {i + 1} = (a * x_i + c) MOD m
ค่าสำหรับค่าคงที่เหล่านี้จะต้องเลือกอย่างระมัดระวัง ความเป็นไปได้อย่างหนึ่งคือ:
x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32 อ้างอิง [1-2]
มีอัลกอริธึมอื่นที่ซับซ้อนกว่าในการสร้างตัวเลขสุ่มซึ่งหลีกเลี่ยงปัญหาของอัลกอริธึมก่อนหน้าซึ่งรวมถึง: [3]
- สั้นกว่าระยะเวลาที่คาดไว้สำหรับบางสถานะเมล็ด (เช่นสถานะเมล็ดอาจถูกเรียกว่า 'อ่อนแอ' ในบริบทนี้);
- ขาดความสม่ำเสมอของการกระจายจำนวนมากสร้างตัวเลข;
- สหสัมพันธ์ของค่านิยมต่อเนื่อง
- การกระจายมิติที่ไม่ดีของลำดับเอาต์พุต
- ระยะห่างระหว่างที่ค่าบางค่าเกิดขึ้นมีการกระจายแตกต่างจากค่าในการแจกแจงแบบสุ่ม
ในอนาคตคอมพิวเตอร์คลาสสิคอาจรวมกันเป็นระบบควอนตัมซึ่งสามารถให้ตัวเลขสุ่มจริง ๆ และส่งมอบให้ [4]
การอ้างอิง:
[1] http://en.wikipedia.org/wiki/linear_congruential_generator
[2] William H. , et al. (1992) "สูตรตัวเลขใน Fortran 77: ศิลปะแห่งการคำนวณทางวิทยาศาสตร์" (2nd ed.) ไอ 0-521-43064-X
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /