importsun.misc.BASE64Encoder;import javax.crypto.*;importjavax.crypto.spec.PBEKeySpec;importjavax.crypto.spec.PBEParameterSpec;importjava.io.UnsupportedEncodingException;importjava.security.InvalidAlgorithmParameterException;importjava.security.InvalidKeyException;importjava.security.Key;importjava.security.NoSuchAlgorithmException;importjava.security.spec.InvalidKeySpecException;importjava.util.Random;/*** Created by xiang.li on 2015/2/28.
* PBE 加解密工具类*/
public classPBE {/*** 定义加密方式
* 支持以下任意一种算法
*
*
* PBEWithMD5AndDES
* PBEWithMD5AndTripleDES
* PBEWithSHA1AndDESede
* PBEWithSHA1AndRC2_40
*
*/private final static String KEY_PBE = "PBEWITHMD5andDES";private final static int SALT_COUNT = 100;/*** 初始化盐(salt)
*
*@return
*/
public static byte[] init() {byte[] salt = new byte[8];
Random random= newRandom();
random.nextBytes(salt);returnsalt;
}/*** 转换密钥
*
*@paramkey 字符串
*@return
*/
public staticKey stringToKey(String key) {
SecretKey secretKey= null;try{
PBEKeySpec keySpec= newPBEKeySpec(key.toCharArray());
SecretKeyFactory factory=SecretKeyFactory.getInstance(KEY_PBE);
secretKey=factory.generateSecret(keySpec);
}catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}catch(InvalidKeySpecException e) {
e.printStackTrace();
}returnsecretKey;
}/*** PBE 加密
*
*@paramdata 需要加密的字节数组
*@paramkey 密钥
*@paramsalt 盐
*@return
*/
public static byte[] encryptPBE(byte[] data, String key, byte[] salt) {byte[] bytes = null;try{//获取密钥
Key k =stringToKey(key);
PBEParameterSpec parameterSpec= newPBEParameterSpec(salt, SALT_COUNT);
Cipher cipher=Cipher.getInstance(KEY_PBE);
cipher.init(Cipher.ENCRYPT_MODE, k, parameterSpec);
bytes=cipher.doFinal(data);
}catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}catch(NoSuchPaddingException e) {
e.printStackTrace();
}catch(InvalidAlgorithmParameterException e) {
e.printStackTrace();
}catch(InvalidKeyException e) {
e.printStackTrace();
}catch(BadPaddingException e) {
e.printStackTrace();
}catch(IllegalBlockSizeException e) {
e.printStackTrace();
}returnbytes;
}/*** PBE 解密
*
*@paramdata 需要解密的字节数组
*@paramkey 密钥
*@paramsalt 盐
*@return
*/
public static byte[] decryptPBE(byte[] data, String key, byte[] salt) {byte[] bytes = null;try{//获取密钥
Key k =stringToKey(key);
PBEParameterSpec parameterSpec= newPBEParameterSpec(salt, SALT_COUNT);
Cipher cipher=Cipher.getInstance(KEY_PBE);
cipher.init(Cipher.DECRYPT_MODE, k, parameterSpec);
bytes=cipher.doFinal(data);
}catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}catch(NoSuchPaddingException e) {
e.printStackTrace();
}catch(InvalidAlgorithmParameterException e) {
e.printStackTrace();
}catch(InvalidKeyException e) {
e.printStackTrace();
}catch(BadPaddingException e) {
e.printStackTrace();
}catch(IllegalBlockSizeException e) {
e.printStackTrace();
}returnbytes;
}/*** BASE64 加密
*
*@paramkey 需要加密的字节数组
*@return字符串
*@throwsException*/
public static String encryptBase64(byte[] key) throwsException {return (newBASE64Encoder()).encodeBuffer(key);
}/*** 测试方法
*
*@paramargs*/
public static voidmain(String[] args) {//加密前的原文
String str = "hello world !!!";//口令
String key = "qwert";//初始化盐
byte[] salt =init();//采用PBE算法加密
byte[] encData =encryptPBE(str.getBytes(), key, salt);//采用PBE算法解密
byte[] decData =decryptPBE(encData, key, salt);
String encStr= null;
String decStr= null;try{
encStr=encryptBase64(encData);
decStr= new String(decData, "UTF-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("加密前:" +str);
System.out.println("加密后:" +encStr);
System.out.println("解密后:" +decStr);
}
}