BouncyCastle 验证 secp256k1 public 密钥生成
BouncyCastle validate secp256k1 public key generation
我有以下 Java 使用 bounce castle 库的代码:
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 aganst 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());
我有以下 Java 使用 bounce castle 库的代码:
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 aganst 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());