3DES 算法 3DES算法顾名思义就是3次DES算法。
public class DES3 {
private static final String CRYPT_ALGORITHM = "DESede";
/**
* 3DES加密模式
*/
public static String encrypt(String value, String key) {
try {
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedByte = cipher.doFinal(value.getBytes());
String encodedByte = byte2hex(encryptedByte);
return encodedByte;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 3DES加密
*
* @param value 加密数据
* @param key 加密密钥
* @param charset 编码格式,不传则为系统自带
* @return
*/
public static byte[] encrypt(String value, String key, String charset) {
try {
byte[] keybyte;
byte[] valuebyte;
if (charset != null && charset.length() > 0) {
keybyte = key.getBytes(charset);
valuebyte = value.getBytes(charset);
} else {
keybyte = key.getBytes();
valuebyte = value.getBytes();
}
SecretKeySpec keySpec = new SecretKeySpec(keybyte, CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedByte = cipher.doFinal(valuebyte);
return encryptedByte;
} catch (UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.getMessage();
return null;
}
}
/**
*
* @param valuebyte
* @param key
* @param charset
* @return
*/
public static byte[] decrypt(byte[] valuebyte, String key, String charset) {
try {
byte[] keybyte;
if (charset != null && charset.length() > 0) {
keybyte = key.getBytes(charset);
} else {
keybyte = key.getBytes();
}
SecretKeySpec keySpec = new SecretKeySpec(keybyte, CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decryptedByte = cipher.doFinal(valuebyte);
return decryptedByte;
} catch (UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.getMessage();
return null;
}
}
/**
*
* @param src
* @param key
* @return
* @throws Exception
*/
public static String desEncrypt(String src, String key, String charset) throws Exception {
SecretKey secretKey = new SecretKeySpec(build3DesKey(key, charset),
CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] b = cipher.doFinal(src.getBytes(charset));
return byte2HexStr(b);
}
/**
*
* @param dest
* @param key
* @return
* @throws Exception
*/
public static String desDecrypt(String dest, String key, String charset) throws Exception {
SecretKey secretKey = new SecretKeySpec(build3DesKey(key, charset),
CRYPT_ALGORITHM);
Cipher cipher = Cipher.getInstance(CRYPT_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] b = cipher.doFinal(str2ByteArray(dest));
return new String(b, charset);
}
/**
*
* @param keyStr
* @param charset
* @return
* @throws Exception
*/
private static byte[] build3DesKey(String keyStr,String charset) throws Exception {
byte[] key = new byte[24];
byte[] temp = keyStr.getBytes(charset);
if (key.length > temp.length) {
System.arraycopy(temp, 0, key, 0, temp.length);
} else {
System.arraycopy(temp, 0, key, 0, key.length);
}
return key;
}
/**
* 二进制转十六进制字符串。每一个字节转为两位十六进制字符串。
* @param b
* @return
*/
private static String byte2HexStr(byte[] b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.length; i++) {
String s = Integer.toHexString(b[i] & 0xFF);
if (s.length() == 1) {
sb.append("0");
}
sb.append(s.toUpperCase());
}
return sb.toString();
}
/**
*
* @param s
* @return
*/
private static byte[] str2ByteArray(String s) {
int byteArrayLength = s.length() / 2;
byte[] b = new byte[byteArrayLength];
for (int i = 0; i < byteArrayLength; i++) {
byte b0 = (byte) Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16)
.intValue();
b[i] = b0;
}
return b;
}
public static void main(String[] args) {
<span style="white-space:pre"> </span>//String password = "30BOgfz4vcEu7h6TjpYPa1EJ";
<span style="white-space:pre"> </span>//String msg = "3DES加密解密案例";
<span style="white-space:pre"> </span>//System.out.println("BEFOR:" + encrypt(msg, password));
//加密
//byte[] secretArr = ThreeDES.encryptMode(msg, password);
//System.out.println("AFTER:" + new String(secretArr));
//解密
//byte[] myMsgArr = ThreeDES.decryptMode(secretArr, password);
//System.out.println("DE AFTER:" + new String(myMsgArr));
String key = "88888888";
String username = " tianqiao";
String pwd = "FE2E4F68DEE1CF47E04815E6549F9D61";
String product = "ID100001";
String param = "cxcx,110108196708179712";
String charSet = "UTF-8";
String str2 = "2C36EDC3C0CA60C426F22E3BDE8BB146FA8178563EF6BEBB8CD8F299E85FD9A67B14983D95B16BF5633E1DE7CB7B2460F7EDB2D3B387770EFC441383D23D0D8D135C94BBDEA78B2E52C5759CE9AA9CC2929EF02DE08F6593B053AD070299E239254EBC0B766BB317C1C007E900A493EF37511A96C959F587737A75EA5774E2AB978DCE8671D0D0E91B71171BF6680C39667F1B9428D66618A6A5841EC5AC8AE5";
try {
String ename = ThreeDES.desEncrypt(username, key, charSet);
String dname = ThreeDES.desDecrypt(ename, key, charSet);
String epwd = ThreeDES.desEncrypt(pwd, key, charSet);
String dpwd = ThreeDES.desDecrypt(epwd, key, charSet);
String eproduct = ThreeDES.desEncrypt(product, key, charSet);
String dproduct = ThreeDES.desDecrypt(eproduct, key, charSet);
String eparam = ThreeDES.desEncrypt(param, key, charSet);
String dparam = ThreeDES.desDecrypt(eparam, key, charSet);
System.out.println("密文:"+ename+"---->明文:"+dname);
System.out.println("密文:"+epwd+"---->明文:"+dpwd);
System.out.println("密文:"+eproduct+"---->明文:"+dproduct);
System.out.println("密文:"+eparam+"---->明文:"+dparam);
/*System.out.println(ThreeDES.desEncrypt(product, key, charSet));
System.out.println(ThreeDES.desEncrypt(param, key, charSet));
System.out.println(ThreeDES.desDecrypt(str2, key, charSet));*/
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}