Расшифровка Java зашифрованного файла с помощью openssl aes 256 cbc

Несколько дней пытаюсь расшифровать на java сообщение, зашифрованное с помощью openssl. Сообщение было зашифровано с помощью следующей команды:

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

Файл file.key содержит симметричный ключ длиной 256 бит. В команде не указана соль, но файл начинается с Salted__. Вот класс, который я написал, чтобы попытаться расшифровать файл, но невозможно ничего получить, даже удалив 16 символов файла, а именно: Salted__ + зашифрованная соль. Я так понял, что openssl делает это по умолчанию. Когда я пытаюсь расшифровать, выдается исключение в отношении зашифрованного текста.

Кто-нибудь может мне помочь? трек ? идея ?

Большое Вам спасибо.

Код :

  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;
        }
    }

Ошибка :

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)

person Community    schedule 03.04.2017    source источник


Ответы (1)


Нет, file.key не содержит ключа. openssl enc -kfile читает пароль, который НЕ является ключом, но используется для получения ключа, а также IV (если применимо, и он находится здесь); см. справочную страницу. Этот вывод ключа по умолчанию использует случайную соль, а с 2016-08 гг. Хэш по умолчанию зависит от версии OpenSSL, которую вы не указали. Кроме того, Cipher.getInstance("AES") в Java по умолчанию имеет значение ECB, а не CBC, как вам нужно. (Также по умолчанию используется заполнение PKCS5, которое соответствует OpenSSL, хотя технически его следует называть PKCS7, а не PKCS5.)

Чтобы сопоставить в Java PBKDF (и, следовательно, ключ и IV), используемый openssl enc, вы можете либо использовать BouncyCastle, либо кодировать эквивалент OpenSSL EVP_BytesToKey; см. дублирующие или почти дублирующие Qs:
Java-эквивалент OpenSSL Шифрование AES CBC
Как декодировать строку, закодированную с помощью openssl aes-128-cbc, используя java?
Как расшифровать зашифрованный файл AES с параметром '-nosalt'
Как расшифровать файл на Java, зашифрованный с помощью команды openssl, с помощью AES?
и моя попытка канонического https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/#35614

person dave_thompson_085    schedule 03.04.2017