验证在 JavaCard 上签名的数据时出现 Java BadPaddingException

Posted

技术标签:

【中文标题】验证在 JavaCard 上签名的数据时出现 Java BadPaddingException【英文标题】:Java BadPaddingException when verifying data signed on a JavaCard 【发布时间】:2021-06-19 08:18:54 【问题描述】:

我正在用密码对 JavaCard 上的一些数据进行签名,然后将其输出到文本文件中,将其读入 Java 程序并尝试验证它。我不断收到 BadPaddingException。

我在我的 JavaCard 小程序上这样签名:

Cipher cipher = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
cipher.init(key.getPrivate(), Cipher.MODE_ENCRYPT);
short sigCipherLength = cipher.doFinal(inputArray, inputOffset, inputLength, outputArray, outputOffset);

并像这样验证它(在我的 Java 程序上):

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decryptedText = cipher.doFinal(inputArray);

当使用带有“RSA”的 Cipher.getInstance 时,它​​默认为 RSA/ECB/RKPCS1Padding 不是吗?我不知道如何摆脱错误。

编辑:为了清楚起见,更改加密和解密以进行签名和验证

【问题讨论】:

阅读文档,以便检查您的解密所期望的填充。在加密中,一切都必须完全匹配。 我对你的措辞感到困惑:“解密数据签名” - 数据是签名还是加密?您的密钥对的使用应该是**用私钥签名**和用公钥验证,或者,对于加密,用公钥加密用私钥。那你想做什么?? 在签名和加密的上下文中,使用了不同的填充。关于库中的填充,在加密上下文中使用私钥进行的加密并未统一实施(尽管由于这种关系,Java 和 Java Card 实际上应该是这样)。尽管如此,在签名的上下文中应用Signature 类可能很有用,s。还有here. @MichaelFehr:Java 加密 API 是在 1990 年代设计的,当时将 RSA 签名/验证视为“使用私钥加密”和“使用公钥解密”的错误仍然很常见(参见例如 PKCS1v1 和 PKCS7v1 - 不是后来和改进的 CMS),它确实允许 Cipher.init(ENCRYPT,private) 和 (DECRYPT,public) 实际上执行并反转 RSASSA-PKCS1-v1_5 的最后两个步骤(pad 01FF...00 和 modexp,但不是哈希和 ASN.1 编码 DigestInfo 步骤)。 LozCodes:确保您正在“解密”(实际上是恢复)完全正确的数据——没有一点改变、添加或删除——并且公钥与卡上的私钥匹配。如果您可以添加数据示例和(测试!)键,它可能有助于诊断问题所在。 【参考方案1】:

也许这会有所帮助:Which padding is used by javax.crypto.Cipher for RSA。总之,不要依赖默认值,最好完全限定密码。

【讨论】:

我已经通过代码进行了更改,以便指定填充等,但不幸的是,我仍然遇到同样的异常

以上是关于验证在 JavaCard 上签名的数据时出现 Java BadPaddingException的主要内容,如果未能解决你的问题,请参考以下文章

本地获取 API 时出现自签名证书错误

Javascript(椭圆)上的 ECDSA 签名验证失败 [关闭]

在rails中验证pdf的数字签名时出现Origami和OpenSSL错误

apt update时出现签名无法验证,公钥失效的解决办法

在设备上测试时出现代码签名问题

Heroku 运行 sequelize db:migrate 时出现“自签名证书”错误