ECDA签名验证失败

发布于 2025-01-28 04:40:37 字数 1649 浏览 3 评论 0原文

我正在签署Javacard小程序上的一些数据,然后在PC上的Java中对其进行验证。为了测试这一点,我有一条消息,我知道应该验证,但是在运行代码验证时会失败。

这是我的代码:

//message = byte array of message from java card
//signature = byte array of signature from java card

BigInteger bigIntX = new BigInteger(1, xArray);
BigInteger bigIntY = new BigInteger(1, yArray);
boolean verified = false;

ECPoint w = new ECPoint(bigIntX, bigIntY);

KeyFactory newKeyFact = KeyFactory.getInstance("EC");
ECNamedCurveParameterSpec paramSpec = ECNAMEDCurveTable.getParameterSpec("secp256r1");
ECParameterSpec params = new ECNamedCurveSpec("secp256r1", paramSpec.getCurve(), paramSpec.getG(), paramSpec.getN(), paramSpec.getH());
ECPublicKey ecPublicKey - (ECPublicKey) newKeyFact.generatePublic(new ECPublicKeySpec(w, params));

Signature sig = Signature.getInstance("SHA256withECDSAinP1363Format");
sig.initVerify(ecPublicKey);
sig.update(message);
verified = sig.verify(signature);

if (verified) {
//print True
} else {
//print false
}

验证永远不会设置为True,即使我知道此消息应该验证正常。我是否重新构建了钥匙?还是我缺少其他东西?

这是我的javacard代码生成签名的代码:

KeyPair key = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_256);

ECPublicKey pubKey = (ECPublicKey) key.getPublic();
ECPrivateKey privKey = (ECPrivateKey) key.getPrivate();
initDomainParams(pubKey);
initDomainParams(privKey); //initDomainParams is just where I set A, B, G, R and K to the secp256r1 curve parameters using setA, setB etc

key.genKeyPair();
Signature sig = Signature.getInstance(Signature.ALG_ECDSA_SHA_256, false);
sig.init(key.getPrivate(), Signature.MODE_SIGN);
sig.sign(srcArr, srcoffset, srclength, destArr, destoffset);

I am signing some data on a Javacard applet, then verifying it in java on my PC. To test this I have a message I know should verify, but when running my code verification fails.

This is my code:

//message = byte array of message from java card
//signature = byte array of signature from java card

BigInteger bigIntX = new BigInteger(1, xArray);
BigInteger bigIntY = new BigInteger(1, yArray);
boolean verified = false;

ECPoint w = new ECPoint(bigIntX, bigIntY);

KeyFactory newKeyFact = KeyFactory.getInstance("EC");
ECNamedCurveParameterSpec paramSpec = ECNAMEDCurveTable.getParameterSpec("secp256r1");
ECParameterSpec params = new ECNamedCurveSpec("secp256r1", paramSpec.getCurve(), paramSpec.getG(), paramSpec.getN(), paramSpec.getH());
ECPublicKey ecPublicKey - (ECPublicKey) newKeyFact.generatePublic(new ECPublicKeySpec(w, params));

Signature sig = Signature.getInstance("SHA256withECDSAinP1363Format");
sig.initVerify(ecPublicKey);
sig.update(message);
verified = sig.verify(signature);

if (verified) {
//print True
} else {
//print false
}

verified never gets set to true, even though I know this message should verify fine. Am I re-constructing the key wrong? Or is there something else I'm missing?

This is my javacard code where the signature is generated:

KeyPair key = new KeyPair(KeyPair.ALG_EC_FP, KeyBuilder.LENGTH_EC_FP_256);

ECPublicKey pubKey = (ECPublicKey) key.getPublic();
ECPrivateKey privKey = (ECPrivateKey) key.getPrivate();
initDomainParams(pubKey);
initDomainParams(privKey); //initDomainParams is just where I set A, B, G, R and K to the secp256r1 curve parameters using setA, setB etc

key.genKeyPair();
Signature sig = Signature.getInstance(Signature.ALG_ECDSA_SHA_256, false);
sig.init(key.getPrivate(), Signature.MODE_SIGN);
sig.sign(srcArr, srcoffset, srclength, destArr, destoffset);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文