我尝试使用" 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。
答案 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"
应该有效。