Cryptology Academy · บทเรียน

รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG

ตรวจสอบสถานะภายในและการสร้างผลลัพธ์ของกลไก DRBG ที่ NIST อนุมัติแต่ละแบบ

บทเรียน 2 จาก 413 ขั้นตอน

รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน

องค์ประกอบสถานะภายในของ DRBG

กลไก DRBG ทั้งสามแบบของ NIST จะรักษาองค์ประกอบสถานะภายในที่แตกต่างกัน ซึ่งสะท้อนแนวทางของอัลกอริทึมที่อยู่เบื้องหลัง Hash_DRBG เก็บ V (ค่าเริ่มต้นที่มีความยาวเท่ากับแฮช) และ C (ค่าคงที่ที่ได้จาก V และใช้ระหว่างการสร้างผลลัพธ์) HMAC_DRBG เก็บคีย์ K (คีย์ลับที่มีความยาวเท่ากับแฮช) และค่า V (ค่าการเชื่อมโยงที่มีความยาวเท่ากับแฮช) CTR_DRBG เก็บคีย์ K (คีย์ AES) และ V (ตัวนับที่มีความยาวเท่ากับบล็อก) ทั้งสามแบบจะรักษา reseed_counter เพื่อติดตามจำนวนการเรียก Generate นับจากการตั้งต้นครั้งล่าสุด ขนาดของสถานะเป็นตัวกำหนดพื้นที่หน่วยความจำที่ใช้ โดย Hash_DRBG/HMAC_DRBG ที่ใช้ SHA-256 จะมีสถานะขนาด 64 ไบต์ ส่วน CTR_DRBG ที่ใช้ AES-256 จะมีขนาด 48 ไบต์ (คีย์ขนาด 32 ไบต์ + ตัวนับขนาด 16 ไบต์)

Hash_DRBG: ฟังก์ชันอนุพันธ์ Hash_df

Hash_DRBG ใช้ Hash_df (ฟังก์ชันอนุพันธ์แฮช) เพื่อแปลงข้อมูลเอนโทรปีให้เป็นสถานะ Hash_df(input_string, no_of_bits_to_return) จะวนซ้ำดังนี้: สำหรับ counter = 1, 2, ... ให้คำนวณ H(counter || no_of_bits || input_string) แล้วต่อผลลัพธ์เข้าด้วยกันจนได้จำนวนบิตเพียงพอ วิธีนี้จะขยายข้อมูลนำเข้าเอนโทรปีที่สั้นให้เป็นค่าเริ่มต้นที่มีขนาดเท่ากับสถานะ ระหว่างการทำงานของ Generate ฟังก์ชันผลลัพธ์จะคำนวณ W = H(0x03 || V) โดยคำนำหน้า 0x03 ใช้แยกการคำนวณนี้จากการใช้แฮชรูปแบบอื่น วงรอบการสร้างผลลัพธ์คือ data = H(0x01 || V); V = V + 1; แล้วทำซ้ำเพื่อสร้างผลลัพธ์เพิ่มเติม หลังจากสร้างผลลัพธ์แล้ว จะอัปเดต V ดังนี้: V = V + H(0x03 || V) + C + reseed_counter การแยกโดเมนด้วยไบต์คำนำหน้า (0x01, 0x03) ช่วยป้องกันไม่ให้ผลลัพธ์จากระยะการสร้างถูกสับสนกับระยะการอัปเดตสถานะ

HMAC_DRBG: ฟังก์ชัน Update

ฟังก์ชัน Update ของ HMAC_DRBG เป็นแกนหลักของการเปลี่ยนสถานะทั้งหมด Update(provided_data, K, V): K = HMAC(K, V || 0x00 || provided_data); V = HMAC(K, V) หาก provided_data ไม่ว่างเปล่า: K = HMAC(K, V || 0x01 || provided_data); V = HMAC(K, V) การอัปเดตสองขั้นตอนนี้ทำให้ทั้งคีย์และค่าที่สร้างใหม่ขึ้นอยู่กับสถานะก่อนหน้าและเอนโทรปีใหม่ใด ๆ Generate จะวนซ้ำ V = HMAC(K, V) และต่อเข้ากับผลลัพธ์จนได้จำนวนบิตเพียงพอ จากนั้นเรียก Update พร้อม additional_input เพื่อเลื่อนสถานะไปข้างหน้า ความปลอดภัยของ HMAC_DRBG อาศัยสมมติฐานว่า HMAC เป็น PRF ที่ปลอดภัย กล่าวคือ ผู้โจมตีที่ไม่สามารถแยกแยะผลลัพธ์ของ HMAC จากค่าสุ่มได้ ก็ไม่สามารถแยกแยะผลลัพธ์ของ DRBG จากค่าสุ่มได้เช่นกัน

CTR_DRBG: Block_Cipher_df

CTR_DRBG ใช้ Block_Cipher_df (ฟังก์ชันอนุพันธ์) เพื่อแปลงข้อมูลค่าเริ่มต้นให้อยู่ในรูปแบบคีย์และตัวนับ Block_Cipher_df(input_string, no_of_bits) ใช้โครงสร้าง BCC (การเชื่อมโยงบล็อกการเข้ารหัส) โดยวนใช้ AES-CBC กับชิ้นส่วนข้อมูลนำเข้าเพื่อสร้างผลลัพธ์ตามความยาวที่ต้องการ ฟังก์ชันอนุพันธ์นี้จำเป็นสำหรับการจัดการข้อมูลนำเข้าเอนโทรปีที่มีความยาวแปรผัน และสำหรับการแยกโดเมน CTR_DRBG ที่ไม่ใช้ฟังก์ชันอนุพันธ์ (อนุญาตในการทดสอบ FIPS เมื่อข้อมูลนำเข้าจัดรูปแบบไว้อย่างแม่นยำ) จะทำงานเร็วกว่า แต่ไวต่อข้อกำหนดด้านรูปแบบข้อมูลนำเข้ามากกว่า วงรอบ Generate คือ temp = E(K, V); V = V + 1; แล้วต่อ temp เข้ากับผลลัพธ์ การอัปเดตคือ K || V = Block_Cipher_df(V || additional_input, seedlen); จากนั้นใช้ XOR กับคีย์ปัจจุบัน

เปรียบเทียบประสิทธิภาพของ DRBG

ประสิทธิภาพแตกต่างกันอย่างมากระหว่าง DRBG แต่ละประเภท บน CPU x86_64 สมัยใหม่ที่มี AES-NI: CTR_DRBG (AES-256) สร้างผลลัพธ์เทียมสุ่มได้ประมาณ 5–10 GB/s โดยคำสั่ง AES-NI ทำให้การคำนวณ AES แทบไม่มีต้นทุน HMAC_DRBG (SHA-256) ทำได้ประมาณ 200–400 MB/s โดย SHA-256 รวดเร็ว แต่ไม่ได้รับการเร่งด้วยฮาร์ดแวร์ในระดับเดียวกัน Hash_DRBG (SHA-256) ทำได้ประมาณ 100–300 MB/s สำหรับการสร้างคีย์จำนวนมากหรือการใช้แทนรหัสลับแบบสตรีม CTR_DRBG จะเร็วกว่าอย่างชัดเจน สำหรับงานที่มีอัตราการส่งข้อมูลต่ำ เช่น การสร้างคีย์เซสชันหรือการแปลงค่าที่ใช้ครั้งเดียว ความแตกต่างด้านประสิทธิภาพไม่มีนัยสำคัญ OpenSSL 3.0 ใช้ CTR_DRBG (AES-256) เป็นค่าเริ่มต้นด้วยเหตุผลนี้

สตริงการสร้างอินสแตนซ์และการกำหนดเฉพาะบุคคล

ในขั้นตอนการสร้างอินสแตนซ์ DRBG ทั้งสามแบบจะรับ personalization_string ที่เป็นตัวเลือก ซึ่งจะผสมกับข้อมูลนำเข้าเอนโทรปีเพื่อทำให้อินสแตนซ์ของ DRBG มีเอกลักษณ์ วิธีนี้ป้องกันไม่ให้ DRBG สองอินสแตนซ์ที่สร้างขึ้นพร้อมกันและได้รับเอนโทรปีเดียวกันสร้างผลลัพธ์เดียวกัน โดยแต่ละอินสแตนซ์จะแยกออกจากกันตามสตริงการกำหนดเฉพาะบุคคล สตริงการกำหนดเฉพาะบุคคลที่แนะนำคือ ตัวระบุแอปพลิเคชัน + ID กระบวนการ + ID เธรด + ประทับเวลา + ตัวระบุฮาร์ดแวร์ แม้ VM สองเครื่องจะได้รับเอนโทรปีเดียวกัน (ซึ่งเป็นปัญหาจากสแนปชอตของ VM บนคลาวด์) สตริงการกำหนดเฉพาะบุคคลที่แตกต่างกันก็ยังทำให้แต่ละเครื่องสร้างกระแส DRBG ที่แตกต่างกัน NIST SP 800-90C แนะนำให้ใช้สตริงการกำหนดเฉพาะบุคคลเสมอ พารามิเตอร์ nonce มีจุดประสงค์คล้ายกัน คือเป็นค่าขนาดสั้นที่ไม่ซ้ำกัน เพื่อให้แน่ใจว่าไม่มีการสร้างอินสแตนซ์สองรายการใดเริ่มต้นจากสถานะเดียวกัน

ข้อมูลนำเข้าเพิ่มเติมในการเรียก Generate

DRBG ทั้งสามแบบรองรับพารามิเตอร์ additional_input ในการเรียก Generate ซึ่งช่วยให้ผู้เรียกสามารถป้อนบริบทหรือเอนโทรปีเพิ่มเติมเข้าสู่การเรียกสร้างผลลัพธ์เพียงครั้งเดียวได้ โดยไม่ต้องตั้งต้นใหม่ทั้งหมด การใช้งานได้แก่ (1) การป้อนเอนโทรปีต่อคำขอจากแหล่งเอนโทรปีรอง (2) การให้บริบทระดับแอปพลิเคชัน เช่น ID คำขอและประทับเวลา เพื่อผูกค่าที่สร้างเข้ากับการใช้งาน (3) การเพิ่มความต้านทานการคาดเดาที่เป็นตัวเลือก โดยป้อนเอนโทรปีสดจากระบบปฏิบัติการ additional_input จะถูกผสมเข้ากับสถานะ DRBG ก่อนการสร้างผลลัพธ์ หาก additional_input มีเอนโทรปีจริง ก็จะช่วยเพิ่มความปลอดภัยโดยไม่ต้องตั้งต้นใหม่อย่างเป็นทางการ ซึ่งต้องใช้การเชื่อมต่อกับอินเทอร์เฟซแหล่งเอนโทรปีและมีค่าใช้จ่ายเพิ่มเติมที่เกี่ยวข้อง

การทำให้สถานะเป็นศูนย์และการทำลายคีย์

หลังจากยกเลิกการสร้างอินสแตนซ์ของ DRBG แล้ว (หรือเมื่อเปลี่ยนไปใช้อินสแตนซ์ใหม่) จะต้องทำให้สถานะภายในเป็นศูนย์อย่างปลอดภัย สถานะ V, C (Hash_DRBG), K, V (HMAC_DRBG/CTR_DRBG) รวมถึงตัวแปรทำงานระหว่างกลางทั้งหมดต้องถูกเขียนทับด้วยศูนย์ การดำเนินการนี้เรียกว่าการทำให้เป็นศูนย์อย่างชัดเจน และเป็นข้อบังคับในโมดูล FIPS 140-3 ในโค้ด C ให้ใช้ explicit_bzero() หรือ SecureZeroMemory() เนื่องจาก memset ที่คอมไพเลอร์ปรับให้เหมาะสมอาจถูกนำออกด้วยการปรับให้เหมาะสมแบบการเขียนที่ไม่ก่อผล ทำให้ข้อมูลคีย์ยังคงอยู่ในหน่วยความจำ crate zeroize ของ Rust และโซลูชันเฉพาะภาษาที่คล้ายกันจะจัดการเรื่องนี้ได้อย่างพกพา การทำลายคีย์อย่างปลอดภัยมีความสำคัญในบริบทที่ดัมป์หน่วยความจำ การโจมตีแบบ cold boot หรือเครื่องมือตรวจสอบกระบวนการอาจเปิดเผยสถานะที่ตกค้างอยู่

การทดสอบ DRBG: เวกเตอร์ CAVP

NIST จัดเตรียมเวกเตอร์ทดสอบจากโครงการตรวจสอบความถูกต้องของอัลกอริทึมการเข้ารหัส (CAVP) สำหรับ DRBG ตาม SP 800-90A ทั้งหมด ประเภทการทดสอบ ได้แก่ (1) การทดสอบคำตอบที่ทราบ (KATs) — เมื่อกำหนดข้อมูลนำเข้าเอนโทรปี, nonce และสตริงการกำหนดเฉพาะบุคคลที่ตายตัว ให้ตรวจสอบว่าผลลัพธ์ที่สร้างตรงกับค่าที่คำนวณไว้ล่วงหน้า (2) การทดสอบการตั้งต้นใหม่ — ตรวจสอบสถานะ DRBG หลังการดำเนินการตั้งต้นใหม่ (3) การทดสอบ PR (ความต้านทานการคาดเดา) — ตรวจสอบว่าการขอ prediction_resistance=true ให้ผลลัพธ์ที่ถูกต้องหลังจากป้อนเอนโทรปีสด การตรวจสอบโดย CAVP เป็นข้อกำหนดสำหรับการยื่นขอ FIPS 140-3 ไลบรารีโอเพนซอร์ส เช่น OpenSSL และ mbedTLS จะรวมเวกเตอร์ทดสอบ CAVP ไว้ในชุดทดสอบการถดถอย เพื่อจับข้อผิดพลาดที่เกิดขึ้นซ้ำในการนำ DRBG ไปใช้งาน

ความเสี่ยงจากช่องทางข้างเคียงในการนำ DRBG ไปใช้

การนำ DRBG ไปใช้งานต้องเผชิญกับความเสี่ยงจากช่องทางข้างเคียงที่ละเอียดอ่อน นอกเหนือจากแบบจำลองความปลอดภัยของอัลกอริทึม การโจมตีด้วยเวลาของแคชต่อ AES (ใน CTR_DRBG ที่ไม่มี AES-NI) อาจรั่วไหลข้อมูลคีย์รอบได้ ส่วน AES-NI จะกำจัดความเสี่ยงนี้ด้วยการคำนวณในรีจิสเตอร์โดยไม่ค้นหาตาราง HMAC_DRBG ใช้ HMAC ภายใน ซึ่งจะใช้เวลาการทำงานคงที่หาก SHA-256 ที่อยู่เบื้องหลังก็ใช้เวลาคงที่เช่นกัน โดยทั่วไปถือว่า SHA-256 ใช้เวลาการทำงานคงที่ เนื่องจากไม่มีแขนงการทำงานที่ขึ้นกับข้อมูล ช่องทางข้างเคียงทางกายภาพ เช่น การวิเคราะห์การใช้พลังงานและการแผ่รังสี EM จากฮาร์ดแวร์ที่สร้าง DRBG เป็นข้อกังวลสำหรับสมาร์ตการ์ดและอุปกรณ์ IoT และแก้ไขได้ด้วยการนำไปใช้งานแบบปิดบัง การโจมตีจากการสำรองสถานะเกิดขึ้นเมื่อผู้โจมตีสามารถอ่านสถานะ DRBG ผ่านช่องโหว่ที่เปิดเผยข้อมูลหน่วยความจำในลักษณะเดียวกับ Heartbleed ทำให้ผลลัพธ์ทั้งหมดในอนาคตถูกเจาะได้จนกว่าจะตั้งต้นใหม่ด้วยเอนโทรปีสด

การกู้คืนสถานะ DRBG หลังถูกเจาะ

หากสถานะ DRBG ถูกเจาะ เช่น ผ่านช่องโหว่ที่เปิดเผยข้อมูลหน่วยความจำ การกู้คืนต้องดำเนินการดังนี้ (1) ตรวจจับการถูกเจาะ — การรั่วไหลของสถานะ DRBG ไม่สามารถสังเกตเห็นได้ด้วยตัวเอง จึงต้องใช้การตรวจสอบจากภายนอกหรือการตรวจสอบความสมบูรณ์ (2) ตั้งต้นใหม่ด้วยเอนโทรปีสดจากแหล่งที่เชื่อถือได้ซึ่งไม่เกี่ยวข้องกับการถูกเจาะ (3) เปลี่ยนคีย์ของข้อมูลเข้ารหัสทั้งหมดที่ได้จาก DRBG ที่ถูกเจาะ เช่น คีย์เซสชันและคีย์ลงลายมือชื่อที่สร้างขึ้นนับจากการตั้งต้นใหม่ครั้งล่าสุดที่สถานะยังสมบูรณ์ (4) สำหรับการนำไปใช้งานด้วยซอฟต์แวร์ การเริ่มกระบวนการใหม่จะสร้างอินสแตนซ์ DRBG ที่สะอาด SP 800-90C แนะนำให้ใช้แหล่งเอนโทรปีแบบต่อสายกัน หากแหล่งหนึ่งถูกเจาะ การผสมแหล่งเหล่านั้นก็ยังคงให้ความปลอดภัยได้ หากอีกแหล่งหนึ่งมีเอนโทรปีจริง

แบบทดสอบสถานะ DRBG

กลไก DRBG ใดเร็วที่สุดสำหรับการสร้างผลลัพธ์เทียมสุ่มจำนวนมากบน CPU สมัยใหม่

สรุปกลไกภายในของ DRBG

Hash_DRBG ใช้การแฮชแบบวนซ้ำร่วมกับ Hash_df เพื่อการแปลงค่า และสร้างผลลัพธ์ผ่านวงรอบ H(0x01 || V) HMAC_DRBG ใช้ HMAC เป็น PRF พร้อมฟังก์ชัน Update สองขั้นตอน (คีย์แล้วจึงค่า) ซึ่งมีการลดรูปด้านความปลอดภัยที่ชัดเจน CTR_DRBG ใช้ AES ในโหมดตัวนับร่วมกับ Block_Cipher_df และทำความเร็วได้ 5–10 GB/s บนฮาร์ดแวร์ AES-NI ทั้งสามแบบรับ personalization_string ตอนสร้างอินสแตนซ์เพื่อทำให้อินสแตนซ์ไม่ซ้ำกัน และรับ additional_input ในการสร้างผลลัพธ์แต่ละครั้งเพื่อผูกเข้ากับบริบท เวกเตอร์ทดสอบ CAVP ใช้ตรวจสอบการนำไปใช้งาน สถานะต้องถูกทำให้เป็นศูนย์อย่างปลอดภัยหลังใช้งาน หากสถานะถูกเจาะ จะต้องตั้งต้นใหม่ด้วยเอนโทรปีสดและเปลี่ยนคีย์ของข้อมูลที่ได้จากสถานะนั้น

เริ่มต้นได้ฟรี

เรียนรู้ Cryptology Academy ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
67
บทเรียน
261

คำถามที่พบบ่อย

บทเรียน “รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG”

ตรวจสอบสถานะภายในและการสร้างผลลัพธ์ของกลไก DRBG ที่ NIST อนุมัติแต่ละแบบ คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม

ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. NIST SP 800-90A: มาตรฐาน DRBG
  2. รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG
  3. เหตุการณ์แบ็กดอร์ใน Dual EC DRBG
  4. การทดสอบและตรวจสอบการนำ RNG ไปใช้
← กลับไปที่ Cryptology Academy