我有以下使用反弹城堡库的Java代码:

byte[] privKey = new byte[32];
privKey[31] = 1;


ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1");
ECPoint pointQ = spec.getG().multiply(new BigInteger(1, privKey));

System.out.println(pointQ.getRawXCoord());
System.out.println(pointQ.getRawYCoord());


可以肯定的是,我想对计算出的X和Y进行secp256k1测试向量的验证。
https://chuckbatson.wordpress.com/2014/11/26/secp256k1-test-vectors/

这仅适用于k = 1。

但是当我使用k = 2时

byte[] privKey = new byte[32];
privKey[31] = 2;


我得到的X和Y值完全不同。我在这里做错了吗?

最佳答案

为了加快ECC计算速度,我们使用了投影坐标系。在这种情况下,点由3个数字表示:X,Y,Z。在您的代码中,您得到投影坐标,这就是X,Y与测试向量的仿射坐标不匹配的原因。

您应该归一化点以获得仿射X和Y:

byte[] privKey = new byte[32];
privKey[31] = 2;

ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1");
ECPoint pointQ = spec.getG().multiply(new BigInteger(1, privKey));

pointQ = pointQ.normalize();

System.out.println(pointQ.getRawXCoord());
System.out.println(pointQ.getRawYCoord());

09-27 14:38