ใน คำจำกัดความมาตรฐานของ ECDSA, โนเนซ $k$ ควรเป็นจำนวนเต็มสุ่มแบบลับเฉพาะในช่วง $[1,น)$, ที่ไหน $n$ เป็นลำดับเฉพาะของเครื่องกำเนิดไฟฟ้า การวิเคราะห์คู่ข้อความ/ลายเซ็น เมื่อ $k$ เป็นที่รู้จักหรือมีข้อบกพร่อง (เช่น ความเอนเอียงหรือแนวโน้มที่จะทำซ้ำ) อาจทำให้คีย์ส่วนตัวรั่วไหลได้ ดังนั้นการสร้าง $k$ เรื่องความปลอดภัย
เป็นไปไม่ได้สำหรับการนำการสร้างลายเซ็น ECDSA ไปใช้เพื่อตรวจสอบว่าค่าของ an ป้อนข้อมูล $k$ ได้รับเหมาะสำหรับการใช้งานที่ปลอดภัย ตามที่กำหนด ใน คำจำกัดความมาตรฐานของลายเซ็น ECDSAเนื่องจากไม่มีวิธีใดที่จะบอกได้จากค่าว่าเป็นความลับหรือไม่ ซึ่งเป็นสิ่งสำคัญที่สุด $k$ ควรมีไว้ครอบครอง นอกจากนี้ยังเป็นไปไม่ได้ที่จะประเมินว่าได้รับหรือไม่ $k$ เป็นการสุ่มตามที่คำถามแนะนำ อย่างน้อยที่สุดเว้นแต่เราจะรู้ว่ามันถูกผลิตขึ้นอย่างไร และอย่างไรก็ตาม ในบริบท การสุ่มเป็นเรื่องรองลงมาจากการเป็นความลับ
ดังนั้นแทนที่จะยอมรับ $k$ เป็นอินพุต ขั้นตอนทั่วไปคือการสร้างการสุ่ม $k$ ส่วนหนึ่งของการดำเนินการสร้างลายเซ็น ECDSA ขั้นตอนพื้นฐาน (หากไม่จำเป็นต้องแนะนำ) คือการวาด $\lceil\log_2(n)\rceil$ บิตจาก RNG ที่แข็งแกร่งในการเข้ารหัส (เช่น /dev/urandom
) และตีความบิตเหล่านี้เป็นจำนวนเต็ม $k$ ต่อเช่น big-endian Convention จนกว่าจะมีขึ้น $0<k<n$ (ซึ่งสำหรับหลายๆ $n$ ใช้ในทางปฏิบัติเป็นหลักเสมอเพราะ $n$ ต่ำกว่ายกกำลังสอง) ฉันไม่สนใจขั้นตอนพื้นฐานนี้ในคำตอบที่เหลือ (แม้ว่าสิ่งนี้ ความคิดเห็น แสดงว่าเป็นเนื้อหาของคำถาม)
เป็นไปได้ที่จะแก้ไขขั้นตอนการสร้างลายเซ็น ECDSA เพื่อใช้งานได้อย่างปลอดภัย $k$ มันได้รับ แทน $k$, รุ่นลายเซ็นสามารถใช้ได้ $k':=f(d_U,H,k)$ ที่ไหน $d_U$ เป็นคีย์ส่วนตัว $H$ คือแฮชของข้อความที่จะลงนาม และ $f$ เป็นฟังก์ชันที่ได้มาจากคีย์สาธารณะโดยใช้ $d_U$ เป็นคีย์หลักโดยมีเอาต์พุตใกล้เคียงกับเครื่องแบบใน $[1,น)$ ที่ไหน $n$ เป็นคำสั่งของเครื่องกำเนิดไฟฟ้า การปฏิบัติดังกล่าวไม่ได้ทำลายความเข้ากันได้แต่อย่างใด และตรวจพบได้กับทั้งสองอย่างเท่านั้น $k$ และคีย์ส่วนตัว (เหนือข้อมูลสาธารณะอื่นๆ) สำหรับ $n$ สูงสุด 384 บิตเป็นอย่างน้อย ฟังก์ชันที่เหมาะสมจะเป็น $$k':=1+(\operatorname{HMAC-SHA-512}(d_U,H\mathbin\|k)\bmod(n-1))$$
หมายเหตุ: ตามทฤษฎีแล้ว ขั้นตอนการลงนามมีจำนวน "กลับสู่ขั้นตอนที่ 1" ซึ่งจะเรียกใช้อีกครั้ง $f$ และคาดหวังที่แตกต่างออกไป $k'$และจะไม่ได้รับสิ่งนั้นอย่างไรก็ตามนั่นเป็นเรื่องที่สงสัยเนื่องจากมีความเป็นไปได้ที่จะเรียกใช้ซ้ำ $f$ เป็นสิ่งที่เล็กน้อยมาก และไม่สามารถทดสอบได้แม้ว่าจะมีการควบคุมก็ตาม $d_U$, $H$ และ $k$, สำหรับการแก้ไขที่เหมาะสมไม่ใช่เนื้อร้าย $f$. หากความเป็นไปได้นั้นป้องกันตรายางไม่ให้โดนกระดาษ เราสามารถใช้ $k'=f(d_U,H\oplus j,k)$ ที่ไหน $เจ$ คือจำนวนการเรียกใช้ก่อนหน้าของ $f$ ในลายเซ็น
หมายเหตุ: เมื่อใดและหากไม่มีข้อเสียเปรียบในการระบุกำหนดลายเซ็น เราสามารถเพิกเฉยต่ออินพุตได้ $k$. เมื่อพิจารณาถึงการโจมตีช่องทางด้านข้าง (แต่ไม่ใช่ทั้งหมด) ที่อาจปลอดภัยกว่า โดยเฉพาะอย่างยิ่งการโจมตีจากศัตรูที่รู้และควบคุมได้ $k$.