博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA实现AES 解密报错Input length must be multiple of 16 when decrypting with padded cipher
阅读量:6450 次
发布时间:2019-06-23

本文共 5578 字,大约阅读时间需要 18 分钟。

加密代码

 

/**解密         * @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;        }

  

 

解密代码

/**解密         * @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;        }

  

解密代码

String content = "test";                String password = "12345678";                //加密                System.out.println("加密前:" + content);                byte[] encryptResult = encrypt(content, password);                try {                        String encryptResultStr = new String(encryptResult,"utf-8");                        //解密                        byte[] decryptResult = decrypt(encryptResultStr.getBytes("utf-8"),password);                        System.out.println("解密后:" + new String(decryptResult));                } catch (UnsupportedEncodingException e) {                        e.printStackTrace();                }

  

偶尔会报错 抛出异常,

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

二进制转换成16进制

/**将16进制转换为二进制         * @param hexStr         * @return         */        public static byte[] parseHexStr2Byte(String hexStr) {                if (hexStr.length() < 1)                        return null;                byte[] result = new byte[hexStr.length()/2];                for (int i = 0;i< hexStr.length()/2; i++) {                        int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);                        int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);                        result[i] = (byte) (high * 16 + low);                }                return result;        }

  

16进制转换为二进制

 
/**将16进制转换为二进制         * @param hexStr         * @return         */        public static byte[] parseHexStr2Byte(String hexStr) {                if (hexStr.length() < 1)                        return null;                byte[] result = new byte[hexStr.length()/2];                for (int i = 0;i< hexStr.length()/2; i++) {                        int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);                        int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);                        result[i] = (byte) (high * 16 + low);                }                return result;        }

  

 测试结果,问题解决

 

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
 
 
 
文档参考 

 

转载于:https://www.cnblogs.com/catalina-/p/6001831.html

你可能感兴趣的文章
redis-cli 命令总结
查看>>
CentOS 4.4双网卡绑定,实现负载均衡
查看>>
GitHub页面使用方法
查看>>
Python爬虫综述(笔记)
查看>>
Scala之柯里化和隐式转换
查看>>
wmic命令
查看>>
Merge and BottomUpSort
查看>>
reids 安装记录
查看>>
获取androdmanifest里面的meta-data
查看>>
Centos 6.3编译安装nagios
查看>>
如何实现7*24小时灵活发布?阿里技术团队这么做
查看>>
iSCSI
查看>>
java1234_Activiti_第6讲_一般程序员使用的函数
查看>>
mysql拷贝表的几种方式
查看>>
NetApp FAS2240-4存储删除文件数据恢复
查看>>
用设计模式去掉没必要的状态变量 —— 状态模式
查看>>
linux安装elasticsearch及遇到的各种问题
查看>>
健忘的正则
查看>>
[转]CMake快速入门教程:实战
查看>>
IntelliJ IDEA创建JavaWeb工程及配置Tomcat部署
查看>>