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

Only蜡笔小新 2017-12-02 03:57:03
直奔主题:
给一个中文字符串,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);
}
}

...全文
1277 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Only蜡笔小新 2017-12-04
  • 打赏
  • 举报
回复
我自己弱智。。工具类里提供了编码方式的方法, 之所以方法之外调用编码转换不好用,是因为在方法内部做了new String使用IDEA默认的编码进行了转换,因此改变IDEA的默认编码方式导致转换的数据不一样。以上

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧