import java.security.*;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;/*** DES加密算法
* 这个加密算法是对称的加密算法
* 这个加密算法,在本系统中的应用,主要是因为该加密算法加密后
* 密文都是字符串和数字的,没有其他字符。这样的密文可以应用在url地址上,
* 不用担心被URL 地址上传递的数字被转义
*@authorAdministrator
**/
public classRDes {/**加密算法,可用 DES,DESede,Blowfish.*/
private final static String ALGORITHM = "DES";/*** DES解密算法
*@paramdata
*@paramcryptKey 密钥 要是偶数
*@return*@throwsException*/
public static String decrypt(String data, String cryptKey) throwsException {return newString(decrypt(hex2byte(data.getBytes()),
cryptKey.getBytes()));
}/*** DES加密算法
*@paramdata
*@paramcryptKey
*@return*@throwsException*/
public final staticString encrypt(String data, String cryptKey)throwsException {returnbyte2hex(encrypt(data.getBytes(), cryptKey.getBytes()));
}private static byte[] encrypt(byte[] data, byte[] key) throwsException {//DES算法要求有一个可信任的随机数源
SecureRandom sr = newSecureRandom();//从原始密匙数据创建DESKeySpec对象
DESKeySpec dks = newDESKeySpec(key);//创建一个密匙工厂,然后用它把DESKeySpec转换成//一个SecretKey对象
SecretKeyFactory keyFactory =SecretKeyFactory.getInstance(ALGORITHM);
SecretKey securekey=keyFactory.generateSecret(dks);//Cipher对象实际完成加密操作
Cipher cipher =Cipher.getInstance(ALGORITHM);//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);//现在,获取数据并加密//正式执行加密操作
returncipher.doFinal(data);
}private static byte[] decrypt(byte[] data, byte[] key) throwsException {//DES算法要求有一个可信任的随机数源
SecureRandom sr = newSecureRandom();//从原始密匙数据创建一个DESKeySpec对象
DESKeySpec dks = newDESKeySpec(key);//创建一个密匙工厂,然后用它把DESKeySpec对象转换成//一个SecretKey对象
SecretKeyFactory keyFactory =SecretKeyFactory.getInstance(ALGORITHM);
SecretKey securekey=keyFactory.generateSecret(dks);//Cipher对象实际完成解密操作
Cipher cipher =Cipher.getInstance(ALGORITHM);//用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);//现在,获取数据并解密//正式执行解密操作
returncipher.doFinal(data);
}private static byte[] hex2byte(byte[] b) {if ((b.length % 2) != 0)throw new IllegalArgumentException("长度不是偶数");byte[] b2 = new byte[b.length / 2];for (int n = 0; n < b.length; n += 2) {
String item= new String(b, n, 2);
b2[n/ 2] = (byte) Integer.parseInt(item, 16);
}returnb2;
}private static String byte2hex(byte[] b) {
String hs= "";
String stmp= "";for (int n = 0; n < b.length; n++) {
stmp= (java.lang.Integer.toHexString(b[n] & 0XFF));if (stmp.length() == 1)
hs= hs + "0" +stmp;elsehs= hs +stmp;
}returnhs.toUpperCase();
}
}