Как я могу расшифровать OpenSSL в Java? - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно расшифровать зашифрованный файл openssl в Java, передав ключ.

Ранее я проверял по приведенной ниже ссылке, но она не включает явную передачу ключевых параметров и читает файл построчно. Как расшифровать файл на Java, зашифрованный командой openssl с использованием AES?

Иными словами, мои файлы шифруются как целое, а не как строковое шифрование, и у меня есть явный ключ для расшифровки файла.

Другая проблема заключается в том, что размер моего файла настолько велик, и я не уверен в наилучшем способе сохранения файла в памяти в целом на первом этапе.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Мне нужно расшифровать зашифрованный файл openssl в Java, передав ключ.

openssl enc -d -aes-256-cbc -in myfile.csv.enc -out myoutputfile.csv -pass key.bin

Здесь вы предоставляете файл пароля, а не ключ. Ключ и IV вычисляются из пароля и случайной соли.

`openssl enc -K e849fb4e3779791a3ffe9f576b086bdf -iv 23acf784ff126ab52c90d15fd7ecb921 -e -aes-128-cbc -in notes.txt -out notes.enc` В отличие от примера, где ключ шифрования и IV вычисляются из пароля (и случайной соли), предоставляя явно ключ и IV, сохраненные данные представляют собой необработанные зашифрованные данные (без чего-либо) с добавлением.

Иными словами, мои файлы шифруются как целое, а не как строковое шифрование, и у меня есть явный ключ для расшифровки файла.

        Cipher cipher = Cipher.getInstance("AES/CBC/Pkcs5Padding");
        byte[] passwordBytes = readPasswordBytes();
        InputStream in = new BufferedInputStream(new FileInputStream("notes.enc"));
        byte[] saltedString = new byte[8];
        in.read(saltedString); // read the "Salted__" prefix
        byte[] salt         = new byte[8];
        in.read(salt);
        // see the EVP_BytesToKey and parameters from the linked question
        byte[][] keyAndIv = EVP_BytesToKey(
                KEY_SIZE_BITS / Byte.SIZE,
                cipher.getBlockSize(),
                md5,
                salt,
                passwordBytes,
                ITERATIONS);
        byte[] key = keyAndIv[0];
        byte[] iv  = keyAndIv[1];

        SecretKeySpec secKeySpec = new SecretKeySpec(key, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, secKeySpec, ivSpec);

        // here we will use 4kB buffer to read and decrypt data
        byte[] buffer = new byte[4096];

        OutputStream out = new BufferedOutputStream(new FileOutputStream("notes2.txt"));
        for(int readBytes = in.read(buffer); readBytes>-1; readBytes = in.read(buffer)) {
            byte[] decrypted = cipher.update(buffer, 0, readBytes);
            out.write(decrypted);
        }
        byte[] decrypted = cipher.doFinal();
        out.write(decrypted);
        out.flush();
        out.close();
        in.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...