中文加解密异常的问题
在使用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));}}
中文加解密异常的问题相关推荐
- Asp.net程序实现RC6_中文加解密
最近笔者对RC6加解密进行了研究,己完善了<朱明海--维普资讯网--对称加解密算法RC6的C#实现>的程序,源码在我的博客上:http://blog.csdn.net/ExcelWord/ ...
- java base64 加解密_java Base64加解密
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class Base64Util { public stati ...
- 国密SM4加解密SM2签名验签COM组件DLL
提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...
- 基于安卓系统的SM4-SM2/3加解密软件开发报告
目 录 第一章需求分析 1.1软件功能需求 1.2平台需求 1.3人员分工 第二章概要设计 2.1 软件开发平台 2.2 软件基本流程 2.3 UML图 第三章 程序详细设计 3.1 程序接口设计 3 ...
- Delphi RSA加解密(一)
感谢.感谢.感谢大佬的分享,https://github.com/ZYHPRO/RSAEncryptAndDecode 目录 1. 前言 2. 准备工作 3. Demo注意事项说明 3.1 公钥.私钥 ...
- Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码
Table of Contents 概述 一.js加密,java解密 1.js加密 1.中文字符串加密 2.英文等字符串加密 3.中文字符串混淆.迭代加密 4.英文等字符串混淆.迭代加密 5.JSON ...
- 数据加解密时Base64异常:Illegal base64 character 3f
现象 用base64工具类对中文进行处理时出现异常,在数据加解密场景中经常使用 java.lang.IllegalArgumentException: Illegal base64 character ...
- AES 加解密以及异常情况处理
加解密过程中,记得数据中的空格处理,这里会有个大坑,解密前要处理字符串前后端的空格,解密后也要处理字符串前后端的空格 package com.xxx...; import javax.crypto.C ...
- DESUtils 加解密时 Given final block not properly padded bug小记
事情的经过是这个样子的...... 先说说问题是怎么出现的.根据客户需求,需要完成一个一键登录的功能,于是我的项目中就诞生了DesUtil,但是经过上百次用户测试,发现有一个用户登录就一直报错!难道又 ...
最新文章
- 使用JDBC改变Oracle的session參数 NLS_DATE_FORMAT
- bgp选路原则【第二部】
- 【Android 插件化】恶意软件判定规则 | 恶意软件的范围定义
- 使用Java中的Try-With-Resource
- ubuntu 16.04 源码安装samba并且配置
- 深度学习《再探AE和VAE的区别》
- 怎么更改wifi频段_wifi信号差?网速慢?这样做不浪费每一兆宽带
- 2011热门论坛排行top100
- pa100k数据集_Spark 处理MovieLens 100k数据集案例
- pr电子相册制作思路及常用快捷键
- python 爬取movie时光网
- jQuery下载安装详细教程,jQuery入门必备
- ODC(Orthogonal Defect Classification)简介
- 揭开Docker的面纱
- Linux WiFi使用
- 数据库(二)—— 关系模型概述
- ubuntu20.04中打开echo daytime服务
- Java中的BigDecimal,你真的会用吗?
- Ubuntu 查看磁盘空间大小命令
- 聚集索引和非聚集索引详解 (zhuang)
热门文章
- 一名富有激情的潮汕籍工程师的进阶之路:数据即未来
- 哪位神犇可以帮忙啊。
- python如何微信公众号刷票_问卷星刷票
- web期末作业设计网页 HTML+CSS+JavaScript仿王者荣耀游戏新闻咨询(网页设计期末课程设计)...
- 华为便携机修改服务器密码,华为随身WiFi如何修改WiFi密码 华为随身WiFi修改WiFi密码方法【介绍】...
- 如何让无源蜂鸣器响起来
- 游戏 匹配算法 实现(基于ELO分数、等待时长)
- 爬取manhua.fzdm.com上的妖尾漫画
- html5多屏互动游戏,2017TFC深度盘点:未来H5游戏的发展趋势 重度化强社交多屏互动...
- 二、谷歌阻止苹果,谁来阻止谷歌