当前位置: 首页 > 知识库问答 >
问题:

使用“RSA/ECB/PKCS7Padding”和Bouncy Castle

韩烈
2023-03-14

我尝试使用“RSA/ECB/PKCS7Padding”进行加密。JCE不支持它。所以我下载了Bouncy Castle,但Bouncy Castle似乎也不支持这种转换。以下代码:

Security.insertProviderAt(new BouncyCastleProvider(), 1);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS7Padding");

投掷

Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/ECB/PKCS7Padding
    at javax.crypto.Cipher.getInstance(Cipher.java:524)
    ....
Caused by: javax.crypto.NoSuchPaddingException: Unsupported padding PKCS7Padding
    at sun.security.pkcs11.P11RSACipher.engineSetPadding(P11RSACipher.java:129)
    at javax.crypto.Cipher$Transform.setModePadding(Cipher.java:360)
    at javax.crypto.Cipher.getInstance(Cipher.java:517)
    ... 4 more

我做得对吗?

蒂亚。

共有3个答案

尉迟宇定
2023-03-14

总结一下我的评论,根据java7文档,JCE Cipher API的每个实现都必须支持标准算法列表。弹跳城堡也支持其他算法。我在我的应用程序中使用“AES/ECB/PKCS7Padd”。您可以在算法部分找到弹跳城堡支持的算法,“RSA/ECB/PKCS1Padd”“RSA/NONE/PKCS1Padd”应该可以工作。

白烨煜
2023-03-14

即使存在这种情况,使用带有PKCS#7填充的RSA或直接从PKCS#7填充派生的方案也是不安全的(或者更准确地说,它不是CPA安全的)。

更可能的是,客户端不需要PKCS#7填充,但加密数据应包含在CMS消息格式中。PKCS#7是此格式的前身,PKCS#7填充只是此规范的一小部分。

Bouncy Castle包含此格式的实现:

用于S/MIME和CMS的发生器/处理器(PKCS7/RFC 3852)。

当前包含在bcpkix*JAR文件中。

相云
2023-03-14

无法按照RFC2315第10.3节注释2所述,对所有RSA密钥大小执行PKCS#7填充:

一些内容加密算法假定输入长度是k个八位字节的倍数,其中k

具体而言:

此填充方法定义良好,当且仅当k

这意味着您可以使用2048位密钥为RSA实现这一点,但4096位密钥对于任意数据来说已经太多了。这就是为什么PKCS7Padd保留给每个块通常在128到256位之间的块密码。这也是为什么库通常不支持这种组合的原因。

上述规范包含实现PKCS#7填充方案所需的所有知识。这样做时,您将使用它填充数据,然后使用RSA/ECB/NoPadding进行加密。您可能会遇到这样的问题:虽然填充的明文和密钥大小相同,但加密不起作用。这是因为填充的明文可能仍然超过密钥。您可能需要在纯文本的前面添加一个零字节,并且只填充(0x00纯文本),以便取消设置最高有效位。

 类似资料:
  • 问题内容: Java有一种称为的模式RSA/ECB/OAEPWithSHA-256AndMGF1Padding。那有什么意思? RFC3447,公开密钥密码标准(PKCS)#1:RSA密码规范2.1版,第7.1.2节解密操作说,哈希和MGF都是RSAES-OAEP-DECRYPT的选项。MGF是它自己的功能,在B.2.1节MGF1中定义,并且还具有自己的Hash“选项”。 也许RSAES-OAEP

  • 问题内容: Java有一种称为的模式。那有什么意思? RFC3447, 公开密钥密码标准(PKCS)#1:RSA密码规范2.1版 ,第 7.1.2 节 解密操作 说,哈希和MGF都是RSAES-OAEP- DECRYPT的选项。MGF是它自己的功能,在 B.2.1节MGF1中 定义,并且还具有自己的哈希“选项”。 也许RSAES-OAEP- DECRYPT和MGF1中的哈希“选项”应该是相同的,或

  • 问题内容: 我在Oracle的Java标准加密提供程序中发现了困难的方法 使用以SHA-1实例化的MFG1;SHA-256仅用于对标签进行哈希处理(实际上是空的)。我发现在MFG1中实际使用SHA-256的唯一解决方案(得到该答案和注释的帮助)是使用以下替代形式Cipher.init: 问:有没有转变是会认识到,与类似的效果,除了与MGF1使用SHA-256? 问题答案: 不,没有。 Java是开

  • 我想使用生成随机密钥,但java不支持填充,在我的算法中,我必须使用相同的填充,弹性城堡确实支持,但我无法理解如何使用它生成密钥 我的代码: 我收到的错误没有这样的算法

  • 这几天我一直在纠结。我需要使用一个接受加密参数的API。API是用C#编写的。请求的加密如下: 算法:AES 密码模式:CBC 填充模式:PKCS7 块大小:128 密钥大小:256 加密字符串的表示形式:Base64 在搜索和尝试了网上建议的那么多东西之后,我仍然无法生成相同的加密值(特别是默认情况下不支持PKCS7,而PKCS5应该工作相同,但事实并非如此)。以下是我尝试过的一些方法: 1)使

  • 我通常会在这里找到我们大部分问题的答案,但这次我需要问:-)。 我们在Android 8.0(API级别26)上运行的一个应用程序中遇到了RSA加密/解密问题。 我们一直在将RSA与“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”一起使用,这在Android 7.1之前的所有版本上都能正常工作。在Android 8.0上运行的同一代码在调用Cipher时引发了非法Bl