package com.ccb.suap.util;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 3DES工具类
* 20170908
* @author lizim
*
*/
public class DESUtil {
/**
* 加密
* @param plainText 需要加密的字段
* @param secretKey 密钥
* @param iv 向量
* @param encoding 编码 utf-8 gbk
* @return
* @throws Exception
*/
public static String encrypt(String plainText, String secretKey, String iv, String encoding) throws Exception {
if (secretKey != null) {
if (secretKey.length() > 24) {
secretKey = secretKey.substring(0, 24);
}
}
if (iv != null) {
if (iv.length() > 24) {
iv = iv.substring(0, 8);
}
}
DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
Key deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
//原生的base64有换行
//return new String(new BASE64Encoder().encode(encryptData));
return new String(Base64.encode(encryptData));
}
/**
* 解密
* @param encryptText 需要解密的字符串
* @param secretKey 密钥
* @param iv 向量
* @param encoding 编码 utf-8 gbk
* @return
* @throws Exception
*/
public static String decrypt(String encryptText, String secretKey, String iv, String encoding) throws Exception {
if (secretKey != null) {
if (secretKey.length() > 24) {
secretKey = secretKey.substring(0, 24);
}
}
if (iv != null) {
if (iv.length() > 24) {
iv = iv.substring(0, 8);
}
}
DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
Key deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
//byte[] decryptData = cipher.doFinal(new BASE64Decoder().decodeBuffer(encryptText));
byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));
return new String(decryptData, encoding);
}
public static void main(String[] args) {
try {
// 密钥
String secretKey = "HCEHCEHCEHCEHCEHCEHCEHCEHCEHCEHC";
// 向量
String iv = "12341234";
// 加解密统一使用的编码方式
String encoding = "utf-8";
String test = encrypt("中国爱我", secretKey, iv, encoding);
System.out.println(test);
System.out.println(decrypt(test, secretKey, iv, encoding));
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试一下看看是不是可以加解密在用。