C rand () สามารถใช้ประโยชน์ได้อย่างไรถ้าใช้เมล็ดพันธุ์ที่ปลอดภัย?

Jacob H 10/04/2017. 3 answers, 3.630 views
randomness pseudo-random-generator attack

ฉันเพิ่งเริ่มทำโครงการวิจัยเกี่ยวกับ CSPRNGs และฉันต้องการทราบว่า PRNG มีช่องโหว่ประเภทใดบ้างที่มีความปลอดภัย ตัวอย่างเช่นถ้าฉันสร้างหมายเลขสุ่มโดยใช้ LavaRnd เพื่อ seed srand () แล้วสร้างคีย์ใหญ่ที่มี rand () สิ่งที่ผู้โจมตีสามารถทำเพื่อแก้ไขคีย์นั้นหรือหาข้อมูลที่สำคัญได้

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

5 Comments
Paul Uszak 10/04/2017
ช่องโหว่นี้ไม่ได้อยู่กับการเอนโทรปีของเมล็ดพันธุ์ดังนั้นลักษณะเฉพาะของการ secure จึงเป็นประเด็นที่น่าสงสัยด้วยเหตุผลดังต่อไปนี้ ...
1 SEJPM 10/04/2017
ถ้าคุณรู้ว่าสามารถคาดเดาได้หรืออย่างอื่นกู้คืน (ต่อเนื่อง) ผลลัพธ์มีโอกาสที่ดีที่คุณสามารถกู้คืนสถานะเต็มรูปแบบของ PRNG และคุณสามารถทำนายผลลัพธ์ทั้งหมดในอนาคตและที่ผ่านมา
4 Woodrow Barlow 10/04/2017
จากมุมมองอื่น: นี่คือตัวอย่าง ของคุณลักษณะลินุกซ์ที่อาจใช้ประโยชน์ได้ซึ่งช่วยให้สามารถแทนที่ rand ของ libc ด้วยตนเองได้ (LD_PRELOAD)
dandavis 10/05/2017
คนธรรมดา: ไม่ใช่ CSPRNG มีรูปแบบการส่งออกที่ยากที่จะหาได้ในกรณีที่พบได้ 100%
1 immibis 10/05/2017
@WoodrowBarlow IIRC พวกเขายังสามารถใช้เพื่อสร้างฟังก์ชัน makeKey ของคุณด้วยตัวเองดังนั้นจึงไม่มีจุดใดที่พยายามจะป้องกันสิ่งนี้ (หรือสามารถแทนที่ฟังก์ชัน main ของคุณหรือเรียกใช้โปรแกรมของตนเองได้)

3 Answers


fgrieu 10/05/2017.

ISO มาตรฐาน IEC 9899: 1990 ของมาตรฐาน C ประกอบด้วย:

ตัวอย่างฟังก์ชันต่อไปนี้กำหนดการใช้ rand และ srand แบบพกพา

static unsigned long int next = 1;

int rand(void) // RAND_MAX assumed to be 32767
{
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

void srand(unsigned int seed)
{
    next = seed;
} 

สถานะของเครื่องกำเนิดไฟฟ้านี้มีลักษณะโดยสิ้นเชิง 31 บิตต่ำของตัวแปร next ถ้าเรา "สร้างจำนวนสุ่มโดยใช้ LavaRnd เป็น seed srand() , then generate some big key with rand() " ตามที่ระบุไว้ในหัวข้อนี้เท่านั้นดังนั้นจะสามารถทำได้เพียง $ 2 ^ {31} = 2147483648 $ ( "big key" กำหนดโดยสิ้นเชิง 31 บิตสั่งต่ำ seed อินพุท

จากนั้นจะสามารถโจมตีได้ซึ่งจะพยายามคีย์เหล่านี้ทั้งหมด หากการทดสอบคีย์ต้องใช้รอบ $ 2 ^ {20} นาฬิกา $ (ประมาณหนึ่งล้านบาท) ของ CPU ที่มีค่าใช้จ่าย $ 2 ^ 3 $ ที่กำลังทำงานที่ $ 2 ^ {31} $ Hz การโจมตีนี้คาดว่าจะใช้เวลา $ 2 ^ {31 + 3-31-1} = 2 ^ {16} = 65536 $ วินาทีซึ่งน้อยกว่าหนึ่งวัน

ขึ้นอยู่กับสิ่งที่ทำกับ "big key" อาจมีการโจมตีเร็วขึ้น ตัวอย่างเช่นกรณีนี้จะเกิดขึ้นหาก rand() ใช้ในการสร้าง Initialisation Vector ซึ่งปกติจะเป็นจุดเริ่มต้นของข้อความที่เข้ารหัส การโจมตีที่เรียบง่ายสามารถหาค่าของค่า next จากค่า rand() ต่อเนื่องกันสามค่า ที่ใช้เวลาน้อยกว่าพริบตาและช่วยให้ค้นหาได้อย่างง่ายดายทั้งผลลัพธ์ในอดีตและอนาคตของ rand() ไม่ขัดจังหวะโดย srand()

ในทางกลับกันการประมาณรอบรอบของ $ 2 ^ {20} รอบข้างต้นอาจน้อยเกินไป (นั่นอาจเป็นกรณีของคีย์ RSA) แต่ด้วยการวัดใด ๆ คีย์สเปซคีย์ 31 บิตจะอยู่ไกลกว่านี้ ขณะนี้ขีด จำกัด ของการรักษาความปลอดภัยในทางปฏิบัติอยู่ที่ไหนสักแห่งใกล้ 80 บิตให้หรือใช้เวลา 20. 128 ถือว่าดีจนถึง 2030 ยกเว้นหากมีใครเชื่อในนางฟ้าหรือคอมพิวเตอร์ควอนตัมสามารถใช้งานได้สำหรับการเข้ารหัสทุกครั้งเร็ว ๆ นี้

4 comments
1 Jacob H 10/04/2017
นี่คือสิ่งที่ฉันต้องการฉันไม่ได้คิดเกี่ยวกับขอบเขต จำกัด ของเครื่องกำเนิดไฟฟ้ามาก่อน
6 supercat 10/04/2017
ฉันคิดว่าแนวคิดของมาตรฐานคือเพื่อให้ชัดเจนว่ารหัสที่ตั้งใจจะพกพาไม่ควรพึ่งพา rand เป็นสิ่งที่ดีกว่าที่. จากมุมมองความสอดคล้องฉันไม่คิดว่ามาตรฐานจะห้ามการใช้งานที่ส่งกลับ 42 สำหรับ 5 สายแรกหลังจาก srand(8675309) และไม่มีใครจะคืน 42 สำหรับการโทรครั้งแรกล้านล้านโดยไม่คำนึงถึงค่าที่กำหนดให้ srand แม้ว่า อดีตอาจได้รับการยกย่องว่ามีคุณภาพที่น่าสงสัย
1 gnasher729 10/05/2017
ถ้าคุณให้ฉันเพียงสามผลลัพธ์ติดต่อกันของฟังก์ชันนี้ฉันสามารถกำหนดเมล็ดใน Mac ของฉันภายในไม่กี่นาทีที่มากที่สุดด้วยความใกล้เคียงกับศูนย์ความพยายามและความฉลาดเป็นศูนย์ ตอนนี้พิจารณาว่าการโจมตีที่ clever อาจเป็นไปได้ดังนั้นการเปลี่ยนเป็น 64 หรือ 256 บิตอาจไม่ช่วยเลย
Krystian 10/06/2017
สำหรับรหัสนี้เป็นเรื่องง่ายมากที่จะกู้คืนสถานะภายในด้วยการสังเกตการณ์เพียงไม่กี่ข้อของการแสดงผลเนื่องจากเป็นจำนวนมากที่จะทำลายเครื่องกำเนิดความสอดคล้องเชิงเส้นที่ถูกตัดทอนและวิธีการขัดจังหวะที่ใช้อยู่ที่นั่นดูคำตอบนี้: crypto.stackexchange.com/questions/ 37,836 / ...

Ron Penton 10/05/2017.

ฉันเคยเล่นเกมออนไลน์นี้แล้วก็เป็นโคลนที่โรงเรียนเก่า คุณเข้าสู่ระบบแชทฆ่า Goblins บางส่วน

มันมีคาสิโน คุณเข้าไปในคาสิโนและคุณเดิมพัน X gold และมีโอกาส 40% ที่คุณชนะเดิมพันสองครั้ง เห็นได้ชัดว่าในระยะยาวคาสิโนจะชนะเสมอใช่มั้ย?

แต่นี่เป็นสิ่งที่ ฉันรู้ว่าเกมนี้เขียนขึ้นใน C + + และฉันรู้ขั้นตอนวิธี rand ()

ดังนั้นนี่คือสิ่งที่ฉันจะทำ ฉันเข้าไปในคาสิโนและเดิมพัน 1 เหรียญทอง 10 ครั้งติดต่อกันโดยเร็วที่สุด ถ้าฉันหายไปฉันบันทึกเสียงเป็น 0 ถ้าฉันชนะฉันบันทึกเสียง 1

จากนั้นฉันจะป้อนข้อมูลนั้นลงในโปรแกรมที่ฉันเขียน มันจะผ่านทั้งหมดของตัวเลขสุ่มใน rand () ลำดับเริ่มต้นจากเมล็ด 0. ถ้ามันสร้างจำนวนน้อยกว่า 0.4 นั่นคือ 0 ถ้ามันเป็น 0.4 ผ่าน 1.0 แล้วมันเป็น 1 และฉันเปรียบเทียบ ลำดับในห่วงโซ่ไปตามลำดับที่ฉันบันทึกไว้ในคาสิโน หากมีการจับคู่ทั้งหมด 10 บิตบิงโก ฉันพบเมล็ดพันธุ์ปัจจุบันที่เกมกำลังใช้อยู่

แน่นอนว่านี่ใช้เวลาประมาณหนึ่งนาทีหรือประมาณนั้นในการคำนวณดังนั้นในขณะที่คนกำลังยุ่งเกี่ยวกับการฆ่าพวกก๊อบบลินเกมนี้ยังคงมีอยู่อีกราวสองสามร้อยเมล็ดเนื่องจากสร้างตัวเลขได้มากขึ้น ดังนั้นฉันได้ทดสอบของฉันอีกครั้งอีก 10 เดิมพันไฟอย่างรวดเร็วอีก 10 ทองลงท่อระบายน้ำ ป้อนลำดับที่สองของฉันลงในโปรแกรมและคราวนี้จะพบเมล็ดปัจจุบันภายในไม่กี่วินาที (เนื่องจากเราเริ่มต้นจากเมล็ดพันธุ์ที่เราพบครั้งสุดท้าย) และคราวนี้จะพิมพ์ 30 ครั้งต่อไปนี้หรือไม่ก็ตามไม่ว่าจะเป็น ' จะเป็นผู้ชนะหรือผู้แพ้

ดังนั้นสิ่งที่ฉันทำคือฉันเดิมพัน 1 ถ้าหมายเลขถัดไปกำลังจะสูญเสีย จากนั้นฉันเดิมพันครึ่งหนึ่งของเงินของฉันถ้ามันจะชนะ Blamo เพิ่มเงินทันที 150% ทำซ้ำทำซ้ำทำซ้ำฉันก็มีบัญชีธนาคารที่เติบโตขึ้นชี้แจง

ขณะนี้มีปัญหาเล็กน้อยเกี่ยวกับวิธีนี้ อันดับหนึ่งถ้าเกมสร้างจำนวนสุ่มระหว่าง "probes" จำนวน 10 ครั้งแรกของคุณจะไม่พบลำดับ ไม่ใช่เรื่องใหญ่เพียงทำใหม่อีกครั้ง คุณจะพบคนในที่สุด

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

ปัญหาที่สาม ... เกมใช้ ints 32 บิตเพื่อเก็บเงิน หลังจากเดิมพันประมาณ 100 ครั้งคุณจะท่วมเคาน์เตอร์ ฉันทะลุ 2 พันล้านเหรียญทองและพบว่าตัวเองมีทอง 2 พันล้านลบ. และเกมไม่ได้รับการตั้งโปรแกรมให้จัดการกับทองคำขาว แต่สามารถแยกวิเคราะห์หมายเลขได้

ดังนั้นฉันไปรอบ ๆ และเริ่มให้คนจำนวนลบของทอง Hey Zethryr นี่เป็นลบหนึ่งล้าน! บูมเงินฝากออมทรัพย์ทั้งชีวิตของเขาจะถูกลบออกทันที

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

บางครั้งนักพัฒนาเว็บจะสร้าง ID ของระเบียนสตริงเกลือและรหัสผ่านชั่วคราวตามเครื่องกำเนิดไฟฟ้าหมายเลขสุ่ม ถ้าผู้ใช้ใช้ pseudo-RNG ผู้บุกรุกสามารถสร้างบัญชีหรือเร็กคอร์ดไม่กี่แถวและตรวจสอบหมายเลขรหัสของตนซึ่งอาจมีการเข้ารหัสไว้ใน URL จากนั้นพวกเขาสามารถคาดเดา ID ของบัญชีหรือระเบียนของคนอื่นหรือแม้กระทั่งรหัสผ่านของตน และอาจเป็นอันตรายได้

5 comments
2 Almo 10/05/2017
นี่เป็นเรื่องราวที่ยิ่งใหญ่! ฉันไม่แน่ใจว่าจะนับเป็นคำตอบแม้ว่า: (
Ron Penton 10/05/2017
ฉันคิดว่ามันแสดงให้เห็นว่าแม้ว่าเมล็ดของคุณจะถูกสร้างขึ้นอย่างปลอดภัยความจริงที่ว่า rand () สร้างตัวเลขบนบรรทัดที่สอดคล้องกันของตัวเลขหมายความว่าเมื่อใดก็ตามที่ข้อมูลแบบสุ่มถูกเปิดเผยต่อผู้ใช้พวกเขาสามารถหาเมล็ดพันธุ์ของคุณให้ข้อมูลที่เพียงพอ ซึ่งหมายความว่าเมล็ดไม่ได้อยู่ในความเป็นจริงอีกต่อไป นี่เป็นเพียงการโจมตีในโลกแห่งความเป็นจริงซึ่งมุ่งเป้าไปที่ระบบที่มีเมล็ดพันธุ์ที่ปลอดภัย
fgrieu 10/06/2017
ถ้าเขียนใน C ++ แทน C, Basic หรือ Fortran นี่ไม่ใช่เรื่องที่เป็นเรื่องจริง old-school ! ยังไงดี !!
Ron Penton 10/07/2017
อาจเป็น C. พวกเขาทั้งสองเข้า rand.c และ algo เดียวกัน
Justin Bailey 10/10/2017
ว่าสลบทองเป็นเฮฮา น่ากลัว!

gusto2 10/05/2017.

โปรดตรวจสอบว่า rand () ใช้ เป็น LCG ได้อย่างไร ค่า int จะแสดงจำนวนบิตจากสถานะภายในมากที่สุด

มีค่าที่ตามมาสองค่า (และการบังคับเดรัจฉานเล็กน้อย) จะกู้คืนต้นตอเดิมทั้งหมดและอนุญาตให้คาดการณ์มูลค่าในอนาคตได้

มี คำถาม ในฟอรัมนี้เกี่ยวกับเรื่องนี้อยู่แล้ว (ใน Java) และเป็นเรื่องที่น่าแปลกใจสำหรับฉันเช่นกันว่ามันง่ายแค่ไหน

2 comments
8 poncho 10/04/2017
ที่จริงไม่มีอัลกอริธึม rand อาณัติใน C; มีอัลกอริธึมตัวอย่างในมาตรฐาน C (ซึ่งก็คือ LCG) อย่างไรก็ตามยังไม่ได้รับคำสั่ง คอมไพเลอร์เฉพาะสามารถใช้อัลกอริธึมที่แข็งแกร่ง (แม้ว่าจะมีความเสี่ยงที่จะค้นหากำลังของสัตว์เลี้ยง srand () ... )
Ahmed Masud 10/05/2017
คุณหมายถึงห้องสมุด (c) สามารถใช้ algo ที่แข็งแกร่งกว่าซึ่งเป็นสิ่งที่แยกจากคอมไพเลอร์

HighResolutionMusic.com - Download Hi-Res Songs

1 (G)I-DLE

POP/STARS flac

(G)I-DLE. 2018. Writer: Riot Music Team;Harloe.
2 Ariana Grande

​Thank U, Next flac

Ariana Grande. 2018. Writer: Crazy Mike;Scootie;Victoria Monét;Tayla Parx;TBHits;Ariana Grande.
3 Imagine Dragons

Bad Liar flac

Imagine Dragons. 2018. Writer: Jorgen Odegard;Daniel Platzman;Ben McKee;Wayne Sermon;Aja Volkman;Dan Reynolds.
4 Backstreet Boys

Chances flac

Backstreet Boys. 2018.
5 Clean Bandit

Baby flac

Clean Bandit. 2018. Writer: Jack Patterson;Kamille;Jason Evigan;Matthew Knott;Marina;Luis Fonsi.
6 BTS

Waste It On Me flac

BTS. 2018. Writer: Steve Aoki;Jeff Halavacs;Ryan Ogren;Michael Gazzo;Nate Cyphert;Sean Foreman;RM.
7 BlackPink

Kiss And Make Up flac

BlackPink. 2018. Writer: Soke;Kny Factory;Billboard;Chelcee Grimes;Teddy Park;Marc Vincent;Dua Lipa.
8 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
9 Kelly Clarkson

Never Enough flac

Kelly Clarkson. 2018. Writer: Benj Pasek;Justin Paul.
10 Fitz And The Tantrums

HandClap flac

Fitz And The Tantrums. 2017. Writer: Fitz And The Tantrums;Eric Frederic;Sam Hollander.
11 Little Mix

Told You So flac

Little Mix. 2018. Writer: Eyelar;MNEK;Raye.
12 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
13 Cher Lloyd

None Of My Business flac

Cher Lloyd. 2018. Writer: ​iamBADDLUCK;Alexsej Vlasenko;Kate Morgan;Henrik Meinke;Jonas Kalisch;Jeremy Chacon.
14 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
15 Calum Scott

No Matter What flac

Calum Scott. 2018. Writer: Toby Gad;Calum Scott.
16 Ashley Tisdale

Voices In My Head flac

Ashley Tisdale. 2018. Writer: John Feldmann;Ashley Tisdale.
17 Imagine Dragons

Machine flac

Imagine Dragons. 2018. Writer: Wayne Sermon;Daniel Platzman;Dan Reynolds;Ben McKee;Alex Da Kid.
18 Diplo

Close To Me flac

Diplo. 2018. Writer: Ellie Goulding;Savan Kotecha;Peter Svensson;Ilya;Swae Lee;Diplo.
19 Billie Eilish

When The Party's Over flac

Billie Eilish. 2018. Writer: Billie Eilish;FINNEAS.
20 Little Mix

Woman Like Me flac

Little Mix. 2018. Writer: Nicki Minaj;Steve Mac;Ed Sheeran;Jess Glynne.

Related questions

Hot questions

Language

Popular Tags