Home >Java >javaTutorial >How to Decrypt a File Encrypted with OpenSSL's AES-256-CBC in Java?

How to Decrypt a File Encrypted with OpenSSL's AES-256-CBC in Java?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-14 04:44:09614browse

How to Decrypt a File Encrypted with OpenSSL's AES-256-CBC in Java?

Decrypting a File Encrypted with OpenSSL's AES-256-CBC Algorithm in Java

Problem Statement

To decrypt a file encrypted using the OpenSSL command:

openssl aes-256-cbc -a -salt -in password.txt -out password.txt.enc
mypass
mypass

OpenSSL's Encryption Process

OpenSSL typically employs a specific password-based key derivation method (EVP_BytesToKey) and base64-encodes the ciphertext. The pseudocode for the process is as follows:

salt = random(8)
keyAndIV = BytesToKey(password, salt, 48)
key = keyAndIV[0..31]
iv = keyAndIV[32..47]
ct = AES-256-CBC-encrypt(key, iv, plaintext)
res = base64MimeEncode("Salted__" | salt | ct))

And the decryption process is:

(salt, ct) = base64MimeDecode(res)
keyAndIV = BytesToKey(password, salt, 48)
key = keyAndIV[0..31]
iv = keyAndIV[32..47]
pt = AES-256-CBC-decrypt(key, iv, plaintext)

Java Implementation

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.List;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.util.encoders.Base64;

public class OpenSSLDecryptor {
    private static final Charset ASCII = Charset.forName("ASCII");
    private static final int INDEX_KEY = 0;
    private static final int INDEX_IV = 1;
    private static final int ITERATIONS = 1;

    private static final int ARG_INDEX_FILENAME = 0;
    private static final int ARG_INDEX_PASSWORD = 1;

    private static final int SALT_OFFSET = 8;
    private static final int SALT_SIZE = 8;
    private static final int CIPHERTEXT_OFFSET = SALT_OFFSET + SALT_SIZE;

    private static final int KEY_SIZE_BITS = 256;

    public static void main(String[] args) {
        try {
            // ... (Same code as provided in the reference answer)
        } catch (Exception e) {
            // ... (Same catch blocks as provided in the reference answer)
        }
    }
}

Considerations

  • The code assumes ASCII as the character set, which may need to be adjusted based on specific requirements.
  • The use of a custom PBKDF2 implementation is suggested for enhanced security.
  • The choice of the MD5 digest in the code should be replaced with SHA-256 or explicitly specified in OpenSSL commands to avoid compatibility issues.

The above is the detailed content of How to Decrypt a File Encrypted with OpenSSL's AES-256-CBC in Java?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn