Heim >Java >javaLernprogramm >Wie entschlüssele ich OpenSSL-verschlüsselte Dateien in Java mit AES?

Wie entschlüssele ich OpenSSL-verschlüsselte Dateien in Java mit AES?

Barbara Streisand
Barbara StreisandOriginal
2024-12-03 08:42:11164Durchsuche

How to Decrypt OpenSSL-Encrypted Files in Java using AES?

OpenSSL-verschlüsselte Dateien mit JAVA mit AES entschlüsseln

Unter UNIX können Sie Dateien mit dem folgenden OpenSSL-Befehl verschlüsseln:

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

Um diese Datei in JAVA zu entschlüsseln, können Sie den genauen UNIX-Befehl nicht replizieren. Stattdessen müssen Sie einen anderen, aber funktionalen Ansatz zur Entschlüsselung verfolgen.

JAVA-Implementierung

Unten finden Sie einen Java-Codeausschnitt, der zeigt, wie eine mit OpenSSL verschlüsselte Datei entschlüsselt wird AES:

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) {
        ...
        // Parse command-line arguments
        File f = new File(args[ARG_INDEX_FILENAME]);

        // Read and decode base 64 encoded file
        String dataBase64 = new String(Files.readAllBytes(f.toPath()), ASCII);
        byte[] headerSaltAndCipherText = Base64.decode(dataBase64);

        ...

        // Decrypt the file using the provided password and encryption parameters
        byte[] decrypted = aesCBC.doFinal(encrypted);

        // Convert decrypted bytes to a string and print the result
        String answer = new String(decrypted, ASCII);
        System.out.println(answer);
    }
}

Dieser Code nutzt die EVP_BytesToKey-Methode, um Verschlüsselungsschlüssel abzuleiten und Initialisierungsvektoren (IVs) basierend auf dem angegebenen Passwort. Die Cipher-Klasse wird dann verwendet, um die AES-Entschlüsselung mit CBC-Modus und PKCS5-Padding durchzuführen.

Zusätzliche Hinweise

  • Vorsicht bei Zeichensätzen: Stellen Sie sicher, dass der Code denselben Zeichensatz verwendet, der im OpenSSL-Befehl angegeben ist (in diesem Fall ASCII). Fall).
  • Erwägen Sie NIST-zugelassenes PBKDF2: Es ist sicherer als die standardmäßige OpenSSL-Passwortableitungsmethode.
  • Achten Sie auf Änderungen des Digest-Algorithmus : OpenSSL-Versionen verwenden möglicherweise unterschiedliche Digest-Algorithmen. Geben Sie den Digest daher explizit sowohl in der Befehlszeilenschnittstelle als auch in Java an Code.

Das obige ist der detaillierte Inhalt vonWie entschlüssele ich OpenSSL-verschlüsselte Dateien in Java mit AES?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn