DES加密算法分为两种,一种是ECB加密(不要IV),另一种是CBC加密(要IV)。
public class DESUtils {
/**
* ECB加密,不要IV
* @param key 密钥
* @param data 明文
* @return Base64编码的密文
* @throws Exception
*/
public static byte[] des3EncodeECB(byte[] key, 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" + "/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
/**
* ECB解密,不要IV
* @param key 密钥
* @param data Base64编码的密文
* @return 明文
* @throws Exception
*/
public static byte[] des3DecodeECB(byte[] key, 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" + "/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
/**
* CBC加密
* @param key 密钥
* @param keyiv IV
* @param data 明文
* @return Base64编码的密文
* @throws Exception
*/
public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, 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);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
/**
* CBC解密
* @param key 密钥
* @param keyiv IV
* @param data Base64编码的密文
* @return 明文
* @throws Exception
*/
public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, 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.DECRYPT_MODE, deskey, ips);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
下面我将给大家展示如何使用工具类进行ECB加密解密:
private String DES_KEY ="YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4";
private String password = "123456789"
/**
* 对账户密码进行3DES加密
* @param key:3DESkey
* @param password:账户密码
* @param secretPassword:加密后的密码
*/
String secretPassword = DESMain(password);
public static String DESMain(String password) throws Exception {
byte[] key = Base64.decode(DES_KEY.getBytes(), Base64.DEFAULT);
byte[] PSW = password.getBytes("UTF-8");
byte[] secretPSW = DESUtils.des3EncodeECB(key, PSW);
String secretPSW = new String(Base64.encode(secretPSW, Base64.DEFAULT), "UTF-8");
return secretPSW;
}
/**
* 对账户密码进行3DES解密
* @param key:3DESkey
* @param secretPassword:加密后的密码
* @param truePassword:解密后的密码
*/
String truePassword = EESMain(secretPassword);
public static String EESMain(String secretPassword) throws Exception {
byte[] key = Base64.decode(DES_KEY.getBytes(), Base64.DEFAULT);
byte[] PSW = Base64.decode(secretPassword, Base64.DEFAULT);
byte[] truePSW = DESUtils.ees3DecodeECB(key, PSW);
String truePSW = new String(truePSW, "UTF-8");
return truePSW;
}