【发布时间】:2016-02-07 00:52:32
【问题描述】:
我在使用 Java 中的 AES 加密/解密时遇到了一个非常奇怪的问题。如果我正在加密/解密小于 16 字节的字符串,则密码可以正常工作,但如果我输入大于 16 字节的密码,我会收到错误“给定最终块未正确填充”。我构建了一些小代码作为示例:
package com.company;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Main {
public static void main(String[] args) {
try {
Cipher aesEncrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
Cipher aesDecrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec("ABCDEQWERTASDFGA".getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
aesDecrypt.init(Cipher.DECRYPT_MODE, key, ivSpec);
aesEncrypt.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] message = "Hello".getBytes();
aesEncrypt.update(message);
byte[] encrypted = aesEncrypt.doFinal();
aesDecrypt.update(encrypted);
byte[] decrypted = aesDecrypt.doFinal();
System.out.println(new String(decrypted, "UTF-8"));
}
catch (Exception e){
e.printStackTrace();
}
}
}
当 byte[] 消息为“Hello”时,加密/解密工作正常,但当我将其更改为“HelloMyBabyHelloMyDarling”时,它会引发异常。有谁知道我在这里做错了什么?
【问题讨论】:
-
请参阅here 了解有关 padding 的一些信息
标签: java encryption cryptography