java aes pbe_8.Java 加解密技术系列之 PBE

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值