Am un script python care face adăugarea punctului ECC (pasarea codului de mai jos), pur și simplu realizează P =Q1+Q2 pe coordonarea lui Jacob.
Totuși, când am făcut niște teste de regresie, am constatat că dacă schimb pozițiile P1 și P2, voi obține rezultate diferite, dintre care unul corect.
Mai jos este un exemplu care folosește pur și simplu secp256k1 punctul G ca un punct și 2*G ca al doilea punct pentru a rula testul.
Întrebările mele (Actualizează comentariile după ce primești răspuns de la @fgrieu)
1). Adăugarea punctului ECC pe o curbă - ar fi aceasta comutativă (ar trebui să fie)?
2). Am observat că pentru rezultate, coordonatele x sunt aceleași, în timp ce y/z sunt diferite-- (reprezintă aceleași pe coordonatele afine).
3). Pe baza sugestiilor, actualizez scriptul, făcându-l finalizat.
def Point_Add(self, Q1, Q2):
dacă (Q1.x==self.p):
întoarce Q2
dacă (Q2.x==self.p):
întoarce Q1
Q1z2 = (Q1.z*Q1.z) % auto.p
Q2z2 = (Q2.z*Q2.z) % auto.p
U1 = (Q1.x*Q2z2) % auto.p
U2 = (Q2.x*Q1z2) % auto.p
S1 = (Q1.y*Q2z2*Q2.z) % auto.p
S2 = (Q2.y*Q1z2*Q1.z) % auto.p
dacă (U1 == U2):
dacă (S1!=S2): # pereche opusă, adică Q1 = -Q2
return self.Unitate
altfel: # Q1 = Q2
return self.Point_Double(Q1)
H = (U2-U1) % auto.p
R = (S2-S1) % auto.p
H2 = (H*H) % auto.p
H3 = (H2*H) % auto.p
x3 = (R*R-H3-2*U1*H2) % auto.p
y3 = (R*(U1*H2-x3)-S1*H3 ) % self.p
z3 = (H*Q1.z*Q2.z) % auto.p
returnează JBPoint(self, x3, y3, z3)
Rezultatul testului
Depanare 1: test P=Q1+Q2:
Punctul.X(Jacob): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Punct.Y(Jacob): 0x435afe76017b8d55d04ff8a98dd60b2ba7eb6f87f6b28182ca4493d7165dd127
Punct.Z(Jacob): 0x9242fa9c0b9f23a3bfea6a0eb6dbcfcbc4853fe9a25ee948105dc66a2a9b5baa
Punct.X(afin): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
Punct.Y(afin): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
Punctul.X(afin): 112711660439710606056748659173929673102114977341539408544630613555209775888121
Punct.Y (afin): 25583027980570883691656905877401976406448868254816295069919888960541586679410
Depanare 2: test P=Q2+Q1:
Punctul.X(Jacob): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Punct.Y(Jacob): 0xbca50189fe8472aa2fb007567229f4d458149078094d7e7d35bb6c27e9a22b08
Punct.Z(Jacob): 0x6dbd0563f460dc5c401595f1492430343b7ac0165da116b7efa23994d564a085
Punct.X(afin): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
Punct.Y(afin): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
Punctul.X(afin): 112711660439710606056748659173929673102114977341539408544630613555209775888121
Punct.Y (afin): 25583027980570883691656905877401976406448868254816295069919888960541586679410