I need to decrypt openssl encrypted file in Java by passing key.
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.
`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.
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();