Rumah >Java >javaTutorial >Bagaimana untuk Menyahsulit Fail Tersulit OpenSSL di Java menggunakan AES?

Bagaimana untuk Menyahsulit Fail Tersulit OpenSSL di Java menggunakan AES?

Barbara Streisand
Barbara Streisandasal
2024-12-03 08:42:11193semak imbas

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

Menyahsulit Fail Disulitkan OpenSSL menggunakan JAVA dengan AES

Dalam UNIX, anda boleh menyulitkan fail menggunakan arahan OpenSSL berikut:

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

Untuk menyahsulit fail ini dalam JAVA, anda tidak boleh meniru arahan UNIX yang tepat. Sebaliknya, anda mesti mengikut pendekatan yang berbeza tetapi berfungsi untuk penyahsulitan.

Pelaksanaan JAVA

Di bawah ialah coretan kod Java yang menunjukkan cara untuk menyahsulit fail disulitkan OpenSSL menggunakan 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);
    }
}

Kod ini memanfaatkan kaedah EVP_BytesToKey untuk memperoleh kunci penyulitan dan vektor permulaan (IV) berdasarkan kata laluan yang diberikan. Kelas Cipher kemudiannya digunakan untuk melakukan penyahsulitan AES dengan mod CBC dan padding PKCS5.

Nota Tambahan

  • Berhati-hati dengan set aksara: Pastikan kod menggunakan set aksara yang sama yang dinyatakan dalam arahan OpenSSL (ASCII dalam ini case).
  • Pertimbangkan PBKDF2 yang diluluskan NIST: Ia lebih selamat daripada kaedah terbitan kata laluan OpenSSL lalai.
  • Berhati-hati dengan perubahan algoritma ringkasan : Versi OpenSSL mungkin menggunakan algoritma ringkasan yang berbeza, jadi tentukan ringkasan secara eksplisit dalam kedua-dua antara muka baris arahan dan Java kod.

Atas ialah kandungan terperinci Bagaimana untuk Menyahsulit Fail Tersulit OpenSSL di Java menggunakan AES?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn