2012-03-29 136 views
0

我想使用PBE加密我的数据。到目前为止,我写了下面的代码:加密:使用基于密码的加密(PBE)

moteurCryptage = Cipher.getInstance("PBEWithMD5AndDES"); 

     PBEKeySpec spécifClé=new PBEKeySpec(mdp.toCharArray()); 
     SecretKeyFactory usineàClefs=SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
     SecretKey clé=null; 
     try { 
      clé = usineàClefs.generateSecret(spécifClé); 
     } catch (InvalidKeySpecException ex) { 
      Logger.getLogger(DiskUtilView.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    moteurCryptage.init(Cipher.ENCRYPT_MODE,clé); 
     byte[] paramètresEncodage; 
     try { 
      paramètresEncodage=moteurCryptage.getParameters().getEncoded(); 
     } catch (IOException ex) { 
      paramètresEncodage=null; 
     } 

    destination=moteurCryptage.update(source1.getBytes()); 
    destination=moteurCryptage.doFinal(source2.getBytes()); 

    moteurCryptage.init(Cipher.DECRYPT_MODE,clé,paramètresEncodage); 

    source=new String(moteurCryptage.doFinal(destination)); 

加密似乎工作(我没有得到任何错误,既不是编译也不执行期间),但Cipher对象的解密不接受初始化javax.crypto.SecretKey类(编译错误)。它反而要求java.security.key

我该怎么办?

在此先感谢您花费时间来帮助我。

+1

UFF,法国人物很难消除。而且,如果使用英文,变量名将更具可读性:)。还有一些对我们来说属于未知类型的变量。请下次尝试尽可能编译。 – 2012-03-29 15:34:33

回答

1

的问题是线

moteurCryptage.init(Cipher.DECRYPT_MODE, cle, parametresEncodage); 

这应该是

moteurCryptage.init(Cipher.DECRYPT_MODE, cle, moteurCryptage.getParameters()); 

而且,正如你指出的那样,则不适用于某些字符串的工作(仅适用于那些非常短的) 。问题是,当您拨打update()时,它会将一些数据存入产生的byte[]。当你在同一个变量上调用doFinal()时,它会覆盖数据,并且它们永远丢失。 doFinal()方法不会再做所有的加密,它只会完成剩余的部分!

这意味着,你

  • 有你处理这些
  • 之前以连接源字符串或者你有update()后保存destination,使destination2doFinal(),然后两者进行解密以同样的方式 - update()destinationdoFinal()destination2
  • 也可以使destinationdestination2,将它们连接起来(here's how,如)成SINGL e completeDestination数组,并在其上解密doFinal()

如果您想查看以上所有代码,只需说一句话。

+0

好吧,它几乎可以正常工作。编译错误消失了,用“doFinal”调用实现的加密被正确解密,但是调用“update”后跟一个“doFinal”调用的“double”加密导致意想不到的结果:如果第一个字符串是“第一个字符串”,第二个字符串是“第二个字符串”,我得到的解密结果是“/q L ndstring”。 :( – Zelig63 2012-03-30 15:11:07

+0

OH!我会在5分钟内编辑我的答案,我有解决方案。 – 2012-03-30 15:58:02

+0

我确认一次只能加密一个字符串,所以这是我的问题的解决方案Nevertheles,这听起来很奇怪:如果使用“RSA/ECB/PKCS1Padding”进行加密,则解密后的字符串会同时包含两个字符串,看起来“update”和“doFinal”根据使用的算法而有所不同。 – Zelig63 2012-03-31 06:57:02