ECDSA签名在验证时始终返回false

时间:2013-02-26 12:22:52

标签: java digital-signature ecdsa

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

0 个答案:

没有答案