Я пишу небольшой проект криптографии с эллиптическими кривыми, и программа работает хорошо, когда я использую аффинную систему координат, что означает, что каждая точка представлена двумя координатами (x ', y').
Теперь я пытаюсь заменить аффинную систему координат на якобианскую систему координат, в которой каждая точка представлена 3 координатами (x, y, z), x '= x / z² и y' = y / z³.
Я хотел бы знать, как преобразовать аффинные координаты в якобианские координаты **.В некоторых уроках люди используют формулу: (x, y) = (x, y, 1), что означает, что координата z всегда установлена в единицу.Но я не уверен, что это правильно.
Тогда для сложения точек по эллиптической кривой вычислить P (x1, y1, z1) + Q (x2, y2, z2) = R (x3, y3,z3).В своей программе я использовал следующие формулы:
u1 = x1.z2²
u2 = x2.z1²
s1 = y1.z2³
s2 = y2.z1³
h = u2 - u1
r = s2 - s1
x3 = r² - h³ - 2.u1.h²
Y3 = r. (U1.h² - x3) - s1.h³
z3 = z1.z2.h
Но когда я тестирую свою программу, я получаю некоторые отрицательные координаты, например (-2854978200, -5344897546224,578).И когда я пытаюсь преобразовать результат обратно в аффинную систему координат с формулой (x '= x / z², y' = y / z³), я получаю (-8545, -27679), на самом деле координата x равна -8545.689.... Якобианская координата x не делится на z².
Что делать, если координаты не являются целыми числами?А если они отрицательные?Я попытался изменить размер поля моей кривой, но результат также не верен.
Таким образом, точка, использующая якобианские координаты (x,y,1)
, верна, но не уникальна.Все точки, удовлетворяющие (a^2.x,a^3.y,a)
, эквивалентны.И в моей программе кривая определена в простом поле, поэтому, когда я вычисляю u1, u2, s1, s2 ...
, я должен применить MOD p к каждой переменной?
И для преобразования конечного результата обратно в аффинные координаты, например, координата Xна самом деле это не деление, это модульное обратное? Например, моя кривая определена в конечном простом поле p=11
, и у меня есть точка, использующая якобианские координаты (15,3,2)
, для преобразованияЯкобианская координата х для аффинной координаты х, я должен вычислить 2^2 = 4 => x = 4^-1 mod p => x = 3
и 15.3 mod p = 1
, поэтому аффинная координата х равна 1, верно?
Цель якобианских координат - избежать деления во времядополнение.Но, как сказал Томас Порнин, когда мы вычисляем P1 + P2 = P3
, есть несколько особых случаев, которые нужно обработать.
- P1 и P2 оба бесконечны:
P3=infinite
. - P1 бесконечен:
P3=P2
. - P2 бесконечен:
P3=P1
. - P1 и P2 имеют одинаковую координату x, но разные координаты y или обе координаты y равны 0:
P3=infinite
. - P1 и P2 имеют разные координаты x:
Addition formula
. - P1 и P2 имеют одинаковые координаты:
Doubling formula
.
А вот прототипы моих функций C:
jac_addition(jacobian *, point *, jacobian *);
jac_doubling(jacobian *, jacobian *);
point
- это структура, представляющая точку, определенную в аффинной системе координат, и jacobian
для якобианской системы.
Проблема заключается в том, что я рассматриваю эти особые случаи, особенночетвертое - мне все еще нужно преобразовать обе точки обратно в аффинные координаты, или я не могу сравнить их координаты, а это значит, что мне все еще нужно вычислить деление.