2012-03-29 40 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