加密代码

 

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

  

 

解密代码

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

  

解密代码

  1. String content = "test";
  2. String password = "12345678";
  3. //加密
  4. System.out.println("加密前:" + content);
  5. byte[] encryptResult = encrypt(content, password);
  6. try {
  7. String encryptResultStr = new String(encryptResult,"utf-8");
  8. //解密
  9. byte[] decryptResult = decrypt(encryptResultStr.getBytes("utf-8"),password);
  10. System.out.println("解密后:" + new String(decryptResult));
  11. } catch (UnsupportedEncodingException e) {
  12. e.printStackTrace();
  13. }

  

偶尔会报错 抛出异常,

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

二进制转换成16进制

  1. /**将16进制转换为二进制
  2. * @param hexStr
  3. * @return
  4. */
  5. public static byte[] parseHexStr2Byte(String hexStr) {
  6. if (hexStr.length() < 1)
  7. return null;
  8. byte[] result = new byte[hexStr.length()/2];
  9. for (int i = 0;i< hexStr.length()/2; i++) {
  10. int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
  11. int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
  12. result[i] = (byte) (high * 16 + low);
  13. }
  14. return result;
  15. }

  

16进制转换为二进制

测试结果,问题解决

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

  

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

JAVA实现AES 解密报错Input length must be multiple of 16 when decrypting with padded cipher的更多相关文章

  1. java对称加密报错:Input length must be multiple of 8 when decrypting with padded cipher

    HTTP Status 500 - Request processing failed; nested exception is javax.crypto.IllegalBlockSizeExcept ...

  2. url请求时,参数中的+在服务器接收时为空格,导致AES加密报出javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

    报错的意思的是使用该种解密方式出入长度应为16bit的倍数,但实际的错误却不是这个,错误原因根本上是因为在http请求是特殊字符编码错误,具体就是base64生成的+号,服务器接收时成了空格,然后导致 ...

  3. javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher--转载

    原文地址:http://songjianyong.iteye.com/blog/1571029 /** * AESHelper.java * cn.com.songjy.test * * Functi ...

  4. 我的Android进阶之旅------>解决AES加密报错:java.security.InvalidKeyException: Unsupported key size: 18 bytes

    1.错误描述 今天使用AES进行加密时候,报错如下所示: 04-21 11:08:18.087 27501-27501/com.xtc.watch E/AESUtil.decryptAES:55: j ...

  5. RSA解密报错java.security.spec.InvalidKeySpecException的解决办法

    java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid p ...

  6. Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

    一.问题说明 今天写AES加/解密功能的apk,设想是四个控件(测试用的,界面丑这种东西请忽略) 一个编缉框----用于输入要加密的字符串 一个文本框----用于输出加密后的字符串,和加密后点击解密按 ...

  7. SRA解密报错:Data must start with zero

    项目背景:要对打印地址进行加密,用公钥加密后会乱码需要base64 decode一下,但是在解密时报错:javax.crypto.BadPaddingException: Data must star ...

  8. 微信第三方平台解密报错:Illegal key size

    今天在交接别人代码的时候遇到的,微信第三方平台解密报的错误,原因: 如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size ...

  9. Java基础学习总结(35)——Java正则表达式详解

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu  ...

随机推荐

  1. Count the number of possible triangles

    From: http://www.geeksforgeeks.org/find-number-of-triangles-possible/ Given an unsorted array of pos ...

  2. RecyclerView解密篇(一)

    一.前言 RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视 ...

  3. dvd开发小程序

    package dvdManager8; import java.util.Scanner; public class DvdSystem8 { static String[][] dvd = new ...

  4. python之线程进程协成

    线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...

  5. 那些年,坑死自己的事之fread/fwrite

    今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...

  6. 【学习篇:他山之石,把玉攻】JavaScript Date() 对象 及 格式化

    Date 对象用于处理日期和时间.  创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值. 参数形式有以下5种:   new ...

  7. WebStorm 2016.2 破解方法

    http://www.jetbrains.com/ 以前的 http://idea.lanyus.com/ 不能激活了 有帖子说的 http://15.idea.lanyus.com/ http:// ...

  8. Maven 命令

    win7环境下,Maven跳过测试编译项目的命令: 首先,在cmd环境下执行cd命令移动到需要编译的项目的home目录,然后执行命令:mvn    install -Dmaven.test.skip= ...

  9. 【Hibernate框架】关联映射(一对一关联映射)

    一.整理思路: 之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图: 这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路. ...

  10. 学习微信小程序之css7

    盒模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...