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
Release: 2024-12-14 04:44:09
Original
542 people have browsed it

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
Copy after login

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))
Copy after login

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)
Copy after login

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)
        }
    }
}
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template