繁体   English   中英

我如何在Java中解密openssl?

[英]How could i decrypt openssl in Java?

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

我之前已经从下面的链接中进行了检查,但是它不包括显式键参数传递,并且逐行读取文件。 如何使用AES解密用openssl命令加密的Java文件?

与之不同的是,我的文件是整体加密的,而不是行加密的,我有一个明确的密钥来解密文件。

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

提前致谢。

我需要通过传递密钥来解密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();

暂无
暂无

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

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