使用" RSA / ECB / PKCS7Padding"与充气城堡

时间:2015-01-23 02:17:02

标签: java encryption cryptography rsa bouncycastle

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

3 个答案:

答案 0 :(得分:2)

对于所有RSA密钥大小,无法按RFC2315 section 10.3注释2中所述实施PKCS#7填充:

  

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

具体而言:

  

当且仅当k <1时,该填充方法是明确定义的。 256;大k的方法是一个尚待进一步研究的未决问题。

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

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

答案 1 :(得分:2)

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

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

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

  

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

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

答案 2 :(得分:0)

总结我的评论,根据java7文档,JCE Cipher API的每个实现都必须支持标准算法列表。 Bouncy castle也支持其他算法。我用&#34; AES/ECB/PKCS7Padding&#34;在我的申请中。您可以在algorithm section中找到支持的算法,"RSA/ECB/PKCS1Padding""RSA/NONE/PKCS1Padding"应该有效。