在一些分布式联机交易系统中,为确保信息传递的保密性,一般都会对数据进行加解密,就需要各式各样的加解密算法,在高并发的情况下,这类算法比较耗损性能,可以进行优化。以3DES加解密为例说一下优化方式。
未优化之前代码,标 蓝色/红色 需要改造:
public class DesThreeUtil {
/**
* 采用3Des算法加密
* **/
public static String encrypt3Des(String srcmsg, String des3pwd)throws Exception {
byte[] data = null;
data = srcmsg.getBytes("GBK");
data = padBytes(data);
byte[] key = str2BcdBytes(des3pwd);
byte[] encryptedData = null;
byte[] keyA = new byte[8];
byte[] keyB = new byte[8];
byte[] keyC = new byte[8];
System.arraycopy(key, 0, keyA, 0, 8);
System.arraycopy(key, 8, keyB, 0, 8);
if (key.length > 16) {
System.arraycopy(key, 16, keyC, 0, 8);
} else {
keyC = keyA;
}
encryptedData = encrypt(data, keyA);//加密
encryptedData = decrypt(encryptedData, keyB);//解密
encryptedData = encrypt(encryptedData, keyC);//加密
return StringUtil.trim(byte2hex(encryptedData));
}
/**
* 采用3Des算法解密
*
* @throws Exception
* **/
public static String decrypt3Des(String msg, String des3pwd)throws Exception {
byte[] data = str2BcdBytes(msg);
byte[] key = str2BcdBytes(des3pwd);
byte[] encryptedData = null;
byte[] keyA = new byte[8];
byte[] keyB = new byte[8];
byte[] keyC = new byte[8];
System.arraycopy(key, 0, keyA, 0, 8);
System.arraycopy(key, 8, keyB, 0, 8);
if (key.length > 16) {
System.arraycopy(key, 16, keyC, 0, 8);
} else {
keyC = keyA;
}
encryptedData = decrypt(data, keyC);//解密
encryptedData = encrypt(encryptedData, keyB);//加密
encryptedData = decrypt(encryptedData, keyA);.//解密
return StringUtil.trim(new String(trimBytes(encryptedData), "GBK"));
}
public static byte[] encrypt(byte[] data, byte[] key) throws Exception{
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(dks); //每次加密都初始化Key 耗时
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); //每次加密都初始化Cipher 耗时
cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
byte encryptedData[] = cipher.doFinal(data);
return encryptedData;
}
public static byte[] decrypt(byte[] data, byte[] key) throws Exception{
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(dks); //每次解密都初始化Ke