У меня есть скрипт на Python, который добавляет точку ECC (вставка кода ниже), он просто выполняет P = Q1 + Q2 для координации Джейкоба.
Однако, выполняя некоторые регрессионные тесты, я обнаружил, что если я поменяю позиции P1 и P2, я получу разные результаты, один из которых правильный.
Ниже приведен пример простого использования точки G secp256k1 в качестве одной точки и 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):
if (S1!=S2): # противоположная пара, т.е. Q1 = -Q2
вернуть self.Unit
иначе: # Q1 = Q2
вернуть self.Point_Double (Q1)
H = (U2-U1) % соб.р
R = (S2-S1) % self.p
H2 = (H*H) % от себя.p
H3 = (H2*H) % собств.p
x3 = (R*R-H3-2*U1*H2 ) % от себя.p
y3 = (R*(U1*H2-x3)-S1*H3 ) % self.p
z3 = (H*Q1.z*Q2.z) % self.p
вернуть JBPoint(я, x3, y3, z3)
Результат испытаний
Отладка 1: тест P=Q1+Q2:
Point.X(Джейкоб): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Point.Y(Джейкоб): 0x435afe76017b8d55d04ff8a98dd60b2ba7eb6f87f6b28182ca4493d7165dd127
Point.Z(Джейкоб): 0x9242fa9c0b9f23a3bfea6a0eb6dbcfcbc4853fe9a25ee948105dc66a2a9b5baa
Точка.X(аффинная): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
Point.Y(аффинный): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
Точка.X(аффинная): 112711660439710606056748659173929673102114977341539408544630613555209775888121
Точка.Y(аффинная): 25583027980570883691656905877401976406448868254816295069919888960541586679410
Отладка 2: тест P=Q2+Q1:
Point.X(Джейкоб): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Point.Y(Джейкоб): 0xbca50189fe8472aa2fb007567229f4d458149078094d7e7d35bb6c27e9a22b08
Point.Z(Джейкоб): 0x6dbd0563f460dc5c401595f1492430343b7ac0165da116b7efa23994d564a085
Точка.X(аффинная): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
Point.Y(аффинный): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
Точка.X(аффинная): 112711660439710606056748659173929673102114977341539408544630613555209775888121
Точка.Y(аффинная): 25583027980570883691656905877401976406448868254816295069919888960541586679410