1

我有 3 个测试密钥——RSA、DSA 和 ECDSA。RSA 和 DSA 基于密钥的签名在验证后返回 true。但是基于 ECDSA 的签名总是返回 false(即使签名匹配)。

相同的代码用于验证所有 3 个测试密钥(除了传递给的提供程序对象的差异Signature.getInstance())。我的代码如下:

Signature ecdsa = Signature.getInstance("SHA1withECDSA");
ecdsa.initSign(pk);
ecdsa.update(rawKeyBytes);
byte[] signatureBytes = ecdsa.sign(); 

Signature ecdsa3 = Signature.getInstance("SHA1WithECDSA");
ecdsa3.initVerify(puk);  
ecdsa3.update(rawKeyBytes);
System.out.println("Verifying: "+ecdsa3.verify(signatureBytes));

程序的输出总是Verifying: false. 当我将提供程序更改为SHA1WithRSA并使用 RSA 密钥(使用上面相同的代码)时,验证返回 true,与基于 DSA 的密钥相同。有人提到它与ECPoint传递给ECPublicKeySpec()构造函数有关,当尝试从私钥创建公钥时,如下所示:

ECPrivateKey ec = (ECPrivateKey) privateKey;
ECPublicKeySpec ecKeySpec = new ECPublicKeySpec(
    ec.getParams().getGenerator(),
    ec.getParams()
);

有人提到,如果使用与私钥不同的密钥,签名验证(使用公钥)将失败ECPoint。但我实际上是ECPointPrivateKey对象 ( ec) 中得到的。请问有什么解决办法吗?

4

0 回答 0