我试图使用 AES 算法加密数据。但是,发生了以下异常。
java.security.NoSuchAlgorithmException:
Cannot find any provider supporting AES/ECB/PKCS7PADDING
有人知道这个问题的解决方案吗?我的 JDK 版本是 1.7。
原文由 Suby Lee 发布,翻译遵循 CC BY-SA 4.0 许可协议
我试图使用 AES 算法加密数据。但是,发生了以下异常。
java.security.NoSuchAlgorithmException:
Cannot find any provider supporting AES/ECB/PKCS7PADDING
有人知道这个问题的解决方案吗?我的 JDK 版本是 1.7。
原文由 Suby Lee 发布,翻译遵循 CC BY-SA 4.0 许可协议
有关包含 PKCS#5 和 PKCS#7 加密标准文本的问题的非常全面的解释,请查看 此处。
PKCS#5 padding 表示填充 1 到 8 个字节。填充字节本身包含编码为字节的填充字节的数量。 PKCS#5 填充是为 DES 指定的,但它适用于块大小为 8 字节的任何块密码。
现在,基于密码的加密的 DES 规范甚至 PKCS#5 规范都比 Java 早了很长时间。 AES 在 2002 年才被标准化,在 Java 甚至 Java 2 被引入很久之后。因此,在 AES 出现之前,(三重)DES 和 PKCS#5 填充被集成到 Java 中。
当 Java——或者更准确地说,Sun JCE 提供者——获得 AES 功能时,它需要一个用于 16 字节块大小的填充方法。 PKCS#7 指定此填充方法 与 PKCS#5 填充相同,除了它是为 2 到 255 字节的块大小定义的(如果它编码从零开始的无符号整数,则字节的最大值)。但是,填充方法已经存在;它被命名为 "PKCS5Padding"
。因此,没有引入新名称,而是简单地重新使用了 "PKCS5Padding"
。
到目前为止,Sun 提供商应该真正支持 "PKCS7Padding"
因为 PKCS#5 填充完全不正确。这不仅仅是一个 Java 命名问题,对于任何试图实现加密协议或将其他应用程序移植到 Java 的开发人员来说,这都是一个问题。但是现在,您应该使用 "PKCS5Padding"
而不是 "PKCS7Padding"
。
原文由 Maarten Bodewes 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.1k 阅读
8 回答6.3k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决
您不想为块密码使用指定 PKCS#7 填充。您想要指定 PKCS#5 填充。 PKCS#5 指定用于块密码,而 PKCS#7 则不是(它用于不同的地方,如 S/MIME)。我要指出的是 PKCS#5 和 PKCS#7 实际上指定了完全相同的填充类型(它们是相同的!),但在此上下文中使用时称为 #5。 :)
所以,而不是
"AES/ECB/PKCS7PADDING"
,你想要"AES/ECB/PKCS5PADDING"
。这是 Java 平台的每个实现都需要支持的密码实现。有关详细信息,请参阅Cipher
类的文档。