2014-12-22 4 views
2

Я уже проверял подобные вопросы, но я не мог решить свою проблему. Наиболее актуальным является Elliptic curve addition in Jacobian coordinates, но решения нет.Добавление эллиптической точки кривой в якобиан Координаты

У меня есть вспомогательный класс, называемый якобиан, который будет иметь три якобиевы координаты X, Y & X Я последовал алгоритм опубликован на http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-2007-bl

Алгоритм является:

Z1Z1 = Z12 
Z2Z2 = Z22 
U1 = X1*Z2Z2 
U2 = X2*Z1Z1 
S1 = Y1*Z2*Z2Z2 
S2 = Y2*Z1*Z1Z1 
H = U2-U1 
I = (2*H)2 
J = H*I 
r = 2*(S2-S1) 
V = U1*I 
X3 = r2-J-2*V 
Y3 = r*(V-X3)-2*S1*J 
Z3 = ((Z1+Z2)2-Z1Z1-Z2Z2)*H 

Когда я проверил результат не на определенной кривой. Я также проверил его с Sage, но у меня получился другой результат.

public Jacobian pointAddition(Jacobian jp1, Jacobian jp2){ 
     /* 
     Reference: http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-2007-bl 
     Z1Z1 = Z12 
     Z2Z2 = Z22 
     U1 = X1*Z2Z2 
     U2 = X2*Z1Z1 
     S1 = Y1*Z2*Z2Z2 
     S2 = Y2*Z1*Z1Z1 
     H = U2-U1 
     I = (2*H)2 
     J = H*I 
     r = 2*(S2-S1) 
     V = U1*I 
     X3 = r2-J-2*V 
     Y3 = r*(V-X3)-2*S1*J 
     Z3 = ((Z1+Z2)2-Z1Z1-Z2Z2)*H 
     */ 
     if(arePointsInverse(jp1, jp2)){ 
      return P0; 
     } 
     if(arePointsEqual(jp1, jp2)){ 
      return pointDoubling(jp1); 
     } 
     if(jp1.isInfinity(getGf())){ 
      return jp2; 
     } 
     if(jp2.isInfinity(getGf())){ 
      return jp1; 
     } 
     BigInteger X1 = jp1.getX(); 
     BigInteger Y1 = jp1.getY(); 
     BigInteger Z1 = jp1.getZ(); 

     BigInteger X2 = jp2.getX(); 
     BigInteger Y2 = jp2.getY(); 
     BigInteger Z2 = jp2.getZ(); 

     BigInteger X3,Y3,Z3; 

     BigInteger Z1Z1 = Z1.multiply(Z1); 
     //BigInteger Z1Z1 = Z1.pow(2).mod(getGf()); 
     BigInteger Z2Z2 = Z2.multiply(Z2); 
     //BigInteger Z2Z2 = Z2.pow(2).mod(getGf()); 
     BigInteger U1 = X1.multiply(Z2Z2); 
     BigInteger U2 = X2.multiply(Z1Z1); 
     BigInteger S1 = Y1.multiply(Z2.multiply(Z2Z2)); 
     BigInteger S2 = Y2.multiply(Z1.multiply(Z1Z1)); 
     BigInteger H = U2.subtract(U1); 
     BigInteger I = (TWO.multiply(H)).pow(2); 
     BigInteger J = H.multiply(I); 
     BigInteger r = TWO.multiply(S2.subtract(S1)); 
     BigInteger V = U1.multiply(I); 

     X3 = ((r.multiply(r)).subtract(J).subtract(TWO.multiply(V))).mod(getGf()); 
     Y3 = ((r.multiply(V.subtract(X3))).subtract(TWO.multiply(S1.multiply(J)))) 
       .mod(getGf()); 
     Z3 = ((((Z1.add(Z2)).pow(2)).subtract(Z1Z1).subtract(Z2Z2)).multiply(H)) 
       .mod(getGf()); 
     return new Jacobian(X3,Y3,Z3); 
    } 
+0

Ваш вопрос будет полезен для вычислительной науки. http://scicomp.stackexchange.com/ –

+0

Не говорите нам, что вы уже «проверили все [релевантную документацию]». Вероятно, это даже не так, и это не поможет вам ответить. Расскажите нам, какие ** конкретные ** документы были ближе всего к ответу на ваш вопрос и почему они этого не сделали. –

+0

@PascalCuoq По крайней мере, я утверждаю, что я уже проверил все из них. Наиболее актуальным является http://stackoverflow.com/questions/21463018/elliptic-curve-addition-in-jacobian-coordinates?rq=1 – Nayef

ответ

0

Реализация выше корректна была ошибка в якобиевом классе (в конструкторе), которые обновляют Z в два раза с неправильным значением.

Смежные вопросы