我有以下使用反弹城堡库的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());