我有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
。有什么解决方案吗?