มาเล่นโป๊กเกอร์คอมพิวเตอร์กันเถอะแค่คุณฉันและเซิร์ฟเวอร์ที่เราทั้งคู่ไว้วางใจ เซิร์ฟเวอร์ใช้ตัวสร้างตัวเลขสุ่มหลอกซึ่งเริ่มต้นด้วยเมล็ด 32 บิตก่อนที่เราจะเล่น ดังนั้นจึงมีดาดฟ้าที่เป็นไปได้ประมาณสี่พันล้านชั้น
ฉันได้ไพ่ห้าใบในมือ - ดูเหมือนว่าเราไม่ได้เล่น Texas Hold 'Em สมมติว่าไพ่ถูกแจกให้ฉันหนึ่งใบกับคุณหนึ่งใบกับฉันหนึ่งใบให้กับคุณและอื่น ๆ ดังนั้นฉันมีไพ่ใบที่หนึ่ง, สาม, ห้า, เจ็ดและเก้าในสำรับ
ก่อนหน้านี้ฉันใช้ตัวสร้างตัวเลขสุ่มหลอกสี่พันล้านครั้งต่อหนึ่งเมล็ดและเขียนการ์ดใบแรกที่สร้างขึ้นสำหรับแต่ละการ์ดลงในฐานข้อมูล สมมติว่าไพ่ใบแรกของฉันคือราชินีแห่งโพดำ นั่นแสดงให้เห็นเพียงใบเดียวว่าเป็นบัตรใบแรกในหนึ่งใบในทุก ๆ 52 ของสำรับที่เป็นไปได้ดังนั้นเราจึงลดจำนวนสำรับที่เป็นไปได้จากสี่พันล้านเป็นประมาณ 80 ล้านหรือมากกว่านั้น
สมมติว่าไพ่ใบที่สองของฉันคือหัวใจทั้งสาม ตอนนี้ฉันใช้ RNG ของฉัน 80 ล้านครั้งโดยใช้เมล็ด 80 ล้านที่ผลิตราชินีแห่งโพดำเป็นหมายเลขแรก ใช้เวลาสองสามวินาที ฉันจดทุกสำรับที่สร้างหัวใจทั้งสามเป็นไพ่ใบที่สาม - ไพ่ใบที่สองในมือของฉัน นั่นเป็นเพียงประมาณ 2% ของดาดฟ้าดังนั้นตอนนี้เราลงไปถึง 2 ล้านชั้น
สมมติว่าไพ่ใบที่สามในมือของฉันคือ 7 ของสโมสร ฉันมีฐานข้อมูล 2 ล้านเมล็ดที่แจกไพ่สองใบของฉัน ฉันใช้ RNG ของฉันอีก 2 ล้านครั้งเพื่อค้นหา 2% ของเด็คเหล่านั้นที่ผลิต 7 ของคลับเป็นการ์ดใบที่สามและเราลงเหลือเพียง 40,000 เด็ค
คุณเห็นว่าสิ่งนี้เกิดขึ้นได้อย่างไร ฉันวิ่ง RNG ของฉัน 40000 ครั้งเพื่อหาเมล็ดทั้งหมดที่ผลิตไพ่ใบที่สี่ของฉันและนั่นทำให้เราลงไปที่ 800 ชั้นจากนั้นเรียกใช้อีก 800 ครั้งเพื่อรับเมล็ด ~ 20 ที่ผลิตไพ่ใบที่ห้าของฉันและตอนนี้ฉันแค่ สร้างไพ่ยี่สิบสำรับเหล่านั้นและฉันรู้ว่าคุณมีหนึ่งในยี่สิบมือที่เป็นไปได้ ยิ่งกว่านั้นฉันมีความคิดที่ดีมากเกี่ยวกับสิ่งที่ฉันจะวาดต่อไป
ตอนนี้คุณเห็นหรือไม่ว่าทำไมการสุ่มตัวอย่างที่แท้จริงจึงสำคัญ วิธีที่คุณอธิบายคุณคิดว่าการกระจายนั้นสำคัญ แต่การกระจายไม่ใช่สิ่งที่ทำให้กระบวนการสุ่ม ความไม่แน่นอนคือสิ่งที่ทำให้กระบวนการสุ่ม
UPDATE
จากความคิดเห็น (ตอนนี้ถูกลบเนื่องจากความไม่เป็นธรรม) พวกเขาอย่างน้อย 0.3% ของผู้ที่เคยอ่านสิ่งนี้จะสับสนในประเด็นของฉัน เมื่อผู้คนโต้เถียงกับจุดที่ฉันไม่ได้ทำหรือแย่กว่านั้นโต้เถียงกับจุดที่ฉันได้ทำบนสมมติฐานที่ว่าฉันไม่ได้ทำให้พวกเขาแล้วฉันรู้ว่าฉันต้องอธิบายให้ชัดเจนยิ่งขึ้นและระมัดระวัง
ดูเหมือนจะมีความสับสนเป็นพิเศษเกี่ยวกับการกระจายคำดังนั้นฉันจึงต้องการเรียกใช้การอย่างระมัดระวัง
คำถามในมือคือ:
- ตัวเลขหลอกเทียมและตัวเลขสุ่มแตกต่างกันอย่างไร
- ทำไมความแตกต่างจึงสำคัญ
- ความแตกต่างมีบางอย่างเกี่ยวกับการกระจายเอาต์พุตของ PRNG หรือไม่?
เริ่มต้นด้วยการพิจารณาวิธีที่สมบูรณ์แบบในการสร้างไพ่สำรับสุ่มที่เล่นโป๊กเกอร์ จากนั้นเราจะดูว่าเทคนิคอื่น ๆ สำหรับการสร้างเด็คแตกต่างกันอย่างไรและถ้าเป็นไปได้ที่จะใช้ประโยชน์จากความแตกต่าง
TRNG
ขอเริ่มต้นด้วยการสมมติว่าเราได้กล่องวิเศษที่มีป้ายกำกับ เมื่ออินพุตของมันเราให้จำนวนเต็ม n มากกว่าหรือเท่ากับหนึ่งและเป็นผลลัพธ์มันให้ตัวเลขสุ่มอย่างแท้จริงระหว่างหนึ่งถึง n รวม เอาท์พุทของกล่องนั้นคาดเดาไม่ได้อย่างสมบูรณ์ (เมื่อได้รับตัวเลขอื่นที่ไม่ใช่หนึ่ง) และตัวเลขใด ๆ ระหว่างหนึ่งและ n มีโอกาสเป็นอื่น ที่จะบอกว่าการจัดจำหน่ายเป็นชุด (มีการตรวจสอบทางสถิติขั้นสูงอื่น ๆ เพิ่มเติมของการสุ่มที่เราสามารถทำได้; ฉันไม่สนใจจุดนี้เพราะมันไม่ใช่สิ่งที่ขัดแย้งกับข้อโต้แย้งของฉัน TRNG นั้นสุ่มอย่างสมบูรณ์ทางสถิติโดยการสันนิษฐาน)
เราเริ่มต้นด้วยสำรับไพ่ที่ไม่มีการสับ เราถามกล่องถึงตัวเลขระหว่างหนึ่งถึง 52 นั่นคือ, TRNG(52)
. ไม่ว่าจะให้เบอร์ใดเราก็นับจำนวนไพ่ที่ได้จากการเรียงไพ่ของเราและนำการ์ดนั้นออก มันจะกลายเป็นไพ่ใบแรกในสำรับสับไพ่ จากนั้นเราจะขอTRNG(51)
และทำเช่นเดียวกันเพื่อเลือกไพ่ใบที่สองเป็นต้น
อีกวิธีในการดูคือ: มี 52! = 52 x 51 x 50 ... x 2 x 1 ชั้นเป็นไปได้ซึ่งเป็นประมาณ 2 226 เราได้เลือกหนึ่งในนั้นโดยการสุ่มอย่างแท้จริง
ตอนนี้เราแจกการ์ด เมื่อฉันดูไพ่ฉันไม่รู้ว่าการ์ดอะไรที่คุณมี (นอกเหนือจากความจริงที่ชัดเจนว่าคุณไม่มีการ์ดใด ๆ ที่ฉันมี) พวกเขาอาจเป็นการ์ดใดก็ได้โดยมีความน่าจะเป็นเท่ากัน
ขอผมอธิบายให้ชัดเจนนะ ขณะนี้มีการกระจายสม่ำเสมอของการส่งออกของแต่ละบุคคลของTRNG(n)
; แต่ละอันเลือกตัวเลขระหว่าง 1 ถึง n โดยมีความน่าจะเป็น 1 / n นอกจากนี้ผลลัพธ์ของกระบวนการนี้ก็คือเราได้เลือกหนึ่งใน 52! ชั้นไปได้ด้วยความน่าจะเป็นของ 1/52 !, เพื่อการจัดจำหน่ายที่มากกว่าชุดของชั้นที่เป็นไปได้คือยังเครื่องแบบ
เอาล่ะ
PRNG
ตอนนี้ขอสมมติว่าเรามีกล่องวิเศษน้อยที่มีป้ายกำกับ ก่อนที่คุณจะสามารถใช้งานได้นั้นจะต้องได้เมล็ดมีจำนวนที่ไม่ได้ลงชื่อ 32 บิต
นอกเหนือ: ทำไม 32 ? ไม่สามารถทำการเพาะด้วยหมายเลข 64- หรือ 256- หรือ 10,000- บิต? แน่ใจ แต่ในทางปฏิบัติ (1) PRNG ส่วนใหญ่นั้นมีจำนวน 32 บิตและ (2) ถ้าคุณมีการสุ่ม 10,000 บิตเพื่อสร้างเมล็ดแล้วทำไมคุณถึงใช้ PRNG เลย? คุณมีแหล่งสุ่ม 10,000 บิตอยู่แล้ว!
อย่างไรก็ตามกลับไปที่วิธีการทำงานของ PRNG: TRNG
หลังจากที่มีเมล็ดคุณสามารถใช้วิธีเดียวกันกับที่คุณใช้ นั่นคือคุณผ่านตัวเลข n และมันให้ตัวเลขกลับคืนระหว่าง 1 ถึง n รวม นอกจากนี้การกระจายตัวของการส่งออกว่าจะมากหรือน้อยเครื่องแบบ นั่นคือเมื่อเราขอPRNG
ตัวเลขระหว่าง 1 ถึง 6 เราจะได้ 1, 2, 3, 4, 5 หรือ 6 แต่ละครั้งประมาณหนึ่งในหกของเวลาไม่ว่าเมล็ดจะเป็นอะไรก็ตาม
ฉันต้องการเน้นจุดนี้หลายครั้งเพราะดูเหมือนว่าเป็นสิ่งที่ทำให้ผู้แสดงความคิดเห็นบางคนสับสน การกระจายตัวของ PRNG นั้นเหมือนกันอย่างน้อยสองวิธี อันดับแรกสมมติว่าเราเลือกเมล็ดเฉพาะ เราคาดหวังว่าลำดับPRNG(6), PRNG(6), PRNG(6)...
ต่อล้านครั้งจะทำให้เกิดการกระจายตัวของตัวเลขอย่างสม่ำเสมอระหว่าง 1 ถึง 6 และสองถ้าเราเลือกเมล็ดที่แตกต่างกันหนึ่งล้านเมล็ดและเรียกPRNG(6)
หนึ่งครั้งสำหรับแต่ละเมล็ด 6. สม่ำเสมอของ PRNG ทั่วทั้งของการดำเนินงานเหล่านี้ไม่ได้เกี่ยวข้องกับการโจมตีฉันกำลังอธิบาย
กระบวนการนี้มีการกล่าวถึงว่าเป็นการหลอกแบบสุ่มเพราะพฤติกรรมของกล่องนั้นเป็นสิ่งที่กำหนดอย่างแท้จริง มันเลือกจากหนึ่งใน 2 32พฤติกรรมที่เป็นไปได้ขึ้นอยู่กับเมล็ด นั่นคือเมื่อมันเมล็ดPRNG(6), PRNG(6), PRNG(6), ...
ผลิตลำดับของตัวเลขที่มีการกระจายชุด แต่ลำดับที่ทั้งหมดถูกกำหนดโดยเมล็ด สำหรับลำดับการโทรที่กำหนดให้พูด PRNG (52), PRNG (51) ... และอื่น ๆ มีเพียง 2 32ลำดับที่เป็นไปได้ เมล็ดเป็นหลักเลือกที่เราจะได้รับ
เพื่อสร้างเด็คในขณะนี้เซิร์ฟเวอร์สร้างเมล็ด (ได้อย่างไรเราจะกลับมาที่จุดนั้น) จากนั้นพวกเขาก็โทรPRNG(52)
มาPRNG(51)
และอื่น ๆ เพื่อสร้างสำรับคล้ายกับก่อนหน้านี้
ระบบนี้ไวต่อการโจมตีที่ฉันอธิบาย ในการโจมตีเซิร์ฟเวอร์ก่อนอื่นให้เราคัดลอกสำเนาของกล่องของเราด้วย 0 และขอPRNG(52)
และเขียนลงไป จากนั้นเราก็เติมเมล็ดด้วย 1 ขอPRNG(52)
และเขียนลงไปจนถึง 2 32 -1
ทีนี้เซิร์ฟเวอร์โปกเกอร์ที่ใช้ PRNG ในการสร้างเด็คต้องทำการสร้างเมล็ดอย่างใด มันไม่สำคัญว่าพวกเขาจะทำเช่นนั้นได้อย่างไร พวกเขาสามารถเรียกTRNG(2^32)
เพื่อให้ได้เมล็ดสุ่มอย่างแท้จริง หรือพวกเขาอาจใช้เวลาปัจจุบันเป็นเมล็ดพันธุ์ซึ่งแทบจะไม่สุ่มเลย ฉันรู้ว่าเวลาเท่าไหร่ที่คุณทำ จุดของการโจมตีของฉันก็คือว่ามันไม่สำคัญเพราะฉันมีฐานข้อมูลของฉัน เมื่อฉันเห็นการ์ดใบแรกของฉันฉันสามารถกำจัด 98% ของเมล็ดที่เป็นไปได้ เมื่อฉันเห็นไพ่ใบที่สองของฉันฉันสามารถกำจัดได้มากขึ้น 98% และต่อ ๆ ไปจนกระทั่งในที่สุดฉันก็สามารถลงมือหยิบเมล็ดที่เป็นไปได้และรู้ว่ามีโอกาสสูงที่คุณจะได้รับ
ตอนนี้อีกครั้งผมอยากจะเน้นว่าสมมติฐานที่นี่คือถ้าเราเรียกว่าPRNG(6)
ล้านครั้งเราจะได้รับในแต่ละจำนวนประมาณหนึ่งในหกของเวลา การกระจายนั่นคือเครื่องแบบ (มากหรือน้อย) และถ้าความสม่ำเสมอของการกระจายนั่นคือสิ่งที่คุณใส่ใจนั่นก็ดี ประเด็นของคำถามคือมีอะไรอีกPRNG(6)
บ้างที่การกระจายของสิ่งที่เราใส่ใจ และคำตอบคือใช่ เราใส่ใจเรื่องความคาดเดาไม่ได้เช่นกัน
อีกวิธีหนึ่งในการดูปัญหาคือแม้ว่าการกระจายการโทรหนึ่งล้านครั้งPRNG(6)
อาจใช้ได้เนื่องจาก PRNG เลือกจากพฤติกรรมที่เป็นไปได้เพียง 2 32แต่ก็ไม่สามารถสร้างเด็คที่เป็นไปได้ทั้งหมด มันสามารถสร้าง 2 32จาก 2 226ดาดฟ้าที่เป็นไปได้เท่านั้น เศษเสี้ยวเล็ก ๆ ดังนั้นการกระจายตัวของฉากทั้งหมดจึงแย่มาก แต่อีกครั้งการโจมตีขั้นพื้นฐานที่นี่ขึ้นอยู่กับความสามารถของเราในการทำนายพฤติกรรมในอดีตและอนาคตของPRNG
ตัวอย่างผลลัพธ์ที่ได้
ขอผมใช้นี่เป็นเวลาสามหรือสี่ครั้งเพื่อให้แน่ใจว่าอ่างล้างมือนี้มีการแจกแจงสามแบบตรงนี้ ก่อนการกระจายของกระบวนการที่สร้างเมล็ดพันธุ์แบบสุ่ม 32 บิต ที่สามารถเป็นแบบสุ่มสมบูรณ์ไม่แน่นอนและสม่ำเสมอและการโจมตีจะยังคงทำงาน ประการที่สองการกระจายการโทรหนึ่งล้านPRNG(6)
ครั้ง นั่นสามารถเป็นชุดที่สมบูรณ์แบบและการโจมตีจะยังคงทำงาน ประการที่สามการกระจายของสำรับที่เลือกโดยกระบวนการหลอกหลอกที่ฉันได้อธิบายไว้ การกระจายตัวนั้นแย่มาก สามารถเลือกสำรับ IRL ที่เป็นไปได้เพียงเล็กน้อยเท่านั้น การโจมตีขึ้นอยู่กับการคาดการณ์ของพฤติกรรมของ PRNG บนพื้นฐานความรู้บางส่วนของการส่งออกของ
ไซด์: การโจมตีนี้ต้องการให้ผู้โจมตีทราบหรือสามารถเดาได้ว่าอัลกอริทึมที่แน่นอนที่ PRNG ใช้คืออะไร ไม่ว่าจะเป็นจริงหรือไม่เป็นคำถามเปิด อย่างไรก็ตามเมื่อมีการออกแบบระบบรักษาความปลอดภัยที่คุณต้องออกแบบให้เป็นที่เชื่อถือได้ของการโจมตีแม้ว่าโจมตีรู้ขั้นตอนวิธีการทั้งหมดที่อยู่ในโปรแกรม ใส่อีกวิธีหนึ่ง: ส่วนของระบบรักษาความปลอดภัยที่ต้องเก็บเป็นความลับเพื่อให้ระบบมีความปลอดภัยเรียกว่า "กุญแจ" หากระบบของคุณขึ้นอยู่สำหรับการรักษาความปลอดภัยในขั้นตอนวิธีการที่คุณใช้เป็นความลับแล้วที่สำคัญของคุณมีขั้นตอนวิธีการเหล่านั้น นั่นคือตำแหน่งที่อ่อนแออย่างยิ่งที่จะอยู่ใน!
กำลังเดินทางไป.
CPRNG
ตอนนี้ขอสมมติว่าเรามีกล่องวิเศษที่สามที่มีป้ายกำกับ PRNG
มันเป็นรุ่นการเข้ารหัสลับความแข็งแรงของ ใช้เมล็ด 256 บิตแทนที่จะเป็นเมล็ด 32 บิต มันแบ่งปันกับPRNG
คุณสมบัติที่เมล็ดเลือกจากหนึ่งใน 2 256พฤติกรรมที่เป็นไปได้ และเช่นเดียวกับเครื่องอื่น ๆ ของเรามันมีคุณสมบัติที่การโทรจำนวนมากเพื่อCPRNG(n)
สร้างการกระจายของผลลัพธ์ที่เหมือนกันระหว่าง 1 ถึง n: แต่ละครั้งเกิดขึ้น 1 / n ของเวลา เราสามารถโจมตีมันได้หรือไม่?
โจมตีเดิมของเราเราต้องเก็บ 2 32PRNG(52)
แมปจากเมล็ด แต่ 2 256เป็นจำนวนที่มากกว่า มันเป็นไปไม่ได้เลยที่จะรันCPRNG(52)
หลาย ๆ ครั้งและเก็บผลลัพธ์
แต่สมมติว่ามีวิธีอื่นที่จะใช้มูลค่าของCPRNG(52)
และจากการอนุมานข้อเท็จจริงเกี่ยวกับเมล็ด? เราค่อนข้างจะโง่เง่ามาก่อน เราสามารถตรวจสอบภายในกล่องเวทมนตร์คิดออกว่ามันทำงานอย่างไรและอนุมานข้อเท็จจริงเกี่ยวกับเมล็ดพันธุ์ตามผลผลิต
เลขที่มีรายละเอียดซับซ้อนเกินไปที่จะอธิบาย แต่ CPRNGs ได้รับการออกแบบอย่างชาญฉลาดเพื่อที่จะเป็นไปไม่ได้ที่จะอนุมานใด ๆ ที่ความเป็นจริงมีประโยชน์เกี่ยวกับเมล็ดพันธุ์จากผลผลิตแรกของCPRNG(52)
หรือจากใดส่วนหนึ่งของการส่งออกไม่ว่าขนาดใหญ่
ตกลงดังนั้นตอนนี้สมมติว่าเซิร์ฟเวอร์ใช้CPRNG
เพื่อสร้างสำรับ มันต้องการเมล็ด 256 บิต มันเลือกเมล็ดพันธุ์นั้นได้อย่างไร? ถ้ามันเลือกค่าใด ๆ ที่ผู้โจมตีสามารถคาดการณ์แล้วก็โจมตีกลายเป็นที่ทำงานได้อีกครั้ง หากเราสามารถระบุได้ว่ามีเมล็ดที่เป็นไปได้2 256เมล็ดนั้นมีเพียง 4 พันล้านรายการเท่านั้นที่มีแนวโน้มที่จะถูกเลือกโดยเซิร์ฟเวอร์ดังนั้นเราจึงกลับมาทำธุรกิจอีกครั้ง เราสามารถหยุดยั้งการโจมตีนี้ได้อีกครั้งโดยให้ความสนใจกับเมล็ดพันธุ์จำนวนเล็กน้อยที่สามารถสร้างได้
เซิร์ฟเวอร์ดังนั้นจึงควรทำผลงานเพื่อให้มั่นใจว่าจำนวน 256 บิตจะกระจายอย่างสม่ำเสมอ - นั่นคือแต่ละเมล็ดเป็นไปได้คือเลือกด้วยความน่าจะเป็นของ 1/2 256 โดยทั่วไปเซิร์ฟเวอร์ควรจะเรียกการสร้างเมล็ดพันธุ์สำหรับTRNG(2^256)-1
CPRNG
ถ้าฉันสามารถแฮ็คเซิร์ฟเวอร์และตรวจสอบเพื่อดูว่ามีการเลือกเมล็ดพันธุ์อะไร ในกรณีที่ผู้บุกรุกรู้ว่าที่ผ่านมาที่สมบูรณ์และอนาคตของ CPRNG ผู้เขียนเซิร์ฟเวอร์จำเป็นต้องป้องกันการโจมตีนี้! (แน่นอนถ้าฉันสามารถประสบความสำเร็จในการโจมตีครั้งนี้ได้ฉันก็สามารถโอนเงินไปยังบัญชีธนาคารของฉันได้โดยตรงดังนั้นอาจไม่น่าสนใจประเด็นคือ: เมล็ดต้องเป็นความลับที่ยากต่อการคาดเดาและ ตัวเลข 256 บิตแบบสุ่มอย่างแท้จริงค่อนข้างยากที่จะเดา)
การย้อนกลับไปยังจุดก่อนหน้าของฉันเกี่ยวกับการป้องกันเชิงลึก: เมล็ด 256 บิตเป็นกุญแจสำคัญในระบบรักษาความปลอดภัยนี้ ความคิดของ CPRNG การให้คือระบบที่มีความปลอดภัยตราบใดที่สำคัญคือการรักษาความปลอดภัย ; แม้ว่าทุก ๆ ข้อเท็จจริงเกี่ยวกับอัลกอริทึมเป็นที่รู้จักกันตราบใดที่คุณสามารถเก็บความลับสำคัญบัตรของฝ่ายตรงข้ามไม่สามารถคาดเดาได้
ตกลงดังนั้นเมล็ดควรจะเป็นความลับและกระจายอย่างสม่ำเสมอเพราะถ้าไม่ใช่เราสามารถโจมตีได้ เรามีสมมุติฐานว่าการกระจายตัวของเอาท์พุตCPRNG(n)
มีความสม่ำเสมอ สิ่งที่เกี่ยวกับการกระจายไปทั่วชุดของดาดฟ้าที่เป็นไปได้ทั้งหมดหรือไม่
คุณอาจพูดว่า: CPRNG มี 2 256ผลลัพธ์ที่เป็นไปได้ แต่มีเพียง 2 226ดาดฟ้าที่เป็นไปได้ ดังนั้นจึงมีลำดับที่เป็นไปได้มากกว่าเด็คเราจึงไม่เป็นไร เด็ค IRL ที่เป็นไปได้ทั้งหมดตอนนี้ (มีความเป็นไปได้สูง) ที่เป็นไปได้ในระบบนี้ และนั่นเป็นข้อโต้แย้งที่ดียกเว้น ...
2 226เป็นเพียงการประมาณ 52! แบ่งมันออก 2 256/52 ! ไม่สามารถเป็นจำนวนเต็มได้เพราะอย่างใดอย่างหนึ่ง 52! หารด้วย 3 แต่ไม่มีพลังของสองคือ! ตั้งแต่นี้ไม่ได้เป็นจำนวนทั้งหมดตอนนี้เรามีสถานการณ์ที่ชั้นทุกคนมีความเป็นไปได้แต่ชั้นบางมีแนวโน้มมากขึ้นกว่าคนอื่น ๆ
หากยังไม่ชัดเจนให้พิจารณาสถานการณ์ที่มีตัวเลขน้อยกว่า สมมติว่าเรามีไพ่สามใบ A, B และ C สมมติว่าเราใช้ PRNG กับเมล็ด 8 บิตดังนั้นจึงมี 256 เมล็ดที่เป็นไปได้ มีเอาต์พุตที่เป็นไปได้ 256 รายการPRNG(3)
ขึ้นอยู่กับเมล็ด ไม่มีทางที่จะมีหนึ่งในสามของพวกเขาเป็น A, หนึ่งในสามของพวกเขาเป็น B และหนึ่งในสามของพวกเขาเป็น C เพราะ 256 ไม่สามารถหารได้อย่างเท่าเทียมกันโดย 3 จะต้องมีอคติเล็ก ๆ ต่อหนึ่งของพวกเขา
ในทำนองเดียวกัน 52 ไม่ได้แบ่งเท่า ๆ กันเป็น 2 256ดังนั้นจึงต้องมีอคติบางอย่างเมื่อเลือกไพ่ใบแรกและมีอคติห่างจากคนอื่น
ในระบบดั้งเดิมของเราที่มีเมล็ด 32 บิตมีอคติมากและดาดฟ้าที่เป็นไปได้ส่วนใหญ่ไม่เคยถูกสร้างขึ้นมา ในระบบนี้ชั้นทั้งหมดสามารถผลิตได้ แต่การกระจายตัวของชั้นก็ยังคงมีข้อบกพร่อง ชั้นบางคนมีมากขึ้นเล็กน้อยจะมีโอกาสมากกว่าคนอื่น ๆ
ตอนนี้คำถามคือ: เรามีการโจมตีตามข้อบกพร่องนี้หรือไม่? และคำตอบคือในทางปฏิบัติอาจจะไม่ได้ CPRNGs ได้รับการออกแบบเพื่อให้ถ้าเมล็ดเป็นแบบสุ่มอย่างแท้จริงแล้วมันเป็นไปไม่ได้คอมพิวเตอร์ที่จะบอกความแตกต่างระหว่างและCPRNG
TRNG
ตกลงดังนั้นมาสรุปกัน
ตัวเลขหลอกเทียมและตัวเลขสุ่มแตกต่างกันอย่างไร
พวกเขาแตกต่างกันในระดับของการคาดการณ์ที่พวกเขาแสดง
- ตัวเลขสุ่มที่แท้จริงไม่สามารถคาดเดาได้
- ตัวเลขสุ่มหลอกทั้งหมดสามารถคาดการณ์ได้หากเมล็ดสามารถกำหนดหรือเดาได้
ทำไมความแตกต่างจึงสำคัญ
เนื่องจากมีการใช้งานที่การรักษาความปลอดภัยของระบบที่อิงอยู่กับการคาดการณ์
- หากใช้ TRNG เพื่อเลือกการ์ดแต่ละใบระบบจะไม่สามารถใช้งานได้
- หากใช้ CPRNG เพื่อเลือกการ์ดแต่ละใบระบบจะปลอดภัยหากทั้งเมล็ดไม่สามารถคาดเดาได้และไม่ทราบ
- หากใช้ PRNG ธรรมดาที่มีพื้นที่เมล็ดขนาดเล็กระบบจะไม่ปลอดภัยไม่ว่าเมล็ดนั้นจะคาดเดาไม่ได้หรือไม่ทราบก็ตาม พื้นที่เมล็ดเล็กพอที่จะไวต่อการโจมตีที่โหดร้ายแบบที่ฉันอธิบาย
ความแตกต่างมีส่วนเกี่ยวข้องกับการกระจายเอาต์พุตของ PRNG หรือไม่?
ความสม่ำเสมอของการกระจายหรือขาดมันสำหรับการโทรของแต่ละบุคคลที่จะRNG(n)
ไม่เกี่ยวข้องกับการโจมตีที่ผมได้อธิบายไว้
ดังที่เราได้เห็นทั้ง a PRNG
และCPRNG
สร้างการแจกแจงที่ไม่ดีของความน่าจะเป็นในการเลือกเด็คเดี่ยวของเด็คใด ๆ PRNG
เป็นอย่างมากที่เลวร้ายยิ่ง แต่ทั้งสองมีปัญหา
อีกหนึ่งคำถาม:
ถ้า TRNG ดีกว่า CPRNG มากซึ่งดีกว่า PRNG มากทำไมใครใช้ CPRNG หรือ PRNG
ด้วยเหตุผลสองประการ
ครั้งแรก: ค่าใช้จ่าย การฝึกซ้อมเป็นที่มีราคาแพง การสร้างตัวเลขสุ่มอย่างแท้จริงนั้นเป็นเรื่องยาก CPRNG ให้ผลลัพธ์ที่ดีสำหรับการโทรจำนวนมากโดยไม่ตั้งใจด้วยการโทรเพียงครั้งเดียวไปยัง TRNG สำหรับเมล็ด แน่นอนว่าคุณต้องเก็บความลับเอาไว้
ประการที่สอง: บางครั้งเราต้องการการคาดการณ์และสิ่งที่เราใส่ใจคือการกระจายที่ดี หากคุณกำลังสร้างข้อมูล "สุ่ม" เป็นโปรแกรมอินพุตสำหรับชุดทดสอบและมันแสดงข้อผิดพลาดมันจะดีถ้าการใช้ชุดทดสอบนั้นสร้างข้อผิดพลาดอีกครั้ง!
ฉันหวังว่าตอนนี้ชัดเจนมากขึ้น
ท้ายที่สุดถ้าคุณชอบสิ่งนี้คุณอาจสนุกกับการอ่านเพิ่มเติมเกี่ยวกับเรื่องของการสุ่มและการเรียงสับเปลี่ยน: