加密时所用的密钥是根据给定的口令生成的。为了增加破解的难度,PBE还使用一个随机数(称为盐)和口令组合起来加密文件。此外还进行重复计算(迭代)。
1加密
public static void jiami(String kouling) throws Exception {
char[] passwd = kouling.toCharArray();
PBEKeySpec pbks = new PBEKeySpec(passwd);
/**
getInstance()方法的参数是一个字符串,指定口令加密算法,如PBEWithMD5AndDES,PBEWithHmacSHA1AndDESede等。JCE中已经实现的是PBEWithMD5AndDES。
**/
SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey k = kf.generateSecret(pbks);
byte[] salt = new byte[8];
Random r = new Random();
r.nextBytes(salt);
Cipher cp = Cipher.getInstance("PBEWithMD5AndDES");
PBEParameterSpec ps = new PBEParameterSpec(salt, 1000);
cp.init(Cipher.ENCRYPT_MODE, k, ps);
String mima = "liaomin999";
byte ptext[] = mima.getBytes("UTF8");
byte ctext[] = cp.doFinal(ptext);
// 将盐和加密结果合并在一起保存为密文
FileOutputStream f = new FileOutputStream("c://a.dat");
f.write(salt);
f.write(ctext);
}
2解密
public static void jiemi(String kouling) throws Exception {
char[] passwd=kouling.toCharArray( );
PBEKeySpec pbks=new PBEKeySpec(passwd);
SecretKeyFactory kf=
SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey k=kf.generateSecret(pbks);
byte[] salt=new byte[8];
FileInputStream f=new FileInputStream("c://a.dat");
f.read(salt);
int num=f.available();
byte[ ] ctext=new byte[num];
f.read(ctext);
Cipher cp=Cipher.getInstance("PBEWithMD5AndDES");
PBEParameterSpec ps=new PBEParameterSpec(salt,1000);
cp.init(Cipher.DECRYPT_MODE, k,ps);
byte ptext[]=cp.doFinal(ctext);
// 显示解密结果
System.out.println(new String(ptext,"utf-8"));
}
public static void main(String[] args) throws Exception {
jiami("liaomin");
jiemi("liaomin");
}