Tôi có một tập lệnh python thực hiện bổ sung điểm ECC (dán mã bên dưới), nó chỉ đơn giản thực hiện P = Q1 + Q2 khi phối hợp Jacob.
Tuy nhiên, khi thực hiện một số phép thử hồi quy, tôi nhận thấy nếu hoán đổi vị trí P1 và P2 sẽ nhận được các kết quả khác nhau, trong đó có một kết quả đúng.
Dưới đây là một ví dụ chỉ cần sử dụng điểm secp256k1 G làm một điểm và 2*G làm điểm thứ 2 để chạy thử nghiệm.
Câu hỏi của tôi (Cập nhật nhận xét sau khi nhận được trả lời từ @fgrieu)
1). Phép cộng điểm ECC trên một đường cong--đó có phải là Giao hoán (nên là) không?
2). Tôi nhận thấy rằng đối với các kết quả, tọa độ x giống nhau trong khi y/z khác nhau-- (chúng biểu thị giống nhau trên tọa độ affine).
3). Dựa trên các đề xuất, tôi cập nhật tập lệnh để hoàn thành.
def Point_Add(bản thân, Q1, Q2):
nếu (Q1.x==self.p):
trở lại quý 2
nếu (Q2.x==self.p):
trở lại Q1
Q1z2 = (Q1.z*Q1.z) % self.p
Q2z2 = (Q2.z*Q2.z) % self.p
U1 = (Q1.x*Q2z2) % self.p
U2 = (Q2.x*Q1z2) % self.p
S1 = (Q1.y*Q2z2*Q2.z) % self.p
S2 = (Q2.y*Q1z2*Q1.z) % self.p
nếu (U1 == U2):
if (S1!=S2): # cặp đối diện, tức là Q1 = -Q2
tự trả về.Unit
khác: # Q1 = Q2
tự trả về.Point_Double(Q1)
H = (U2-U1) % self.p
R = (S2-S1) % self.p
H2 = (H*H) % self.p
H3 = (H2*H) % self.p
x3 = (R*R-H3-2*U1*H2 ) % self.p
y3 = (R*(U1*H2-x3)-S1*H3 ) % self.p
z3 = (H*Q1.z*Q2.z) % self.p
trả lại JBPoint(self, x3, y3, z3)
Kết quả kiểm tra
Gỡ lỗi 1: kiểm tra P=Q1+Q2:
Điểm.X(Jacob): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Điểm.Y(Jacob): 0x435afe76017b8d55d04ff8a98dd60b2ba7eb6f87f6b28182ca4493d7165dd127
Điểm.Z(Jacob): 0x9242fa9c0b9f23a3bfea6a0eb6dbcfcbc4853fe9a25ee948105dc66a2a9b5baa
Điểm.X(affine): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
Điểm.Y(affine): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
Point.X(affine): 112711660439710606056748659173929673102114977341539408544630613555209775888121
Điểm.Y(affine): 25583027980570883691656905877401976406448868254816295069919888960541586679410
Gỡ lỗi 2: kiểm tra P=Q2+Q1:
Điểm.X(Jacob): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Điểm.Y(Jacob): 0xbca50189fe8472aa2fb007567229f4d458149078094d7e7d35bb6c27e9a22b08
Điểm.Z(Jacob): 0x6dbd0563f460dc5c401595f1492430343b7ac0165da116b7efa23994d564a085
Điểm.X(affine): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
Điểm.Y(affine): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
Point.X(affine): 112711660439710606056748659173929673102114977341539408544630613555209775888121
Điểm.Y(affine): 25583027980570883691656905877401976406448868254816295069919888960541586679410