我试图使用AES算法加密数据。 然而,发生以下情况例外。
java.security.NoSuchAlgorithmException:
Cannot find any provider supporting AES/ECB/PKCS7PADDING
有人知道解决这个问题? 我的JDK的版本为1.7。
我试图使用AES算法加密数据。 然而,发生以下情况例外。
java.security.NoSuchAlgorithmException:
Cannot find any provider supporting AES/ECB/PKCS7PADDING
有人知道解决这个问题? 我的JDK的版本为1.7。
你不想指定PKCS#7填充块密码使用。 要指定PKCS#5填充。 PKCS#5被用于块密码使用指定而PKCS#7是不(对于不同的地方它的用途等在S / MIME)。 我要指出的是PKCS#5和PKCS#7实际上指定完全相同的类型的填充(它们都是一样的!),但在这种情况下使用时,它被称为#5。 :)
因此,而不是"AES/ECB/PKCS7PADDING"
想要"AES/ECB/PKCS5PADDING"
这是一个Java平台的每一种实现需要支持的加密实现。 查看该文件的Cipher
类的更多细节。
对于包括PKCS#5和PKCS#7加密标准文本中的问题的一个非常全面的解释,请看看这里 。
PKCS#5填补装置填充1至8个字节。 填充字节本身包含的编码为一个字节的填充字节的数量。 PKCS#5填充物为DES指定,但将是适合于与8个字节的块大小的任何块密码。
现在DES规格,甚至相当长一段时间的PKCS#5规范的基于密码加密之前和Java的。 AES只规范于2002年,Java和连渣2推出后不久。 所以,(三人间)DES和PKCS#5填充被集成到Java AES作出了出现之前。
当Java的 - 或者更确切地说,是Sun JCE提供 - 获得AES功能,它需要16个字节的块大小的填充方法。 PKCS#7指定了该填补方法那是相同的PKCS#5填充 ,不同之处在于它是为2至255个字节的块大小(一个字节的最高值,如果它编码一种基于零的无符号整数)中所定义。 然而,填充方法已经在那里了; 它被命名为"PKCS5Padding"
。 因此,而不是引入新的名字, "PKCS5Padding"
被简单地重新使用。
现在太阳提供商应该真正支持"PKCS7Padding"
作为PKCS#5填充简直是不正确。 这不只是一个Java命名问题,这对于那些试图实现加密协议或端口的其它应用程序到Java开发人员的任何一个问题。 现在然而,你应该使用"PKCS5Padding"
,而不是"PKCS7Padding"
。
如果你想使用AES / ECB / PKCS7Padding然后充气城堡将支持HT TP://www.bouncycastle.org/specifications.html