我需要通过传递密钥来解密Java中的openssl加密文件。
我之前已经从下面的链接中进行了检查,但是它不包括显式键参数传递,并且逐行读取文件。 How to decrypt file in Java encrypted with openssl command using AES?
与众不同的是,我的文件是整体加密的,而不是行加密的,并且我有一个显式密钥来解密文件。
另一个问题是我的文件太大,因此我不确定第一步中将文件整体保存在内存中的最佳方法。
谢谢。
答案 0 :(得分:0)
我需要通过传递密钥来解密Java中的openssl加密文件。
openssl enc -d -aes-256-cbc -in myfile.csv.enc -out myoutputfile.csv -pass key.bin
此处提供的是密码文件,而不是密钥。密钥和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();