PKCS5Padding 可以处于 AES/GCM 模式吗?
Posted
技术标签:
【中文标题】PKCS5Padding 可以处于 AES/GCM 模式吗?【英文标题】:Can PKCS5Padding be in AES/GCM mode? 【发布时间】:2015-09-23 18:32:51 【问题描述】:AES/GCM 的填充模式是什么?我知道它可以是 NoPadding,因为在 ECB 模式下它可以是 PKCS5Padding,在 GCM 模式下呢?在 JCE 界面中,我们需要提供“算法/模式/填充”(Reference)。
所以我使用下面的代码来获取实例,它在 JDK 中工作,但在 IBM SDK 中失败了
找不到支持 AES/GCM/PKCS5Padding 的提供程序
Cipher.getInstance("AES/GCM/PKCS5Padding");
填充的真正用例是什么?
【问题讨论】:
填充描述了链中的块如何对齐和填充以匹配预期的块大小。 JRE 可以与不同的安全提供程序一起运行。 Oracle SDK 包括他自己的安全性极低的美国令人愉快的 Oracle 安全提供程序。我不知道 IBM SDK 中哪个 Security Prodiver 是默认的。最佳实践是在使用不同的 JRE 提供者(如 BouncyCastle)时包含您自己的安全提供者。或者在开发系统上使用目标系统的安全提供程序,比如当你为安卓开发时,OpenSSl 安全提供程序是默认的。希望有帮助 这是我认识的最好的安全提供商:bouncycastle.org/java.html 感谢回复,我不需要介绍第三个库。所以我需要使用 JDK 内置提供程序。像 SUNJCE,但在 IBM sdk 中,我猜它提供了自己的提供程序,但是,我的问题是,“AES/GCM/PKCS5Padding”是否具有合法价值?我没有发现任何在 GCM 中使用 PKCS5Padding 的示例,甚至 isaacyang1988.googlecode.com/svn/trunk/Crypt/src/org/… 这篇文章也有类似的测试用例,它不是正确的模式 看看Artjom的回答。否则,编写一个程序来检查您的 jre 的默认安全提供程序并打印出您所需算法的可能值。选择两边都存在的值就可以了 【参考方案1】:GCM 是一种流模式,这意味着密文只有明文的长度(不包括身份验证标签)。 GCM 不需要填充。这意味着PKCS5Padding版本实际上只是NoPadding的同义词,以方便编程。有些供应商没有这种奇怪的模式。
在某些情况下,填充明文是有意义的。例如,您可以通过附加一个随机长度的 PKCS5Padding 来隐藏实际明文的长度。
【讨论】:
谢谢,这说明我们需要更正 Cipher.getInstance("AES/GCM/NoPadding");对吗? 是的,Cipher.getInstance("AES/GCM/NoPadding");
是正确的方法。这可能与Cipher.getInstance("RSA/ECB/PKCS1Padding");
相同,实际上只有Cipher.getInstance("RSA/None/PKCS1Padding");
。
知道了。非常感谢。
我没有 IBM 提供程序,但您可以检查两者是否可互操作。通过(1)使用填充加密和不使用填充解密和(2)不使用填充加密和使用填充解密。
@user1354678 我不确定,但我认为它在 Java 7 中对我有用。您可以尝试添加可能提供此功能的 BouncyCastle 提供程序。以上是关于PKCS5Padding 可以处于 AES/GCM 模式吗?的主要内容,如果未能解决你的问题,请参考以下文章