【问题标题】:Java Cipher - AES Padding ProblemJava Cipher - AES 填充问题
【发布时间】: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。

标签: java encryption aes padding


【解决方案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。我可能会仔细看看真实的东西。不过,我会将其标记为答案。
猜你喜欢
  • 2011-06-17
  • 2016-09-03
  • 2021-01-14
  • 2013-09-25
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多