ฉันกำลังเขียนแอปพลิเคชันที่ต้องการทั้งการเข้ารหัส/ถอดรหัส และการลงนาม/การตรวจสอบ และฉันเลือก X25519 เป็นอัลกอริทึมข้อตกลงหลักซึ่งจะสร้างคีย์สำหรับการเข้ารหัส และ ECDSA เพื่อลงนามข้อความ
การสร้างคีย์: ฉันสร้างคีย์ส่วนตัว curve25519 จากตัวช่วยจำ (ดังนั้นฉันจึงมีคีย์ส่วนตัวแบบสุ่ม 32 ไบต์)
ตอนนี้ฉันมีอาร์เรย์ 32 ไบต์ ฉันต้องการใช้อาร์เรย์ไบต์อาร์เรย์นี้สำหรับทั้งการเข้ารหัสและการเซ็นชื่อ ปัญหาที่ฉันมีคือสำหรับ X25519 ฉันต้องใช้การบีบคีย์เพื่อให้ไพรเวตคีย์นี้ถูกต้องซึ่งมีลักษณะดังนี้:
คีย์ส่วนตัว[0] &= 248; // unset 3 bits ที่มีนัยสำคัญน้อยที่สุด
privateKey[31] &= 127 // unset บิตที่สำคัญที่สุด
privateKey[31] |= 64 // ตั้งค่าบิตที่มีนัยสำคัญรองลงมา
แต่สำหรับ ECDSA คีย์ต้องอยู่ในช่วง $[1, น]$โดยที่ N (สำหรับเส้นโค้ง 25519) เท่ากับ $2^{252}$ + ปัจจัยเล็กน้อย ดังนั้นฉันจึงต้องแปลงอาร์เรย์ 32 ไบต์เป็นตัวเลขที่เหมาะกับช่วงนี้
ฉันมีคำถามสองสามข้อ:
- เหตุใดคีย์ส่วนตัว X25519 จึงไม่จำเป็นต้องพอดีกับช่วง $[1, น]$?
- เหตุใดจึงไม่สำคัญที่จะใช้ฟังก์ชันการบีบคีย์ที่ใช้ใน X25519 กับคีย์ที่ใช้สำหรับ ECDSA