ฉันมีสคริปต์หลามที่ทำการเพิ่มจุด ECC (วางโค้ดด้านล่าง) มันเพียงแค่ดำเนินการ P =Q1+Q2 ในการประสานงานของ Jacob
อย่างไรก็ตาม เมื่อทำการทดสอบการถดถอย ฉันพบว่าถ้าฉันแลกเปลี่ยนตำแหน่ง P1 และ P2 ฉันจะได้ผลลัพธ์ที่แตกต่างกัน ซึ่งหนึ่งในนั้นถูกต้อง
ด้านล่างนี้คือตัวอย่างที่ใช้จุด secp256k1 G เป็นจุดเดียว และใช้ 2*G เป็นจุดที่สองเพื่อเรียกใช้การทดสอบ
คำถามของฉัน (อัปเดตความคิดเห็นหลังจากได้รับการตอบกลับจาก @fgrieu)
1). การเพิ่มจุด ECC บนเส้นโค้ง - จะเป็นการสับเปลี่ยน (ควรเป็น) หรือไม่
2). ฉันสังเกตเห็นว่าสำหรับผลลัพธ์ พิกัด x เหมือนกันในขณะที่ y/z ต่างกัน -- (พวกมันแทนค่าเดียวกันบนพิกัดใกล้เคียงกัน)
3). ตามคำแนะนำฉันอัปเดตสคริปต์ทำให้เสร็จ
def Point_Add (ตัวเอง, Q1, Q2):
ถ้า (Q1.x==self.p):
ผลตอบแทน Q2
ถ้า (Q2.x==self.p):
ผลตอบแทน Q1
Q1z2 = (Q1.z*Q1.z) % ตัวเอง.p
Q2z2 = (Q2.z*Q2.z) % ตัวเอง.p
U1 = (Q1.x*Q2z2) % ตัวเอง.p
U2 = (Q2.x*Q1z2) % ตัวเอง.p
S1 = (Q1.y*Q2z2*Q2.z) % ตัวเอง.p
S2 = (Q2.y*Q1z2*Q1.z) % ตัวเอง.p
ถ้า (U1 == U2):
ถ้า (S1!=S2): # คู่ตรงข้าม เช่น Q1 = -Q2
กลับ self.Unit
อื่น: # Q1 = Q2
กลับ self.Point_Double(Q1)
H = (U2-U1) % ตัวเอง.p
R = (S2-S1) % ตนเอง.p
H2 = (H*H) % ตัวเอง.p
H3 = (H2*H) % ตัวเอง.p
x3 = (R*R-H3-2*U1*H2 ) % ตัวเอง.p
y3 = (R*(U1*H2-x3)-S1*H3 ) % ตัวเอง.p
z3 = (H*Q1.z*Q2.z) % ตัวเอง.p
ส่งคืน JBPoint (ตัวเอง, x3, y3, z3)
ผลการทดสอบ
ดีบัก 1: ทดสอบ P=Q1+Q2:
Point.X(จาค็อบ): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Point.Y(เจคอบ): 0x435afe76017b8d55d04ff8a98dd60b2ba7eb6f87f6b28182ca4493d7165dd127
Point.Z(เจคอบ): 0x9242fa9c0b9f23a3bfea6a0eb6dbcfcbc4853fe9a25ee948105dc66a2a9b5baa
จุด X (เปรียบเทียบ): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
จุด Y (เปรียบเทียบ): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
จุด X (เปรียบเทียบ): 112711660439710606056748659173929673102114977341539408544630613555209775888121
จุด Y (เปรียบเทียบ): 25583027980570883691656905877401976406448868254816295069919888960541586679410
ดีบัก 2: ทดสอบ P=Q2+Q1:
Point.X(จาค็อบ): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Point.Y(เจคอบ): 0xbca50189fe8472aa2fb007567229f4d458149078094d7e7d35bb6c27e9a22b08
Point.Z(จาค็อบ): 0x6dbd0563f460dc5c401595f1492430343b7ac0165da116b7efa23994d564a085
จุด X (เปรียบเทียบ): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
จุด Y (เปรียบเทียบ): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
จุด X (เปรียบเทียบ): 112711660439710606056748659173929673102114977341539408544630613555209775888121
จุด Y (เปรียบเทียบ): 25583027980570883691656905877401976406448868254816295069919888960541586679410