验证在 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的主要内容,如果未能解决你的问题,请参考以下文章
Javascript(椭圆)上的 ECDSA 签名验证失败 [关闭]