在使用AES加密时要注意指定字符编码,要使用String.getBypes(String charsetName)而不能使用String.getBytes(),后者源码中有一句:

String csn = Charset.defaultCharset().name();

Charset.defaultCharset()返回此Java虚拟机的默认字符集。

默认字符集在虚拟机启动期间确定,通常取决于基础操作系统的区域设置和字符集。

如果在加密和解密过程中环境发生变化,就可能导致中文字符解密后出现乱码

import lombok.SneakyThrows;
import org.springframework.util.Base64Utils;
import org.springframework.util.StringUtils;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.SecureRandom;public class AesUtil {/*** 加密算法名称*/private static final String CIPHER_ALGORITHM = "AES";/*** 密钥*/private static final String KEY = "123456";/***获取密钥Key */public static Key getKey(String strKey) {try {if (strKey == null) {strKey = "";}KeyGenerator generator = KeyGenerator.getInstance(CIPHER_ALGORITHM);SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(strKey.getBytes());generator.init(128, secureRandom);return generator.generateKey();} catch (Exception e) {throw new RuntimeException(" 密钥出现异常 ");}}/*** AES加密* @param data 原文* @return 密文*/@SneakyThrowspublic static String encrypt(String data){if(StringUtils.isEmpty(data)){return data;}SecureRandom secureRandom = new SecureRandom();Key secureKey = getKey(KEY);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secureKey, secureRandom);//这里需要指定编码,否则可能因环境问题出现解密乱码byte[] bytes = data.getBytes("utf-8");byte[] bt = cipher.doFinal(bytes);//加密后以base64编码后存储,这里使用的是Spring的Base64UtilsString string = Base64Utils.encodeToString(bt);return string;}/*** AES解密* @param message 密文* @return 原文*/@SneakyThrowspublic static String decrypt(String message){if(StringUtils.isEmpty(message)){return message;}SecureRandom secureRandom = new SecureRandom();Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);Key secureKey = getKey(KEY);cipher.init(Cipher.DECRYPT_MODE, secureKey, secureRandom);//先base64解码,这里使用的是Spring的Base64Utilsbyte[] bytes = Base64Utils.decodeFromString(message);byte[] res = cipher.doFinal(bytes);//这里需要指定编码,否则可能因环境问题出现解密乱码String data = new String(res,"utf-8");return data;}/***测试*/public static void main(String[] args) {String message = "北京是中华人民共和国首都";System.out.println("原文信息:"+message);System.out.println("原文长度:"+message.length());//加密String encryptMsg = encrypt(message);System.out.println("加密信息:"+encryptMsg);System.out.println("密文长度:"+encryptMsg.length());//解密String decryptedMsg = decrypt(encryptMsg);System.out.println("解密信息:"+decryptedMsg);//验证解密信息和原文是否相等System.out.println(message.equals(decryptedMsg));}}

中文加解密异常的问题相关推荐

  1. Asp.net程序实现RC6_中文加解密

    最近笔者对RC6加解密进行了研究,己完善了<朱明海--维普资讯网--对称加解密算法RC6的C#实现>的程序,源码在我的博客上:http://blog.csdn.net/ExcelWord/ ...

  2. java base64 加解密_java Base64加解密

    import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Base64Util { public stati ...

  3. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  4. 基于安卓系统的SM4-SM2/3加解密软件开发报告

    目 录 第一章需求分析 1.1软件功能需求 1.2平台需求 1.3人员分工 第二章概要设计 2.1 软件开发平台 2.2 软件基本流程 2.3 UML图 第三章 程序详细设计 3.1 程序接口设计 3 ...

  5. Delphi RSA加解密(一)

    感谢.感谢.感谢大佬的分享,https://github.com/ZYHPRO/RSAEncryptAndDecode 目录 1. 前言 2. 准备工作 3. Demo注意事项说明 3.1 公钥.私钥 ...

  6. Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码

    Table of Contents 概述 一.js加密,java解密 1.js加密 1.中文字符串加密 2.英文等字符串加密 3.中文字符串混淆.迭代加密 4.英文等字符串混淆.迭代加密 5.JSON ...

  7. 数据加解密时Base64异常:Illegal base64 character 3f

    现象 用base64工具类对中文进行处理时出现异常,在数据加解密场景中经常使用 java.lang.IllegalArgumentException: Illegal base64 character ...

  8. AES 加解密以及异常情况处理

    加解密过程中,记得数据中的空格处理,这里会有个大坑,解密前要处理字符串前后端的空格,解密后也要处理字符串前后端的空格 package com.xxx...; import javax.crypto.C ...

  9. DESUtils 加解密时 Given final block not properly padded bug小记

    事情的经过是这个样子的...... 先说说问题是怎么出现的.根据客户需求,需要完成一个一键登录的功能,于是我的项目中就诞生了DesUtil,但是经过上百次用户测试,发现有一个用户登录就一直报错!难道又 ...

最新文章

  1. 使用JDBC改变Oracle的session參数 NLS_DATE_FORMAT
  2. bgp选路原则【第二部】
  3. 【Android 插件化】恶意软件判定规则 | 恶意软件的范围定义
  4. 使用Java中的Try-With-Resource
  5. ubuntu 16.04 源码安装samba并且配置
  6. 深度学习《再探AE和VAE的区别》
  7. 怎么更改wifi频段_wifi信号差?网速慢?这样做不浪费每一兆宽带
  8. 2011热门论坛排行top100
  9. pa100k数据集_Spark 处理MovieLens 100k数据集案例
  10. pr电子相册制作思路及常用快捷键
  11. python 爬取movie时光网
  12. jQuery下载安装详细教程,jQuery入门必备
  13. ODC(Orthogonal Defect Classification)简介
  14. 揭开Docker的面纱
  15. Linux WiFi使用
  16. 数据库(二)—— 关系模型概述
  17. ubuntu20.04中打开echo daytime服务
  18. Java中的BigDecimal,你真的会用吗?
  19. Ubuntu 查看磁盘空间大小命令
  20. 聚集索引和非聚集索引详解 (zhuang)

热门文章

  1. 一名富有激情的潮汕籍工程师的进阶之路:数据即未来
  2. 哪位神犇可以帮忙啊。
  3. python如何微信公众号刷票_问卷星刷票
  4. web期末作业设计网页 HTML+CSS+JavaScript仿王者荣耀游戏新闻咨询(网页设计期末课程设计)...
  5. 华为便携机修改服务器密码,华为随身WiFi如何修改WiFi密码 华为随身WiFi修改WiFi密码方法【介绍】...
  6. 如何让无源蜂鸣器响起来
  7. 游戏 匹配算法 实现(基于ELO分数、等待时长)
  8. 爬取manhua.fzdm.com上的妖尾漫画
  9. html5多屏互动游戏,2017TFC深度盘点:未来H5游戏的发展趋势 重度化强社交多屏互动...
  10. 二、谷歌阻止苹果,谁来阻止谷歌