【问题标题】:BouncyCastle validate secp256k1 public key generationBouncyCastle 验证 secp256k1 公钥生成
【发布时间】:2018-12-20 15:45:59
【问题描述】:

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

【问题讨论】:

    标签: java cryptography bouncycastle ecdsa


    【解决方案1】:

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

    【讨论】: