2016-12-15 10 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

を使用して、バイナリファイル、テキストではなくfile.For例を使用する必要があります。あなたはこれまでこれを使用すべきではありません。 –

答えて

2

次の2つのミスがあります

は、暗号化と復号化で同じキーを使用します。

Bar12345Sar12346

Bar12345Sar12345対暗号化されたデータは、文字列ではありません

暗号化されたデータが文字として表現できないため、このコードを使用してbyte[]Stringに変換しないでください。

str1 = new String(encrypted); 

あなたはこれはひどい暗号化コードである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)の静的メソッドを使用してください。 )。私は2つの間違いがむしろ楽観的だと言いたいと思いますが、コードがうまくいかない主な理由だと思います。コードが安全である必要がある場合は、他にも多くの問題があります。 –

+0

おかげさまで@MaartenBodewes、私はあなたが提案したようにJava 7ファイルによってIOUtilsを変更しました – pedrofb

+0

今、私は同じ番号にキーを変更したところうまくいきました。しかし、あなたが指定した2番目の間違いは、その変更なしで正常に動作するので、私は思う必要はありません.Anyway thanks @pedrofb –

関連する問題