在对安全性要求比较高的报文做加密的时候,算法有很多种,我这里主要用到的就是AES加密算法。由于在国内使用,所以不可避免的要对中文进行加密和解密,而在这个过程中,发现,如果不做处理,很容易会出现中文乱码。

下面是常见的情况:

一、中文乱码

不对密码进行编码处理

byte[] decryptResult = decrypt(encryptResult, password);

System.out.println("解密后:" + new String(decryptResult));

运行后

加密前:我是shoneworn

解密后:鎴戞槸shoneworn

二、对文字进行编码处理,但是在传输过程中草率的将byte[]转成String, String code = new String(bytes); 由于AES加密算法要求密文是16位的倍数。所以,这么处理,在解密的时候,就会报各种错。比如下面的。

String code = new String(encryptResult);

byte[] decryptResult = decrypt(code.getBytes(), password);

结果就.........

加密前:我是shoneworn

javax.crypto.BadPaddingException: Given final block not properly padded

at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)

at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)

at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)

at javax.crypto.Cipher.doFinal(Cipher.java:2165)

at com.ailin.test.AES.decrypt(AES.java:72)

at com.ailin.test.AES.main(AES.java:173)

Exception in thread "main" java.lang.NullPointerException

at java.lang.String.(Unknown Source)

at com.ailin.test.AES.main(AES.java:174)

三、给功能正常的,能传中文的,不报错的AES加密加密算法源码

package com.ailin.test;

import java.io.UnsupportedEncodingException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

public class AES {

/**

* 加密

*

* @param content

* 需要加密的内容

* @param password

* 加密密码

* @return

*/

public static byte[] encrypt(String 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");// 创建密码器

byte[] byteContent = content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(byteContent);

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException 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;

}

/**

* 将二进制转换成16进制

*

* @param buf

* @return

*/

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/**

* 将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;

}

/**

* 加密

*

* @param content

* 需要加密的内容

* @param password

* 加密密码

* @return

*/

public static byte[] encrypt2(String content, String password) {

try {

SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

byte[] byteContent = content.getBytes("utf-8");

cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化

byte[] result = cipher.doFinal(byteContent);

return result; // 加密

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

}

return null;

}

public static void main(String[] args) throws UnsupportedEncodingException {

String content = "我是shoneworn";

String password = "12345678";

// 加密

System.out.println("加密前:" + content);

byte[] encode = encrypt(content, password);

//传输过程,不转成16进制的字符串,就等着程序崩溃掉吧

String code = parseByte2HexStr(encode);

System.out.println("密文字符串:" + code);

byte[] decode = parseHexStr2Byte(code);

// 解密

byte[] decryptResult = decrypt(decode, password);

System.out.println("解密后:" + new String(decryptResult, "UTF-8")); //不转码会乱码

}

}

java aes 中文_java实现AES加密(解决中文解密后乱码问题,解决传输字符串后解密报错的问题)...相关推荐

  1. linux java maven项目_Java maven项目在window下运行正常,部署到Linux环境中启动报错,是由什么引起的?...

    设定默认时区为:GMT+8 2018-07-19 18:58:12,013 [INFO ] com.eos.manager.web.listener.SpringContextListener.con ...

  2. 解决:mysql5.7 timestamp默认值0000-00-00 00:00:00 报错

    解决:mysql5.7 timestamp默认值0000-00-00 00:00:00 报错 学习了:https://www.cnblogs.com/cnhkzyy/p/9119339.html se ...

  3. MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题

    MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 参考文章: (1)MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 (2)https://ww ...

  4. 解决命令行运行python文件,出现No module named *** 报错问题

    解决命令行运行python文件,出现No module named *** 报错问题 参考文章: (1)解决命令行运行python文件,出现No module named *** 报错问题 (2)ht ...

  5. oracle大于号怎么用,解决MyBatis的mapper中SQL小于号或大于号报错-tag name expected

    通常写SQL我们都会在Navicat里面写好条件测试没问题之后才会把SQL放到mapper里面,有次我在写Oracle的分页的时候因为用到了<=符号,在Navicat测试的时候是没问题的,但是放 ...

  6. java aes 模式_Java实现多种加密模式的AES算法-总有一种你用的着!

    前言 对于AES算法,相信很多程序员小伙伴都听过.用过,其原理本文就不介绍了,而是讲讲在实际项目中的应用.前几天,项目需要跟乙方接口对接,乙方提供加密后的信息串,而我这边负责对加密串进行解密.其中加解 ...

  7. Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下,通过Java 程序代码将Word转为PDF文档时,结果文档内容出现乱码该如何解决.具体可参考如下内容: 1.问题出现的背景 在Windows系统中,使用Spire.Doc ...

  8. 解决Gradle在IDEA中运行Java17的Junit单元测试程序报错:module java.base does not “opens java.lang“ to unnamed module

    gradle在IDEA中使用了JDK17运行springboot3.x等程序的时候使用了反射或ASM等会报错:module java.base does not "opens java.la ...

  9. php显示中文乱码怎么解决,PHP汉字出现乱码如何解决?

    PHP汉字出现乱码如何解决? 1.连接数据库时将字符集设置为"utf8"://mysql mysql_query('SET NAMES utf8'); //mysqli mysql ...

最新文章

  1. 2017《面向对象程序设计》寒假作业一
  2. 关于虚拟空间与物理空间思想的解析
  3. 中国万网域名注册量动态:12月上旬净增8424个
  4. scala的传值参数和传名参数
  5. 什么是 Silverlight?
  6. centos 默认php 版本太低移到高版本的办法
  7. Hive分析函数--row_number 的用法
  8. rust种的南瓜为什么老是消失_科技的力量!3种“奇葩”的发明,你都见过吗?...
  9. PATH变量,cp,mv,cat,more,less,head,tail命令举例
  10. java21天打卡Day12-IO流
  11. 2018 “百度之星”程序设计大赛 - 初赛(A)P1001度度熊拼三角(贪心)
  12. U盘制作DOS启动盘MSDOS 7.10
  13. 经济周期的定义、阶段及特点-宏观经济指标和政策
  14. 那天柠檬果第一次成熟,真像是几经磨难摘来的“仙人果”。
  15. 爬取斗鱼4300W热度的小姐姐是一种什么样的体验?
  16. 「游戏引擎 浅入浅出」项目介绍
  17. I/Q数据频谱分析仪简介
  18. 微信群内接龙的excel公式处理
  19. [网页设计]如何在Photoshop里画虚线?
  20. 架构即未来--AKF 可扩展立方体

热门文章

  1. 基于Multisim的buck降压斩波电路仿真
  2. b2b电子商务研究报告
  3. 创意编程——随机(扩散限制聚集DLA)
  4. 【Linux】进程信号
  5. 鸿蒙二部曲之一,网文封神之作,“鸿蒙二部曲”和“斗罗四部曲”你选择站哪边?...
  6. maven编译jar包时打一个瘦包,依赖包和配置文件到jar包外面
  7. 服装实体店运营需要的所有软件,合集在此!(建议收藏)实体店运营 实体店运营干货 实体店运营全流程所需系统推荐
  8. tplink android管理软件,tplink路由器app下载
  9. 【MySQL基础】什么是MySQL约束?什么是主键约束?
  10. 一道对10年间中国行政区划个数进行对比的Python考试题