Heim > Java > javaLernprogramm > Wie entschlüssele ich eine mit OpenSSLs AES-256-CBC in Java verschlüsselte Datei?

Wie entschlüssele ich eine mit OpenSSLs AES-256-CBC in Java verschlüsselte Datei?

Patricia Arquette
Freigeben: 2024-12-14 04:44:09
Original
544 Leute haben es durchsucht

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

Entschlüsseln einer mit dem AES-256-CBC-Algorithmus von OpenSSL in Java verschlüsselten Datei

Problembeschreibung

So entschlüsseln Sie eine mit dem OpenSSL-Befehl verschlüsselte Datei:

openssl aes-256-cbc -a -salt -in password.txt -out password.txt.enc
mypass
mypass
Nach dem Login kopieren

OpenSSL-Verschlüsselung Prozess

OpenSSL verwendet normalerweise eine bestimmte passwortbasierte Schlüsselableitungsmethode (EVP_BytesToKey) und kodiert den Chiffretext mit Base64. Der Pseudocode für den Prozess lautet wie folgt:

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))
Nach dem Login kopieren

Und der Entschlüsselungsprozess ist:

(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)
Nach dem Login kopieren

Java-Implementierung

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)
        }
    }
}
Nach dem Login kopieren

Überlegungen

  • Der Code geht von ASCII als Zeichensatz aus, der je nach Bedarf möglicherweise angepasst werden muss Anforderungen.
  • Für erhöhte Sicherheit wird die Verwendung einer benutzerdefinierten PBKDF2-Implementierung empfohlen.
  • Die Auswahl des MD5-Digests im Code sollte durch SHA-256 ersetzt oder in OpenSSL-Befehlen explizit angegeben werden Vermeiden Sie Kompatibilitätsprobleme.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage