我有 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
。但我实际上是ECPoint
从PrivateKey
对象 ( ec
) 中得到的。请问有什么解决办法吗?