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 模式吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 与 PHP 的 AES GCM 加密

AES_GCM_256加密

AES_GCM_256加密

JOSEException:无法创建 AES/GCM/NoPadding 密码:非法密钥大小

在 JAVA 中使用 AES/GCM 检测不正确的密钥

AES GCM 解密绕过 JAVA 中的身份验证