【问题标题】:Java AES-128 encryption of 1 block (16 byte) returns 2 blocks(32 byte) as output1 个块(16 字节)的 Java AES-128 加密返回 2 个块(32 字节)作为输出
【发布时间】:2013-08-28 18:03:54
【问题描述】:

我使用以下代码进行 AES-128 加密来编码一个 16 字节的块,但编码值的长度给出了 2 个 32 字节的块。我错过了什么吗?

plainEnc = AES.encrypt("thisisapassword!"); 导入java.security.*; 导入 java.security.spec.InvalidKeySpecException; 导入 javax.crypto.*; 导入 sun.misc.*; 公共类 AES { 私有静态最终字符串 ALGO = "AES"; 私有静态最终字节[] keyValue = 新字节[] {'T','h','e','B','e','s','t', '密钥' }; 公共静态字符串加密(字符串数据)抛出异常{ System.out.println("字符串长度:" + (Data.getBytes()).length); //长度 = 16 键键 = generateKey(); 密码芯片 = Cipher.getInstance(ALGO); Chiper.init(Cipher.ENCRYPT_MODE,键); byte[] encVal = chiper.doFinal(Data.getBytes()); System.out.println("输出长度:" + encVal.length); //长度 = 32 String encryptedValue = new BASE64Encoder().encode(encVal); 返回加密值; } 公共静态字符串解密(字符串加密数据)抛出异常 { 键键 = generateKey(); 密码芯片 = Cipher.getInstance(ALGO); Chiper.init(Cipher.DECRYPT_MODE,键); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 字节[] decValue = chiper.doFinal(decordedValue); 字符串解密值 = 新字符串(decValue); 返回解密值; } 私有静态密钥 generateKey() 抛出异常 { Key key = new SecretKeySpec(keyValue, ALGO); 返回键; } }

【问题讨论】:

  • 考虑使用来自Guava 的BaseEncoding、来自Commons Codec 的Base64 或来自Java 8 的Base64,而不是(内部、即将弃用的(Java 8)和-removed(Java 9)) sun.misc.BASE64Encoder/Decoder 类。

标签: java encryption cryptography aes


【解决方案1】:

Cipher.getInstance("AES") 返回使用 PKCS #5 填充的密码。在所有情况下都会添加此填充 - 当明文已经是块大小的倍数时,会添加整个填充块。

Cipher.getInstance() 调用中明确指定您的意图,以避免依赖默认值并可能导致混淆:

Cipher.getInstance("AES/ECB/NoPadding");

您还会看到您正在使用 ECB 模式,这在几乎任何情况下都是一个糟糕的选择。

【讨论】:

  • 但它仍然返回 32 个字符的编码字符串
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2016-02-07
相关资源
最近更新 更多