Java Cipher - AES 填充问题

Posted

技术标签:

【中文标题】Java Cipher - AES 填充问题【英文标题】:Java Cipher - AES Padding Problem 【发布时间】:2010-09-25 08:16:30 【问题描述】:

我正在使用 16 字节块大小的 AES 密码。

如果我尝试加密一个 16 字节的字符串,我没有问题,但任何其他长度不是 16 的倍数都会引发异常。

我知道使用 3-DES,您可以将填充类型指定为算法的一部分,并且无需额外工作(例如 DES/CBC/PKCS5Padding)即可处理,但是有没有办法使用 AES 来指定呢?

或者我是否需要手动将 pytes 填充到 16 的倍数,然后在解密时剥离它们?这是一个简短的代码示例。

encrypt = Cipher.getInstance("AES", provider);
encrypt.init(Cipher.ENCRYPT_MODE, key) ;
byte[] encrypted = encrypt.doFinal(plainTxt.getBytes()) ;

感谢所有回复!

提前致谢, 夏兰

【问题讨论】:

迂腐评论:根据定义,AES 只有 16 字节块大小。 Rijndael(原始名称和规范)的块大小为 16,24 和 32 字节,但在 AES 中仅允许使用 16 字节块。 Rijndael 还支持密钥大小 128、160、192、224、256,但 AES 仅支持 128、192 和 256。 【参考方案1】:

它应该与 AES 完全相同,即填充模式必须与密码一起指定。实现哪些填充模式取决于提供者,并应在其文档中进行描述。

根据 JCE 文档: http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html#AppA 应该始终支持像 PKCS5Padding 这样的标准填充模式(至少,我是这样解释的)。

【讨论】:

男孩,我熟悉那个页面吗 :) 当你说提供者时,你的意思是我正在使用的 JCE 的实现吗?我会检查文档。 是的,提供者(getInstance()方法中的第二个参数)基本实现了Cipher接口。您可以激活多个加密提供程序。 Sun 的 JDK 预装了 SunJCE 提供程序 由于我正在通过 Java/Coldfusion 编写 AES 的“概念证明”,因此我使用此处描述的方法 2 实现了自己的填充:di-mgt.com.au/cryptopad.html。我可能会仔细看看真实的东西。不过,我会将其标记为答案。

以上是关于Java Cipher - AES 填充问题的主要内容,如果未能解决你的问题,请参考以下文章

JAVA AES加密

使用 OpenResty 的 resty.aes 模块解密 Java Cipher.getInstance("AES/CBC/NoPadding") 结果失败

php java aes

ruby 实现java中的aes 加密解密

Java Cipher - PBE 线程安全问题

能在JAVA和C之间通用的AES加密标准是啥?