AES解密hutool工具包 报错IllegalBlockSizeException: last block incomplete in decryption
时间: 2023-12-15 11:30:10 浏览: 724
根据提供的引用内容,该问题可能是因为直接将一个string的byte []字符串直接加密成密文,在传输过程中,由于默认的编码方式的问题可能会造成数据的丢失。解决方法是将加密后的密文再进行整体的base64加密,解码时先对其进行base64解密再进行AES解密,这样就能保证接受数据的正确性并且不会缺失。另外,使用hutool工具包进行AES解密时,需要注意密钥和偏移量的长度必须为16位。以下是代码示例:
```java
// 密钥和偏移量
String key = "1234567890123456";
String iv = "1234567890123456";
// 待解密的密文
String encryptStr = "加密后的密文";
// 先进行base64解密
byte[] encryptBytes = Base64.decode(encryptStr);
// 进行AES解密
byte[] decryptBytes = SecureUtil.aes(key.getBytes(), iv.getBytes()).decrypt(encryptBytes);
// 将解密后的字节数组转换为字符串
String decryptStr = new String(decryptBytes);
```
相关问题
IllegalBlockSizeException: last block incomplete in decryption
IllegalBlockSizeException是Java加密解密中常见的异常之一,通常是由于加密时数据块大小不符合要求导致的。而last block incomplete in decryption则表示在解密时最后一个数据块不完整,无法正确解密。这个异常通常会在使用对称加密算法时出现,例如AES、DES等。解决这个问题的方法是在加密时使用正确的数据块大小,或者在解密时捕获异常并进行相应的处理。
一种解决方法是在加密时使用正确的数据块大小,例如使用PKCS5Padding填充方式,这种方式会自动填充数据块到正确的大小。另一种方法是在解密时捕获异常并进行相应的处理,例如忽略最后一个不完整的数据块或者手动填充数据块到正确的大小。
代码示例:
```java
// 加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
// 解密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
try {
byte[] decrypted = cipher.doFinal(encrypted);
} catch (IllegalBlockSizeException e) {
// 处理异常
}
```
javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
这个异常通常是在使用对称加密算法进行解密时出现的。它的原因是密文的长度不是块长度的整数倍,导致无法正确解密最后一个块。
要解决这个问题,有两种常见的方法:
1. 填充法
可以在加密时采用填充法,将明文填充到块长度的整数倍。常见的填充方法有 PKCS5Padding 和 PKCS7Padding,可以使用 javax.crypto.Cipher 类中的相应方法进行加解密。
2. 分段解密
可以将密文分成块,每次解密一个块。如果发现最后一个块的长度不足块长度,可以将其舍去。这种方法需要在加密时记录分块信息,通常使用自定义的协议进行传输。
需要注意的是,在使用分段解密方法时,为了防止数据被篡改,需要对每个块使用 CBC(Cipher Block Chaining)模式进行解密,且需要使用 IV(Initialization Vector)进行初始化。
阅读全文