ฉันกำลังพัฒนาวิธีสร้างคีย์ส่วนตัวที่กำหนดขึ้นสำหรับเส้นโค้งวงรีตามอำเภอใจโดยอิงตามอินพุตของผู้ใช้ (กระเป๋าเงินสมอง) ขณะนี้ ฉันกำลังใช้อัลกอริทึมการแฮชรหัสผ่าน Scrypt พร้อมพารามิเตอร์ความยากที่มีประสิทธิภาพเพื่อแฮชพารามิเตอร์อินพุตจำนวนหนึ่งลงในคีย์
เอาต์พุตของ Scrypt ควรกระจายอย่างสม่ำเสมอระหว่างกัน $[0, 2^{b})$ ที่ไหน ${b}$ คือจำนวนบิตเอาต์พุตที่ใช้จากเอาต์พุตอัลกอริทึม Scrypt แต่คีย์ส่วนตัวของเส้นโค้งวงรีที่ถูกต้องต้องน้อยกว่าลำดับของฟิลด์จำกัดของเส้นโค้ง $N$, กระจายเท่า ๆ กันในหมู่ $[0, น)$. ดังนั้น การใช้เอาต์พุตของ Scrypt โดยตรงเป็น mod คีย์ส่วนตัว $N$ จะสร้างอคติเล็กๆ น้อยๆ ในผลลัพธ์ของคีย์ที่สร้างขึ้น ซึ่งก็คือข่าวร้าย ดังนั้นฉันจึงต้องหลีกเลี่ยงสิ่งนั้น
โดยปกติ หากคุณสร้างคีย์ส่วนตัวโดยใช้ RNG ที่ปลอดภัย คุณจะต้องลอง RNG ใหม่อีกครั้งจนกว่าจะได้ตัวเลขที่น้อยกว่า $N$และคุณสามารถใช้เป็นคีย์ส่วนตัวได้อย่างปลอดภัย
มีวิธีที่ปลอดภัยในการทำซ้ำเอาต์พุตของ Scrypt หรือไม่ ในลักษณะที่เราจะรักษาการกระจายแบบสุ่มหลอกของเอาต์พุตของ Scrypt โดยไม่ต้องเรียกใช้ Scrypt ซ้ำด้วยพารามิเตอร์ใหม่
วิธีหนึ่งที่ฉันพิจารณาคือแฮชผลลัพธ์ของการเข้ารหัสด้วย SHA256 หรือ SHA512 จนกว่าจะน้อยกว่า $N$แต่จะทำงานได้ไม่ดีนักสำหรับเส้นโค้งที่มีขนาดใหญ่กว่า 512 บิต เช่น P521
วิธีแก้ปัญหาที่สวยงามน้อยกว่าอีกวิธีหนึ่งคือการปฏิเสธพารามิเตอร์อินพุตที่สร้างคีย์ที่ใหญ่กว่า $N$. มันน่าจะหายากมากที่จะเกิดขึ้น ดังนั้นบางทีฉันอาจจะหนีไปได้? มีเส้นโค้งทั่วไปใดบ้างที่มีลำดับ $N$ ไม่ใช่เศษส่วนที่มีนัยสำคัญของกำลังสูงสุดถัดไปของสองใช่หรือไม่