介绍摘自Wikipedia:
数据进行三次加密。
数据加密标准(DES)是美国的一种由来已久的加密标准,它使用
对称密钥
加密法,并于1981年被
ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的
加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的
密钥,M代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
3DES解密过程为:M=Dk1(EK2(Dk3(C)))
代码:
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.lang3.StringUtils;
import jodd.util.Base64;
public class TripleDES {
// 算法名称
public static final String KEY_ALGORITHM = "DESede";
// 算法名称/加密模式/填充方式
public static final String CIPHER_ALGORITHM_CBC = "DESede/CBC/PKCS5Padding";
public static byte[] DefaultIV = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF};
private SecretKey secretKey;
private Cipher cipher;
private byte[] encryptData;
private AlgorithmParameterSpec iv;
private static TripleDES tripleDES = null;
public static TripleDES getInstance(String key) throws Exception {
if (tripleDES == null) {
synchronized (TripleDES.class) {
tripleDES = new TripleDES(key,"CBC");
}
}
return tripleDES;
}
public TripleDES(String key,String mode) {
if("CBC".equals(mode)) {
if (StringUtils.isEmpty(key)) {
key = "GDAU8xpYaWivfJS1R5NGFotZwY8tt6KH";
}
byte[] keyData = Base64.decode(key);
try {
cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
secretKey = new SecretKeySpec(keyData, KEY_ALGORITHM);
iv = new IvParameterSpec(DefaultIV);
}
}
/**
* 初始向量8位
* @return
*/
byte[] getIV() {
return DefaultIV;
}
/**
* 加密
* @param str
* @return byte[]
* @throws Exception
*/
public byte[] encrypt(String str) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return encryptData = cipher.doFinal(str.getBytes("utf-8"));
}
/**
* 解密
* @param encrypt
* @return byte[]
* @throws Exception
*/
public byte[] decrypt(byte[] encrypt) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
return encryptData = cipher.doFinal(encrypt);
}
/**
* TripleDes三层加密,并且base64编码
* 默认utf-8
* @param str
* @return String
* @throws Exception
*/
public String encryptStr(String str) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
encryptData = cipher.doFinal(str.getBytes("utf-8"));
return Base64.encodeToString(encryptData);
}
/**
* 解密 返回字符串 ,,并且base64解码
* 默认utf-8
* @param encrypt
* @return String
* @throws Exception
*/
public String decryptStr(String data) throws Exception {
byte[] encrypt = Base64.decode(data);
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
encryptData = cipher.doFinal(encrypt);
return new String(encryptData,"UTF-8");
}
public static void main(String[] args) throws Exception {
TripleDES tripleDES = TripleDES.getInstance("dgKU8xpYaRivfJS1R5NGFotZwY6lI6jI");
Test1();
// String data = "\"address\":\"北京市\",\"applyNo\":\"09ecd729d09e461bb9ad0329ecddf163\",\"applyReason\":\"测试\",\"creditAmount\":10,\"creditReason\":\"系统通过\",\"ext\":{},\"idCard\":\"101123\",\"jdPin\":\"washingtin\",\"name\":\"X_man\",\"phone\":\"15520059911\",\"reqDate\":\"20160823135900\",\"returnParams\":\"\",\"riskRemark\":\"无\"";
// System.out.println(HashUtils.MD5(data));
// tripleDES.testEncrypt();
tripleDES.testDecrypt();
}
}