2017-04-03 1 views
0

Ich habe seit mehreren Tagen versucht, in Java eine mit openssl verschlüsselte Nachricht zu entschlüsseln. Die Nachricht wurde mit dem folgenden Befehl verschlüsselt:Java-Entschlüsselung einer verschlüsselten Datei mit openssl aes 256 cbc

openssl enc -a -aes-256-cbc -kfile $ file.key -in toto -out toto.enc.

Die Datei file.key enthält den symmetrischen Schlüssel mit 256 Bits. In dem Befehl wurde kein Salz angegeben und dennoch beginnt die Datei mit Salted__. Hier ist die Klasse, die ich codiert habe, um zu versuchen, die Datei zu entschlüsseln, aber unmöglich, etwas sogar durch Entfernen der 16 Zeichen der Datei zu erhalten, nämlich die: Salted__ + das Salz verschlüsselt. Ich habe verstanden, dass openssl das standardmäßig gemacht hat. Wenn ich versuche zu entschlüsseln, wird eine Ausnahme in Bezug auf den verschlüsselten Text ausgelöst.

Kann mir jemand helfen? eine Spur? eine Idee ?

Vielen Dank.

Der Code:

public class Java { 

     private static SecretKey key = null;   
     private static Cipher cipher = null; 

     public static void main(String[] args) throws Exception 
     { 
      String filename = RESOURCES_DIR + "toto.enc"; 

      byte[] key = Base64.decode("2AxIw+/AzDBj83OILV9GDpOs+izDFJEhD6pve/IPsN9="); 
      SecretKeySpec secretKey = new SecretKeySpec(key, "AES"); 
      cipher = Cipher.getInstance("AES"); 

      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      byte[] test = Base64.decode(readFile(filename)); 
      byte[] decryptedBytes = cipher.doFinal(test); 
      String decryptedText = new String(decryptedBytes, "UTF8"); 

      System.out.println("After decryption: " + decryptedText); 
     } 

     public final static String RESOURCES_DIR = "C:/Users/toto/Desktop/"; 

     static String readFile(String filename) throws FileNotFoundException, IOException { 
      FileReader fr; 
      BufferedReader br; 

      fr = new FileReader(new File(filename)); 
      br = new BufferedReader(fr); 
      String str; 
      String res = ""; 
      while ((str = br.readLine()) != null) { 
       res += str; 
      } 
      return res; 
     } 
    } 

Der Fehler:

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2131) 
    at deciphertodeploytest6.Java.main(Java.java:52) 
+1

exaktes Duplikat [Openssl AES 256 CBC Java Entschlüsseln Datei mit Salz] (https: // stackoverflow.com/questions/43186915/openssl-aes-256-cbc-java-decrypt-file-with-salt) –

+1

[Java AES 128 verschlüsseln anders als openssl] (http://stackoverflow.com/q/21086103/608639), [Java entspricht einer OpenSSL AES CBC-Verschlüsselung] (http://stackoverflow.com/q/32508961/608639), [Wie dekodiert man eine Zeichenkette codiert mit OpenSSL AES-128-CBC mit Java?] (http://StackOverflow.com/Q/31947256/608639), [Mit Java zu entschlüsseln OpenSSL AES-256-CBC mit den bereitgestellten Schlüssel und iv] (http: // stackoverflow.com/q/15594518/608639) usw. – jww

Antwort

1

Nein, file.key den Schlüssel nicht enthalten. openssl enc -kfile liest ein Passwort das ist nicht der Schlüssel, aber der Schlüssel und auch IV (wenn zutreffend, und es ist hier) verwendet wird; Siehe die man-Seite. Diese Schlüsselableitung verwendet standardmäßig zufälliges Salz und seit 2016-08 hängt der Standard-Hash von der OpenSSL-Version ab, die Sie nicht angegeben haben. Auch Cipher.getInstance("AES") in Java standardmäßig ECB nicht CBC wie Sie benötigen. (Es ist auch standardmäßig ‚PKCS5‘ padding, die OpenSSL überein, obwohl technisch sollte es PKCS7 nicht PKCS5 genannt werden.)

Um die PBKDF in Java entspricht (und damit Schlüssel und IV), die von openssl enc können Sie entweder Verwenden Sie BouncyCastle oder Code das Äquivalent von OpenSSL EVP_BytesToKey; siehe Betrogene oder in der Nähe von Duplikaten Qs:
Java equivalent of an OpenSSL AES CBC encryption
How to decode a string encoded with openssl aes-128-cbc using java?
How to decrypt AES encrypted file with '-nosalt' param
How to decrypt file in Java encrypted with openssl command using AES?
und mein Versuch an den kanonischen https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/#35614

Verwandte Themen