import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.HashMap;
import java.util.Map;
public class DES3Util {
/**
* 秘钥 长度24
* GTQdmtWyvBjKPVmZdCpamlAX
*/
private byte[] key;
/**
* 偏移量 长度为8
* abc12345
*/
private byte[] keyiv;
/**
* 无参构造函数
* 不需要传key,直接使用默认key
*/
public DES3Util() {
key = "GTQdmtWyvBjKPVmZdCpamlAX".getBytes(StandardCharsets.UTF_8);
keyiv = "abc12345".getBytes(StandardCharsets.UTF_8);
}
/**
* 带参构造函数
* 需要传key
*
* @param keyStr 密钥
*/
public DES3Util(String keyStr) {
key = keyStr.getBytes(StandardCharsets.UTF_8);
keyiv = "abc12345".getBytes(StandardCharsets.UTF_8);
}
/**
* DES3 加密
*
* @param str 明文字符串
* @return 密文字符串
*/
public String des3Encode(String str) {
String des3String = null;
try {
//CBC 加密
byte[] des3EncodeArr = des3EncodeCBC(str.getBytes());
byte[] base64Arr = Base64.encodeBase64(des3EncodeArr);
des3String = new String(base64Arr, StandardCharsets.UTF_8);
} catch (Exception e) {
e.printStackTrace();
}
return des3String;
}
/**
* DES3 解密
*
* @param str 密文字符串
* @return 明文字符串
*/
public String des3Decode(String str) {
String des3String = null;
byte[] base64Arr = Base64.decodeBase64(str);
try {
//CBC 解密
byte[] des3DecodeArr = des3DecodeCBC(base64Arr);
des3String = new String(des3DecodeArr, StandardCharsets.UTF_8);
} catch (Exception e) {
e.printStackTrace();
}
return des3String;
}
/**
* CBC 加密
*
* @param data 明文
* @return 返回字节数组
* @throws Exception 抛出异常信息
*/
public byte[] des3EncodeCBC(byte[] data) throws Exception {
Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(key);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("DESede" + "/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(keyiv);
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
return cipher.doFinal(data);
}
/**
* CBC 解密
*
* @param data 密文
* @return 返回字节数组
* @throws Exception 抛出异常信息
*/
public byte[] des3DecodeCBC(byte[] data) throws Exception {
Key deskey;
DESedeKeySpec spec = new DESedeKeySpec(key);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("DESede" + "/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(keyiv);
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
return cipher.doFinal(data);
}
/**
* 获取用户名和密码
*
* @param key 根据解密字符串
* @return 字符串数组
*/
private String[] getUserAndPsdfromToken(String key) {
String[] initenstr = new String[2];
String[] str1 = key.split(",");
if (str1.length < 1) {
return null;
}
String[] str2 = str1[0].split(":");
String[] str3 = str1[1].split(":");
if (str2.length > 1 && str3.length > 1) {
initenstr[0] = str2[1];
initenstr[1] = str3[1];
}
return initenstr;
}
/**
* 返回用户名和密码
*
* @param key 解密
* @return Map
*/
public Map<String, String> getAcountByToken(String key) {
Map<String, String> keymap = new HashMap<String, String>();
String[] initenstr = getUserAndPsdfromToken(key);
assert initenstr != null;
String username = initenstr[0];
String password = initenstr[1];
keymap.put("name", username);
keymap.put("pwd", password);
return keymap;
}
public static void main(String[] args) {
// 默认keyStr
DES3Util des3Util = new DES3Util();
// //自定义keyStr
// String keyStr = "GTQdmtWyvBjKPVmZdCpamlAX";
// DES3Util des3Util = new DES3Util(keyStr);
String encodeStr = "username:zhangsan,password:123@abc,logintime:2023-10-25 21:25:00";
//des3Util1.des3Encode(encodeStr);
System.out.printf("原字符串:%s%n", encodeStr);
System.out.printf("加密结果:%s%n", des3Util.des3Encode(encodeStr));
System.out.println("************************************************************************************************");
String decodeStr = "2VAN3hN2jJCTcxp97OzAJSX8b5rAaNPvk1+VM29ztQ6B57A5PbOxSpWzMBG1SRz5n8+Xt7dcIJmcGrJTNbyg2zHWmHwJZnhZ";
//des3Util1.des3Decode(decodeStr);
System.out.printf("原字符串:%s%n", decodeStr);
System.out.printf("解密结果:%s%n", des3Util.des3Decode(decodeStr));
System.out.println("************************************************************************************************");
System.out.printf("账号密码:%s%n", des3Util.getAcountByToken(des3Util.des3Decode(decodeStr)));
Map<String, String> mapToken = des3Util.getAcountByToken(des3Util.des3Decode(decodeStr));
System.out.printf("解密信息:%s%n", mapToken);
JSONObject jsonObject = new JSONObject(mapToken);
if (jsonObject.containsKey("name") && null != jsonObject.getString("name")) {
System.out.printf("用户名:%s%n", jsonObject.getString("name"));
}
if (jsonObject.containsKey("pwd") && null != jsonObject.getString("pwd")) {
System.out.printf("密码:%s%n", jsonObject.getString("pwd"));
}
// 原字符串:username:zhangsan,password:123@abc,logintime:2023-10-25 21:25:00
// 加密结果:2VAN3hN2jJCTcxp97OzAJSX8b5rAaNPvk1+VM29ztQ6B57A5PbOxSpWzMBG1SRz5n8+Xt7dcIJmcGrJTNbyg2zHWmHwJZnhZ
// ************************************************************************************************
// 原字符串:2VAN3hN2jJCTcxp97OzAJSX8b5rAaNPvk1+VM29ztQ6B57A5PbOxSpWzMBG1SRz5n8+Xt7dcIJmcGrJTNbyg2zHWmHwJZnhZ
// 解密结果:username:zhangsan,password:123@abc,logintime:2023-10-25 21:25:00
// ************************************************************************************************
// 账号密码:{name=zhangsan, pwd=123@abc}
// 解密信息:{name=zhangsan, pwd=123@abc}
// 用户名:zhangsan
// 密码:123@abc
}
}
Java封装DES3Util类实现CBC加密/解密
于 2023-10-25 23:36:30 首次发布