Java中创建口令密钥的代码

加密时所用的密钥是根据给定的口令生成的。为了增加破解的难度,PBE还使用一个随机数(称为盐)和口令组合起来加密文件。此外还进行重复计算(迭代)。

1加密

public static void jiami(String kouling) throws Exception {
  char[] passwd = kouling.toCharArray();
  PBEKeySpec pbks = new PBEKeySpec(passwd);

/**

getInstance()方法的参数是一个字符串,指定口令加密算法,如PBEWithMD5AndDESPBEWithHmacSHA1AndDESede等。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");
 }

posted @ 2010-03-30 15:09  饺子吃遍天  阅读(460)  评论(0编辑  收藏  举报