2016-12-15 102 views
0

我正在爲我的項目開發AES加密。我決定做文件加密 當我在同一功能中執行加密和解密時,它運行時沒有任何缺陷。但是當我單獨執行時,解密部分遇到了一些問題。使用AES加密時的填充異常

我對這兩個函數都使用了相同的密鑰,但它不適用於單獨解密。

這裏是我的加密代碼:

public void enc(File a) throws FileNotFoundException { 


       try { 
        c = new Scanner(a).useDelimiter("\\Z").next(); 

        String key = "Bar12345Sar12346"; // 128 bit key 
        Key aesKey = new SecretKeySpec(key.getBytes(), "AES"); 
        Cipher cipher = Cipher.getInstance("AES"); 

        cipher.init(Cipher.ENCRYPT_MODE, aesKey); 
        byte[] encrypted = cipher.doFinal(c.getBytes()); 

        str1 = new String(encrypted); 
        textField_1.setText(str1); 

        empty(a); \\ To clear the text file 

        PrintWriter writer = new PrintWriter(a); 
        writer.println(str1);      
        writer.close(); 

       } catch (InvalidKeyException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (NoSuchAlgorithmException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (NoSuchPaddingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalBlockSizeException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (BadPaddingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

} 

這裏是我的解密代碼:

public void dec(File b) throws FileNotFoundException 
{ 
    try { 
     c1 = new Scanner(b).useDelimiter("\\Z").next(); 
     byte[] by=c1.getBytes(); 

     String key = "Bar12345Sar12345"; // 128 bit key 
     Key aesKey = new SecretKeySpec(key.getBytes(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES"); 

     cipher.init(Cipher.DECRYPT_MODE, aesKey); 
     String decrypted = new String(cipher.doFinal(by)); 

     str2 = new String(decrypted); 
     System.out.println(str2); 
     System.out.println("3"); 

     textField_2.setText(str2); 

     empty(b); 

     PrintWriter writer = new PrintWriter(b); 
     writer.println(str2);      
     writer.close(); 

    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (BadPaddingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

這是錯誤消息時,我分別執行解密。

javax.crypto.BadPaddingException: Given final block not properly padded 
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:975) 
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:833) 
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446) 
at javax.crypto.Cipher.doFinal(Cipher.java:2165) 
at Main.dec(Main.java:117) 
at Main$4.actionPerformed(Main.java:228) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+1

這是可怕的加密代碼。你不應該使用這個。 –

回答

2

你有兩個錯誤:

使用加密相同的密鑰和解密

Bar12345Sar12346 VS Bar12345Sar12345

加密的數據是不是一個String

你可以不使用此代碼將byte[]轉換爲String,因爲加密數據不能表示爲字符。

str1 = new String(encrypted); 

你必須使用一個二進制文件,而不是文本file.For例如,使用Java 7 Files

//Write to file 
Files.write(file.toPath(), encryptedData); 

//Read from file 
byte encryptedData[] = Files.readAllBytes(file.toPath()); 
+0

不再需要Commons IO,只需使用[Java'Files'類]中的靜態方法(https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html )。我會說兩個錯誤相當樂觀,但我猜他們是代碼無法正常工作的主要原因。如果代碼也需要安全,還有很多其他問題... –

+0

感謝@MaartenBodewes,我已經按照你的建議更改了Java 7文件的IOUtils – pedrofb

+0

現在我將密鑰更改爲相同的數字,現在它工作正常。但是你指定的第二個錯誤並不是我所需要的,因爲它沒有改變就可以正常工作。無論如何謝謝@pedrofb –