JAVA实现AES 解密报错Input length must be multiple of 16 when decrypting with padded cipher

Wesley13
• 阅读 512

加密代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/\*\*解密
 \* @param content  待解密内容
 \* @param password 解密密钥
 \* @return
 \*/
public static byte\[\] decrypt(byte\[\] content, String password) {
        try {
                 KeyGenerator kgen = KeyGenerator.getInstance("AES");
                 kgen.init(128, new SecureRandom(password.getBytes()));
                 SecretKey secretKey = kgen.generateKey();
                 byte\[\] enCodeFormat = secretKey.getEncoded();
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");           
                 Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                cipher.init(Cipher.DECRYPT\_MODE, key);// 初始化
                byte\[\] result = cipher.doFinal(content);
                return result; // 加密
        } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
        } catch (NoSuchPaddingException e) {
                e.printStackTrace();
        } catch (InvalidKeyException e) {
                e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
        } catch (BadPaddingException e) {
                e.printStackTrace();
        }
        return null;
}

  

 

解密代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/\*\*解密
 \* @param content  待解密内容
 \* @param password 解密密钥
 \* @return
 \*/
public static byte\[\] decrypt(byte\[\] content, String password) {
        try {
                 KeyGenerator kgen = KeyGenerator.getInstance("AES");
                 kgen.init(128, new SecureRandom(password.getBytes()));
                 SecretKey secretKey = kgen.generateKey();
                 byte\[\] enCodeFormat = secretKey.getEncoded();
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");           
                 Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                cipher.init(Cipher.DECRYPT\_MODE, key);// 初始化
                byte\[\] result = cipher.doFinal(content);
                return result; // 加密
        } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
        } catch (NoSuchPaddingException e) {
                e.printStackTrace();
        } catch (InvalidKeyException e) {
                e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
        } catch (BadPaddingException e) {
                e.printStackTrace();
        }
        return null;
}

  

解密代码

  

偶尔会报错 抛出异常,

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
 
原因  加密后的byte数组是不能强制转换成字符串的,换言之:字符串和byte数组在这种情况下不是互逆的;要避免这种情况,我们需要做一些修订,可以考虑将二进制数据转换成十六进制表示
解决方案 
 

二进制转换成16进制

  

16进制转换为二进制

 

  

 测试结果,问题解决

 

1
2
3
4
5
6
7
8
9
10
11
String content = "test";
String password = "12345678";
//加密
System.out.println("加密前:" + content);
byte\[\] encryptResult = encrypt(content, password);
String encryptResultStr = parseByte2HexStr(encryptResult);
System.out.println("加密后:" + encryptResultStr);
//解密
byte\[\] decryptFrom = parseHexStr2Byte(encryptResultStr);
byte\[\] decryptResult = decrypt(decryptFrom,password);
System.out.println("解密后:" + new String(decryptResult));

  

测试结果如下:
加密前:test
加密后:73C58BAFE578C59366D8C995CD0B9D6D
解密后:test
 
 
 

 

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java连接neo4j
<divid"cnblogs\_post\_body"class"blogpostbody"<p呼、博客要落灰了</p<p记录一下Java连接neo4j的问题。</p<p<spanstyle"fontsize:16px;"<strong首先是neo4j的下载和配置,基本参考https://blog.csdn.net/ap
Wesley13 Wesley13
2年前
java 反射得到属性与属性值
<divid"cnblogs\_post\_body"class"blogpostbody"<p反射可以破坏所有的封装性,比如这次通过反射得到的属性与属性值;</p<divclass"cnblogs\_code"<divclass"cnblogs\_code\_toolbar"<spanclass"cnblogs\_co
Wesley13 Wesley13
2年前
Java通过BCrypt加密
<divid"cnblogs\_post\_body"class"blogpostbody"<div一、概述</div<p&nbsp;</p<p在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否
Easter79 Easter79
2年前
Springboot+shiro配置笔记+错误小结(转)
<divclass"postBody"<divid"cnblogs\_post\_body"class"blogpostbody"<p  <spanstyle"color:ff0000"软件152尹以操</span</p<p  springboot不像springmvc,它没有xml配置文件,那该如何配置shiro呢
Stella981 Stella981
2年前
JSONArray数据转换成java List
<divid"cnblogs\_post\_body"class"blogpostbody"<p<spanstyle"fontsize:18pt"1.后台接收json数组转成封装实体类的List:</span</p<divclass"cnblogs\_code"<divclass"cnblogs\_code\_tool
Stella981 Stella981
2年前
IdeaVim
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h3id"ideavim简介"IdeaVim简介</h3<pIdeaVim是IntelliJIDEA的一款插件,他提高了我们写代码的速度,对代码的跳转,查找也很友好。</p<ul<li安装位置</
Wesley13 Wesley13
2年前
Java分布式锁之数据库实现
<divid"cnblogs\_post\_body"class"blogpostbody"<p之前的文章<ahref"http://www.cnblogs.com/garryfu/p/7978611.html"target"\_blank"《Java分布式锁实现》</a中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存
Stella981 Stella981
2年前
Neo4j百万级数据导入只需30s
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<divclass"showcontentfree"<p先上图:425万nodes、180万relationships只用了30s243ms</p<divclass"imagepackage"
Easter79 Easter79
2年前
Tomcat安装、配置、优化及负载均衡详解
<divid"cnblogs\_post\_body"class"blogpostbody"<p<strong原文地址:https://www.cnblogs.com/rocomp/p/4802396.html</strong</p<p<strong一、常见JavaWeb服务器</strong</p<div<strong&
Wesley13 Wesley13
2年前
IDEA多线程下多个线程切换断点运行调试的技巧
<divid"cnblogs\_post\_body"class"blogpostbody"<p多线程调试设置可以参考:http://www.cnblogs.com/leodaxin/p/7710630.html</p<p&nbsp;</p<p1断点设置如图:</p<p<imgsrc"https://images2017