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

我尝试使用“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 

我做得对吗?

TIA。

对于所有RSA密钥大小,无法实现RFC2315第10.3节注释2中所述的PKCS#7填充:

一些内容加密算法假设输入长度是k个八位字节的倍数,其中k> 1,并且让应用程序定义用于处理长度不是k个八位字节的倍数的输入的方法。 对于这样的算法,该方法应该在尾端填充输入,其中k – (l mod k)八位字节都具有值k – (l mod k),其中l是输入的长度。 换句话说,输入在尾端用以下字符串之一填充

特别是:

当且仅当k <256;这种填充方法是明确定义的。 较大k的方法是一个尚待研究的未决问题。

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

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

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

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

Bouncy Castle包含以下格式的实现:

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

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

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