中文使用Base64在GBK和UTF-8编码加解密如何转换

Only蜡笔小新 Only蜡笔小新 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
直奔主题:
给一个中文字符串,IDEA下使用BASE64进行加解密,设置不同的编码就回产生不同的加密字符串。现在的问题是我在GBK编码下加密了一个字符串,但是我想在UTF-8的编码下进行解密。一直不成功。

private static String key = "12dc293d43db3b237849";
public static void main(String[] args) throws Exception{
System.out.print(DescUtil.encrypt("这是一个UTF-8字符串",key));
String gbk = "z/Hn6qtI0fxqyMxSIwOVvPgbB69lpb2z";
String utf8 = "eb7YlzNPTBQkun3nrYULDdtcfLQRHHbRYeH5r1ZY+pM=";
gbk = new String(gbk.getBytes("UTF-8"),"GBK");
System.out.println(DescUtil.decrypt(gbk,key));
}


其中gbk和utf8是DescUtil.encrypt("这是一个UTF-8字符串",key) 加密后的字符串,
我现在想把gbk的加密字符串在UTF-8编码下解密出来,utf8字符串一可以成功解密出来。
尝试了进行转码,但是没有作用,我觉得UTF-8和GBK的转码主要是针对的中文,但是我这边进行转码的时候都是加密字符串,并没有中文,应该是不起作用的,但是没有头绪要怎么做啊,对解密出来的中文乱码进行转码也不好用,求大神赐教啊

注:更改编码方式我是直接设置的IDEA的settings里修改的
File -> Settings->File Encodings -> Defaule encoding for properties files 属性设置成utf-8
在这里修改UTF-8和GBK

这里是DESCUtil工具类
package com.bkyj.middleware.webservice.anbanglife.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**

*/

/**
* 对外接口数据加密/解密类
* @author guojunguang
* @date 2017/11/24
* @decription
*/
public class DescUtil {

private final static String DES = "DES";

// public static void main(String[] args) throws Exception {
// String tDoc = "";// 请求报文
// String encoding = "GBK";
// // 将函数参数赋给本地参数
// String path = "D:\\11140399001500000835.xml";
// // String path = "F:\\testxml\\requestAppPolInp881.xml";
// String path1 = path;
// // 初始化文件对象f
// File f = new File(path1);
// // 初始化读数据流对象reader
// InputStreamReader reader = new InputStreamReader(new FileInputStream(path1), encoding);
// // 根据f文件长度初始化字符串数据c[]
// char c[] = new char[(int) (f.length())];
// // 取到字符串长度,并将文件f内容写入数组c
// int length = reader.read(c);
// // 逐字节将字符串数组c[],赋给变量tDoc
// for (int i = 0; i < length; i++) {
// tDoc = tDoc + c[i];
// }
// // System.out.println(tDoc);
//
// String key = "12dc293d43db3b237849";
// System.out.println(encrypt(tDoc, key));
// System.out.println(decrypt(encrypt(tDoc, key), key));
//
// }

/**
* Description 根据键值进行加密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(), key.getBytes());
String strs = new BASE64Encoder().encode(bt);
return strs;
}

/**
* 指定字符编码方式并加密
* @param data
* @param key
* @param encoding
* @return
* @throws Exception
*/
public static String encrypt(String data, String key, String encoding) throws Exception {
byte[] bt = encrypt(data.getBytes(encoding), key.getBytes());
String strs = new BASE64Encoder().encode(bt);
return strs;
}

/**
* Description 根据键值进行解密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data, String key) throws IOException,
Exception {
if (data == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf, key.getBytes());
return new String(bt);
}

/**
* 根据键值解密并返回指定编码方式字符串
* @param data
* @param key
* @param encoding
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data, String key, String encoding) throws IOException,
Exception {
if (data == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf, key.getBytes());
return new String(bt, encoding);
}

/**
* Description 根据键值进行加密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();

// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);

// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);

// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(DES);

// 用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

return cipher.doFinal(data);
}

/**
* Description 根据键值进行解密
*
* @param data
* @param key
* 加密键byte数组
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 生成一个可信任的随机数源
SecureRandom sr = new SecureRandom();

// 从原始密钥数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);

// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);

// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(DES);

// 用密钥初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

return cipher.doFinal(data);
}
}

...全文

相关推荐

实用代码脚本易语言源码加解密文本

同时兼容主流文本格式,可处理纯ASCII、中文GB2312/GBK、UTF-8多字节字符,自动识别并转换编码避免乱码。

zz_ll9023

前后端Base64加解密不一致?手把手解决中文乱码与迭代加密问题

本文深入探讨了前后端Base64加解密不一致的问题,特别是中文乱码与迭代加密的解决方案。通过分析Base64编码的本质、常见误区及中文字符处理技巧,提供了全栈调试方法和企业级优化方案,帮助开发者彻底解决这一技术难题。

weixin_33704234

万能字符转换器实战指南:编码转换、乱码修复与批量处理

在计算机系统中,字符需要经过编码才能在存储、传输和显示之间高效转换。Unicode作为通用字符集,配合UTF-8等编码方案,解决了跨语言文本的表示问题,而Base64与URL编码则常用于网络传输和接口数据交换。面对日志分析、接口调试、数据清洗等场景中常见的乱码、转义、哈希校验等问题,仅靠零散脚本或在线工具往往效率低下且存在隐私风险。一款功能全面的字符转换器,能将编码识别、Unicode互转、Base64解码、URL编码、进制转换、哈希计算等高频操作集中到本地界面,实现实时联动与批量处理。本文围绕这类工具的设

weixin_34050519

易语言源码自创加解密数据

源码中所有字符串操作均考虑中文字符边界问题,避免因GBK与UTF-8编码差异导致乱码或截断。数值计算全程采用无符号整数运算防止溢出异常,关键路径加入异常捕获语句保障程序健壮性。

emma20080101

java中String与十六进制String及byte之间的转换

将String转换为byte数组必须明确指定字符集,例如UTF-8、ISO-8859-1或GBK,否则依赖平台默认编码将导致跨环境行为不一致甚至数据损坏。

xinshenghuo22
评论 1
收藏 已收藏
分享
返回顶部
Only蜡笔小新
Java EE 67,535 成员 225,843 内容