AES/GCM模式下能使用PKCS5Padding吗?

15
AES/GCM的填充模式是什么?我知道它可以是NoPadding,在ECB模式下可以是PKCS5Padding,但在GCM模式下呢?在JCE接口中,我们需要提供“algorithm/mode/padding”(参考文献)。因此,我使用了以下代码来获取实例,在JDK中它可以工作,但在IBM SDK中失败了,提示“无法找到支持AES/GCM/PKCS5Padding的提供程序”。
 Cipher.getInstance("AES/GCM/PKCS5Padding");

padding 的真实使用案例是什么?


1
填充描述了如何对齐链中的块并填充以匹配预期的块大小。JRE可以在不同的安全提供程序下运行。Oracle SDK包括自己的非常低安全性USA友好的Oracle安全提供程序。我不知道IBM SDK中默认使用哪个安全提供程序。最佳实践是在使用不同的JRE提供程序(如BouncyCastle)时包含自己的安全提供程序。或者在开发系统中使用目标系统的安全提供程序,例如您为Android开发时,默认使用OpenSSL安全提供程序。希望这有所帮助。 - Rene M.
1
这是我所知道的最佳安全提供者:https://www.bouncycastle.org/java.html - Rene M.
谢谢回复,我不需要引入第三方库。所以我需要使用JDK内置的提供程序,例如SUNJCE,但在IBM SDK中,我猜它提供了自己的提供程序。但是,我的问题是,“AES/GCM/PKCS5Padding”是否是合法值?我没有找到任何在GCM中使用PKCS5Padding的示例,即使http://isaacyang1988.googlecode.com/svn/trunk/Crypt/src/org/bouncycastle/jce/provider/test/AESTest.java这篇文章有像那样的测试用例,也不是正确的模式。 - C.c
查看Artjom的答案。否则编写一个程序来检查您的jre的默认安全提供程序,并打印出所需算法的可能值。选择两边都存在的值,那么您就没问题了。 - Rene M.
1个回答

23

GCM是一种流模式,这意味着密文的长度仅与明文相同(不包括认证标签)。GCM不需要填充。这意味着PKCS5Padding版本实际上只是编程方便起见的NoPadding的同义词。

一些提供商没有这种奇怪的模式。Java具有可插拔的加密提供者,基本上所有JRE发行版都有一个默认的加密提供者,其密码字符串和默认值可能与其他提供者不同。

有些情况下,填充明文是有意义的。例如,您可以通过附加随机长度PKCS5Padding来隐藏实际明文的长度。


谢谢你,这意味着我们需要将其更正为Cipher.getInstance("AES/GCM/NoPadding");,是吗? - C.c
1
是的,Cipher.getInstance("AES/GCM/NoPadding"); 是正确的方式。这可能与 Cipher.getInstance("RSA/ECB/PKCS1Padding"); 相同,实际上只是 Cipher.getInstance("RSA/None/PKCS1Padding"); - Artjom B.
明白了。非常感谢。 - C.c
嘿@ArtjomB.,你在我的密码学问题上帮了我很多。我正在使用PBKDF2WithHmacSHA256算法进行密码哈希。它在实时服务器中运行良好。但是似乎只能在Java 8中工作,而不是Java 7。有没有办法让我在Java 7中使用这个算法? - The Coder
1
@user1354678 我不确定,但我认为在Java 7中它对我有效。您可以尝试添加BouncyCastle提供程序,该提供程序可能会提供此功能。 - Artjom B.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接