代码
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.net.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* @author:gavin
* @date:2019/7/11 19 18
* @Description
**/
public class ThreeDesUtil {
private static final String Algorithm = "DESede/ECB/PKCS5Padding";
private static final String chartName = "UTF-8";
private static final String key = "thiskey";
/**
* 3DES加密 +base64
*
* @auther: gavin
* @date: 2019/7/12 10:38
* @param: [srcStr]
* @return: java.lang.String
*/
public static String encode3Des(String srcStr) {
try {
byte[] keybyte = hex(key);
byte[] src = srcStr.getBytes(chartName);
// DESedeKeySpec dks = new DESedeKeySpec(keybyte);
// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
// SecretKey deskey = keyFactory.generateSecret(dks);
SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
String pwd = Base64.encodeBase64String(c1.doFinal(src));
return pwd;
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
/**
* 3DES解密
* base + 3des
*
* @auther: gavin
* @date: 2019/7/12 10:38
* @param: [desStr]
* @return: java.lang.String
*/
public static String decode3Des(String desStr) {
Base64 base64 = new Base64();
byte[] src = base64.decode(desStr);
try {
byte[] keybyte = hex(key);
//生成密钥
// DESedeKeySpec dks = new DESedeKeySpec(keybyte);
// SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
// SecretKey deskey = keyFactory.generateSecret(dks);
SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
String pwd = new String(c1.doFinal(src), chartName);
return pwd;
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
/**
* 生成24位key
*
* @auther: gavin
* @date: 2019/7/12 11:24
* @param: [key]
* @return: byte[]
*/
public static byte[] hex(String key) {
String f = DigestUtils.md5Hex(key);
byte[] bkeys = new String(f).getBytes();
byte[] enk = new byte[24];
for (int i = 0; i < 24; i++) {
enk[i] = bkeys[i];
}
return enk;
}
这里用的是:DESede/ECB/PKCS5Padding
- DESede表示加密方式
- ECB表示加密模式
- PKCS5Padding表示填充模式
常用的有:
DESede/ECB/PKCS5Padding,
DESede/ECB/NoPadding,
DESede/CBC/PKCS5Padding,
DESede/CBC/NoPadding
注:
- key:需24字节
- 编码方式
初识记录,适合快速使用。欢迎各位大佬补充指正。