简体   繁体   English

我如何在Java中解密openssl?

[英]How could i decrypt openssl in Java?

I need to decrypt openssl encrypted file in Java by passing key. 我需要通过传递密钥来解密Java中的openssl加密文件。

I have previously checked from the below link, but it does not include explicit key parameter passing and reads file line by line. 我之前已经从下面的链接中进行了检查,但是它不包括显式键参数传递,并且逐行读取文件。 How to decrypt file in Java encrypted with openssl command using AES? 如何使用AES解密用openssl命令加密的Java文件?

As differently, my files encrypted as a whole rather than line encryption and I have an explicit key to decrypt the file. 与之不同的是,我的文件是整体加密的,而不是行加密的,我有一个明确的密钥来解密文件。

The other issue is my file size is so big and I am not sure about the best method of saving the file in memory as a whole in the first step. 另一个问题是我的文件太大,我不确定第一步中将文件整体保存在内存中的最佳方法。

Thanks in advance. 提前致谢。

I need to decrypt openssl encrypted file in Java by passing key. 我需要通过传递密钥来解密Java中的openssl加密文件。

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

Here you provide a password file, not a key. 在这里,您提供密码文件,而不是密钥。 Key and IV are computed from the password and random salt. 根据密码和随机盐计算出密钥和IV。

`openssl enc -K e849fb4e3779791a3ffe9f576b086bdf -iv 23acf784ff126ab52c90d15fd7ecb921 -e -aes-128-cbc -in notes.txt -out notes.enc` Unlike the example, where the encryption key and IV are computed from the password (and random salt), providing explicitly key and IV the data stored are raw encrypted data (with nothing) prepended. `openssl enc -K e849fb4e3779791a3ffe9f576b086bdf -iv 23acf784ff126ab52c90d15fd7ecb921 -e -aes-128-cbc -in notes.txt -out notes.enc`与示例不同,加密密钥和IV是根据密码(和随机盐)计算出来的显式密钥和IV所存储的数据是未加密的原始加密数据(无内容)。

As differently, my files encrypted as a whole rather than line encryption and I have an explicit key to decrypt the file. 与之不同的是,我的文件是整体加密的,而不是行加密的,我有一个明确的密钥来解密文件。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM