嗨森逛服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hai-server/hai-service/src/main/java/com/hai/common/security/DesUtil.java

278 lines
9.4 KiB

package com.hai.common.security;
import java.nio.charset.Charset;
import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Base64;
//import org.apache.commons.lang3.RandomStringUtils;
import com.thoughtworks.xstream.core.util.Base64Encoder;
public class DesUtil {
public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
/**
* DES算法,加密
*
* @param data
* 待加密字符串
* @param key
* 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException
* 异常
*/
public static byte[] encode(String key, String data) throws Exception {
return encode(key, data.getBytes());
}
/**
* DES算法,加密
*
* @param data
* 待加密字符串
* @param key
* 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException
* 异常
*/
public static byte[] encode(String key, byte[] data) throws Exception {
try {
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
byte[] bytes = cipher.doFinal(data);
return bytes;
// return byte2HexStr(bytes);
// return byte2hex(new String(bytes));
// return new String(new BASE64Encoder().encode(bytes));
// return new String(bytes);
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* DES算法,解密
*
* @param data
* 待解密字符串
* @param key
* 解密私钥,长度不能够小于8位
* @return 解密后的字节数组
* @throws Exception
* 异常
*/
public static byte[] decode(String key, byte[] data) throws Exception {
try {
// SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec(key.getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
return cipher.doFinal(data);
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 获取编码后的值
*
* @param key
* @param data
* @return
* @throws Exception
*/
public static String decode(String key, String data) {
byte[] datas;
String value = null;
try {
datas = decode(key, new Base64Encoder().decode(data));
value = new String(datas);
} catch (Exception e) {
value = "";
}
return value;
}
public static String byte2HexStr(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
// if (n<b.length-1) hs=hs+":";
}
return hs;
}
public static String triDesEncrypt(String input, String desKey, String desIv) {
Cipher cipher = null;
try {
SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(desKey.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory
.getInstance("DESede");
Key key = keyFactory.generateSecret(dks);
IvParameterSpec iv = new IvParameterSpec(desIv.getBytes("UTF-8"));
cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(1, key, iv, sr);
byte[] array = cipher.doFinal(input.getBytes("UTF-8"));
return Base64.encodeBase64String(array);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String triDesDecrypt(String input, String desKey, String desIv) {
Cipher cipher = null;
try {
SecureRandom sr = new SecureRandom();
DESedeKeySpec dks = new DESedeKeySpec(desKey.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory
.getInstance("DESede");
SecretKey key = keyFactory.generateSecret(dks);
IvParameterSpec iv = new IvParameterSpec(desIv.getBytes("UTF-8"));
cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(2, key, iv, sr);
byte[] decoded = Base64.decodeBase64(input);
byte[] array = cipher.doFinal(decoded);
return new String(array, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static byte[] encode(String key, String data, Charset charset)
throws Exception {
return encode(key, data.getBytes(charset));
}
public static String decode(String key, String data, Charset charset) {
byte[] datas;
String value = null;
try {
datas = decode(key, new Base64Encoder().decode(data));
value = new String(datas, charset);
} catch (Exception e) {
value = "";
}
return value;
}
/**
* des加密,返回string类型,指定编码集
*
* @time 2018-11-6 16:08:27
* @author Lxm
* @param data
* @param charset
* @param key
* @return
* @throws Exception
*/
public static String encode(String data, Charset charset, String key)
throws Exception {
byte[] bt = encode(key, data.getBytes(charset));
// return new String(bt, charset);
String rs = new Base64Encoder().encode(bt);
return rs;
}
/* public static String quickDecode(String key, String data) throws Exception {
return quickDecode(key, data, "UTF-8");
}
public static String quickDecode(String key, String data, String charSet)
throws Exception {
return new String(DesUtil.decode(key, HexUtil.hexStr2Bytes(data)),
charSet);
}*/
public static void main(String[] args) throws Exception {
// String ke = RandomStringUtils
// .random(8,
// "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!@#$%^&*");
// System.out.println(ke);
// String key = "abcdefgh";
// String data =
// "<?xml version=\"1.0\"?><RequestData><cardNo>8800030132003900701</cardNo><jourId>1231204573498573945</jourId><mercCode>000001</mercCode><terminalId>8800030165000100040</terminalId><terminalTime>2016-07-28 13:20:50</terminalTime><tranAmt>150</tranAmt></RequestData>";
// String s = HexUtil.byte2HexStr(DesUtil.encode(key, data));
// System.err.println(s);
// System.err.println(DesUtil.encode(key, data.getBytes()).length);
// String s2 = new String(DesUtil.decode(key, HexUtil.hexStr2Bytes(s)));
// System.err.println(s2);
// String s = encode("123", Charset.forName("GBK"), "d0fb65e5");
// System.out.println(s);
//
// String e = decode("d0fb65e5", "258946d6143e30f9",
// Charset.forName("UTF-8"));
// System.out.println(e);
/*String s = encode("中国", Charset.forName("UTF-8"),"12345678");
System.out.println(s);*/
//String data = "T3xbPEKEXV9+CbBw8D1B+N2jk8xwa55s0Bde48c49YDwYfnUdBVz6Kj4HS2oCA1TTiqJkCUIYa5ckMhJeByBCAMsqu21LmFjb/hdW0y1Tt0Wk5PqmO8FAg==";
String data = "T3xbPEKEXV9+CbBw8D1B+N2jk8xwa55s0Bde48c49YBr4/b4yBwN2FIVZZn+Xg9KQTDoTCLu3YtByaWh7zPmdcpBr9FGARduhPrwSnYTFJ0VVVSK/UzPWdHN2YYd4yHGQRJ2HEr/1egt2JUHpWr0JA==";
/* {
"success": true,
"message": "ok",
"cards": [{
"cardNo": "8800030115015107746"
}, {
"cardNo": "8800030115015119428"
}, {
"cardNo": "8800030128003170055"
}, {
"cardNo": "8800030132003656709"
}, {
"cardNo": "8800030132004014510"
}, {
"cardNo": "8800031104000000248"
}]
}*/
String a = decode("F8E91A3C", data,Charset.forName("UTF-8"));
System.out.println(a);
System.out.println("完成");
}
}