2017-05-09 171 views
0

嗨,大家好我必須這麼做,我可以根據DES算法加密文件,但我不能再decyrpt文件,我收到錯誤messaje這樣的:文件加密和解密在Java中,不工作解密

javax.crypto.BadPaddingException鑑於最後的塊沒有正確填充

我無法解密文件,我無法找到原因。你能幫我嗎 謝謝你們。

Java代碼:

public class Sifreleme { 

    public static void encrypt(){ 
    try { 
      SecretKey key = KeyGenerator.getInstance("DES").generateKey(); 

      FileOutputStream fosKey = new FileOutputStream("..\\KEY"); 
      SecretKeyFactory keyfac = SecretKeyFactory.getInstance("DES"); 
      DESKeySpec keyspec = (DESKeySpec) keyfac.getKeySpec(key, DESKeySpec.class); 
      fosKey.write(keyspec.getKey()); 
      fosKey.close(); 

      Cipher crypt = Cipher.getInstance("DES"); 
      crypt.init(Cipher.ENCRYPT_MODE, key); 

      FileInputStream fis = new FileInputStream("C:\\Users\\akif\\Desktop\\zilsesi.mp3"); 
      FileOutputStream fos = new FileOutputStream("C:\\Users\\akif\\Desktop\\sifrelenenzilsesi.mp3"); 
      byte[] arrayBytes = new byte[8]; 
      int bytesReads; 
      while ((bytesReads = fis.read(arrayBytes)) != -1) { 
       fos.write(crypt.doFinal(arrayBytes), 0, bytesReads); 
      } 
      fis.close(); 
      fos.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 




public static void decrypt(){ 
     try { 
       FileInputStream fisKey = new FileInputStream("..\\KEY"); 
       byte[] arrayKey = new byte[fisKey.available()]; 
       fisKey.read(arrayKey); 
       SecretKey key = new SecretKeySpec(arrayKey, "DES"); 

       Cipher decrypt = Cipher.getInstance("DES"); 
       decrypt.init(Cipher.DECRYPT_MODE, key); 

       FileInputStream fis = new FileInputStream("C:\\Users\\akif\\Desktop\\sifrelenenzilsesi.mp3"); 
       byte[] encText = new byte[16]; 
       int bytesReads; 
       while ((bytesReads = fis.read(encText)) != -1) { 
        fis.read(decrypt.doFinal(encText), 0, bytesReads); 
       } 
       fis.close(); 
       System.out.println(new String(encText)); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     public static void main(String []args) throws IOException{ 
     encrypt(); 
     decrypt(); 
     } 
+1

在讀取文件中的所有字節之前,您正在調用''decrypt.doFinal(encText)'''。讀取所有字節,然後將它們傳遞給解密器。 – f1sh

+0

我需要使用decrypt.update(enctext)嗎?因爲我不明白這個dofinal代碼行,我將在哪裏使用? –

回答

2

您的代碼在這裏:

while ((bytesReads = fis.read(encText)) != -1) { 
     fis.read(decrypt.doFinal(encText), 0, bytesReads); 
    } 

是相當明顯的錯誤:你需要寫致電decrypt.doFinal就像你在加密過程中產生做明文。目前,您正在用下一個密文塊覆蓋生成的明文,因爲您在循環中調用了read兩次。

此外,根據您的DES Cipher實施,您忘記了IV。


很多其他的事情是錯誤的,以及包括:

  • 使用getAvailable()流處理;
  • 使用56位DES密碼;
  • 使用ECB模式;
  • 重複調用doFinal(這會導致非常大的開銷和不安全的代碼);
  • 未使用CipherInputStreamCipherOutputStream(等等);
  • 使用字符串作爲關鍵字;
  • 忘記在發生異常時關閉流(使用try和資源);
  • printStackTracke()異常處理;
  • 使用static字段作爲變量。

new String(encText)中使用平臺編碼只可能是錯誤的。


請注意,使用錯誤的密鑰/密文組合也可能導致此錯誤。

+0

對不起,我習慣於現在執行代碼評論:P –