java.security.NoSuchAlgorithmException:找不到任何支持 AES/ECB/PKCS7PADDING 的提供商

新手上路,请多包涵

我试图使用 AES 算法加密数据。但是,发生了以下异常。

 java.security.NoSuchAlgorithmException:
    Cannot find any provider supporting AES/ECB/PKCS7PADDING

有人知道这个问题的解决方案吗?我的 JDK 版本是 1.7。

原文由 Suby Lee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

您不想为块密码使用指定 PKCS#7 填充。您想要指定 PKCS#5 填充。 PKCS#5 指定用于块密码,而 PKCS#7 则不是(它用于不同的地方,如 S/MIME)。我要指出的是 PKCS#5 和 PKCS#7 实际上指定了完全相同的填充类型(它们是相同的!),但在此上下文中使用时称为 #5。 :)

所以,而不是 "AES/ECB/PKCS7PADDING" ,你想要 "AES/ECB/PKCS5PADDING" 。这是 Java 平台的每个实现都需要支持的密码实现。有关详细信息,请参阅 Cipher 类的文档

原文由 user121356 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏