170 lines
6.0 KiB
Java
170 lines
6.0 KiB
Java
package cn.palmte.work.utils;
|
||
|
||
import org.apache.commons.codec.binary.Base64;
|
||
import org.apache.commons.codec.digest.DigestUtils;
|
||
import sun.misc.BASE64Encoder;
|
||
|
||
import javax.crypto.Cipher;
|
||
import javax.crypto.SecretKey;
|
||
import javax.crypto.SecretKeyFactory;
|
||
import javax.crypto.spec.DESKeySpec;
|
||
import javax.crypto.spec.IvParameterSpec;
|
||
import java.io.IOException;
|
||
import java.security.MessageDigest;
|
||
import java.security.SecureRandom;
|
||
|
||
public class DESCrypto {
|
||
|
||
private static String encoding = "ASCII";
|
||
private static final String special_char = "%(?![0-9a-fA-F]{2})";
|
||
|
||
// 解密数据
|
||
public static String decrypt(String message, String key) throws Exception {
|
||
byte[] bytesrc = convertHexString(message.toUpperCase());
|
||
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
|
||
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(encoding));
|
||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
||
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
|
||
IvParameterSpec iv = new IvParameterSpec(key.getBytes(encoding));
|
||
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
|
||
byte[] retByte = cipher.doFinal(bytesrc);
|
||
return new String(retByte).replaceAll(special_char, "%25");
|
||
}
|
||
|
||
public static byte[] encrypt(byte[] message, String key) throws Exception {
|
||
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
|
||
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(encoding));
|
||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
||
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
|
||
IvParameterSpec iv = new IvParameterSpec(key.getBytes(encoding));
|
||
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
|
||
return cipher.doFinal(message);
|
||
}
|
||
|
||
public static byte[] convertHexString(String ss){
|
||
byte digest[] = new byte[ss.length() / 2];
|
||
for (int i = 0; i < digest.length; i++) {
|
||
String byteString = ss.substring(2 * i, 2 * i + 2);
|
||
int byteValue = Integer.parseInt(byteString, 16);
|
||
digest[i] = (byte) byteValue;
|
||
}
|
||
return digest;
|
||
}
|
||
|
||
// public static void main(String[] args) throws Exception{
|
||
// String key = "VBZ0NR";
|
||
// String value = "dzgadmin0.123456789.!@#$%^&*()";
|
||
//
|
||
// byte[] bytes = value.getBytes(encoding);
|
||
// String newKey = string2MD5(key).substring(0, 8).toUpperCase();
|
||
// String a = toHexString(encrypt(bytes, newKey)).toUpperCase();
|
||
// System.out.println("加密后的数据为:" + a);
|
||
//
|
||
// String b = java.net.URLDecoder.decode(decrypt(a, newKey), encoding);
|
||
// System.out.println("解密后的数据:" + b);
|
||
//
|
||
// String res = encryptPassword(value, key);
|
||
//
|
||
// System.out.println("res:" + res);
|
||
// }
|
||
|
||
public static String encryptPassword(String password, String key) throws Exception{
|
||
byte[] bytes = password.getBytes(encoding);
|
||
String newKey = DigestUtils.md5Hex(key).substring(0, 8).toUpperCase();
|
||
|
||
return toHexString(encrypt(bytes, newKey)).toUpperCase();
|
||
}
|
||
|
||
public static String toHexString(byte b[]) {
|
||
StringBuilder hexString = new StringBuilder();
|
||
for (int i = 0; i < b.length; i++) {
|
||
String plainText = Integer.toHexString(0xff & b[i]);
|
||
if (plainText.length() < 2)
|
||
plainText = "0" + plainText;
|
||
hexString.append(plainText);
|
||
}
|
||
return hexString.toString();
|
||
}
|
||
|
||
|
||
/***
|
||
* MD5加码 生成32位md5码
|
||
*/
|
||
public static String string2MD5(String inStr){
|
||
MessageDigest md5 = null;
|
||
try{
|
||
md5 = MessageDigest.getInstance("MD5");
|
||
}catch (Exception e){
|
||
return "";
|
||
}
|
||
char[] charArray = inStr.toCharArray();
|
||
byte[] byteArray = new byte[charArray.length];
|
||
|
||
for (int i = 0; i < charArray.length; i++)
|
||
byteArray[i] = (byte) charArray[i];
|
||
byte[] md5Bytes = md5.digest(byteArray);
|
||
StringBuilder hexValue = new StringBuilder();
|
||
for (int i = 0; i < md5Bytes.length; i++){
|
||
int val = ((int) md5Bytes[i]) & 0xff;
|
||
if (val < 16)
|
||
hexValue.append("0");
|
||
hexValue.append(Integer.toHexString(val));
|
||
}
|
||
return hexValue.toString();
|
||
|
||
}
|
||
|
||
public static String encryptZSK(String data) throws Exception{
|
||
return new BASE64Encoder().encode(encryptZSK(data.getBytes(), "zhangshangweike0".getBytes()));
|
||
}
|
||
|
||
private static byte[] encryptZSK(byte[] data, byte[] key) throws Exception{
|
||
// 生成一个可信任的随机数源
|
||
SecureRandom sr = new SecureRandom();
|
||
|
||
// 从原始密钥数据创建DESKeySpec对象
|
||
DESKeySpec dks = new DESKeySpec(key);
|
||
|
||
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
|
||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
||
SecretKey securekey = keyFactory.generateSecret(dks);
|
||
|
||
// Cipher对象实际完成加密操作
|
||
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
|
||
|
||
// 用密钥初始化Cipher对象
|
||
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
|
||
|
||
return cipher.doFinal(data);
|
||
}
|
||
|
||
public static String decryptRedirect(String data, String key) throws IOException, Exception{
|
||
if(data == null)
|
||
return null;
|
||
byte[] buf = Base64.decodeBase64(data);
|
||
byte[] bt = decryptRedirect(buf, key.getBytes());
|
||
return new String(bt);
|
||
}
|
||
|
||
private static byte[] decryptRedirect(byte[] data, byte[] key) throws Exception{
|
||
// 生成一个可信任的随机数源
|
||
SecureRandom sr = new SecureRandom();
|
||
|
||
// 从原始密钥数据创建DESKeySpec对象
|
||
DESKeySpec dks = new DESKeySpec(key);
|
||
|
||
// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
|
||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
||
SecretKey securekey = keyFactory.generateSecret(dks);
|
||
|
||
// Cipher对象实际完成解密操作
|
||
Cipher cipher = Cipher.getInstance("DES");
|
||
|
||
// 用密钥初始化Cipher对象
|
||
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
|
||
|
||
return cipher.doFinal(data);
|
||
}
|
||
|
||
}
|