BouncyCastle验证secp256k1公钥生成

时间:2018-12-20 15:46:00

标签: java cryptography bouncycastle ecdsa

我有以下使用反弹城堡库的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值完全不同。我在这里做错了吗?

1 个答案:

答案 0 :(得分:2)

为加快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());