3

나는 소수점 위에 타원 곡선에 두 점을 추가하여이 점을 affine/affine 좌표에서 변환하려고하지만 정확한 결과를 얻을 수는 없습니다 (테스트중인 곡선 a = 0). 누구나 잘못된 것을 볼 수 있습니까?Jacobian 좌표에서의 타원 곡선 추가

// 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)); 
+0

확인하려면 ... 'BigInteger.ONE == 1', 맞습니까? 그래서 'Z1Z1 = Z1^2 = 1 = Z2Z2 = Z2^2 = 1' ... 그러면'U1 = X1', 'U2 = X2', S1 = Y1' 등 ... 뭔가 빠졌어요. ? – abiessu

+4

부서가 옳을 수 없습니다. 곱셈 역수로 'FIELD'를 모듈러로 계산해야합니다. 이 작업은 비용이 많이 들기 때문에 각 배가/더하기가 아니라 스칼라 곱셈의 끝에서 한 번만 수행해야합니다. 'z^{- 1} = ModPow (z, FIELD-2, FIELD)' – CodesInChaos

+1

예, BigIntegerOne == 1을 사용하십시오. 실제로 배수 대신에 곱셈 역함수를 사용해야합니다. 좋은 캐치. 나는 그것을 시험해보고 무슨 일이 일어나는지보고 할 것이다. – user1454590

답변

0

CodesInChaos는 말했다 :

사업부를 잘 할 수 없습니다. 곱셈 역변환 모듈 FIELD을 계산해야합니다. 이 작업은 비용이 많이 들기 때문에 각 배가/더하기가 아니라 스칼라 곱셈의 끝에서 한 번만 수행해야합니다. z^{-1} = ModPow(z, FIELD-2, FIELD)을 사용하십시오.