2017-05-09 149 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 –