我如何在Java中解密openssl?

时间:2018-08-27 11:21:31

标签: java encryption openssl

我需要通过传递密钥来解密Java中的openssl加密文件。

我之前已经从下面的链接中进行了检查,但是它不包括显式键参数传递,并且逐行读取文件。 How to decrypt file in Java encrypted with openssl command using AES?

与众不同的是,我的文件是整体加密的,而不是行加密的,并且我有一个显式密钥来解密文件。

另一个问题是我的文件太大,因此我不确定第一步中将文件整体保存在内存中的最佳方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

  

我需要通过传递密钥来解密Java中的openssl加密文件。

     

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();