本文介绍了椭圆曲线在雅可比坐标中的加法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在椭圆曲线上添加两个点在素材场上,从仿射/仿射坐标转换这些点,但不能得到正确的结果(我测试的曲线有a = 0)。

I try to add two points on an elliptic curve over a prime field, converting these points from affine/to-affine coordinates, but do not manage to get a correct result (the curve I am testing has a=0). Anyone can see what's wrong?

// From Affine
BigInteger X1=P.x;
BigInteger Y1=P.y;
BigInteger Z1=BigInteger.ONE;

BigInteger X2=Q.x;
BigInteger Y2=Q.y;
BigInteger Z2=BigInteger.ONE;

// Point addition in Jacobian coordinates for a=0
// see http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl
BigInteger Z1Z1 = Z1.multiply(Z1);
BigInteger Z2Z2 = Z2.multiply(Z2);
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    = H.add(H).multiply(H.add(H));
BigInteger J    = H.multiply(I);
BigInteger r    = S2.subtract(S1).add(S2.subtract(S1));
BigInteger V    = U1.multiply(I);
BigInteger X3   = r.multiply(r).subtract(J).subtract(V.add(V)).mod(FIELD);
BigInteger Y3   = r.multiply(V.subtract(X3)).subtract(S1.add(S1).multiply(J)).mod(FIELD);
BigInteger Z3   = Z1.add(Z2).multiply(Z1.add(Z2)).subtract(Z1Z1).subtract(Z2Z2).multiply(H).mod(FIELD);

//To affine
BigInteger Z3Z3 = Z3.multiply(Z3);
BigInteger Z3Z3Z3 = Z3Z3.multiply(Z3);

return new Point(X3.divide(Z3Z3),Y3.divide(Z3Z3Z3));


推荐答案

CodesInChaos说:

CodesInChaos said:

这篇关于椭圆曲线在雅可比坐标中的加法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 02:06