首頁 >Java >java教程 >如何使用 AES 在 Java 中解密 OpenSSL 加密的檔案?

如何使用 AES 在 Java 中解密 OpenSSL 加密的檔案?

Barbara Streisand
Barbara Streisand原創
2024-12-03 08:42:11192瀏覽

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

使用JAVA 和AES 解密OpenSSL 加密的檔案

在UNIX 中,您可以使用以下OpenSSL 指令加密檔案:

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

要在JAVA 中解密此文件,您無法複製確切的UNIX命令。相反,您必須遵循不同但實用的解密方法。

JAVA 實作

下面是一個Java 程式碼片段,示範如何使用解密OpenSSL 加密的檔案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);
    }
}
此程式碼利用EVP_BytesToKey 方法來衍生加密金鑰和初始化向量(IV) 基於給定的密碼。然後使用 Cipher 類別以 CBC 模式和 PKCS5 填充執行 AES 解密。

附加說明

  • 注意字元集: 確保程式碼使用OpenSSL 指令中指定的相同字元集(在此為ASCII)
  • 考慮NIST 核准的PBKDF2:它比預設的 OpenSSL 密碼派生方法更安全。
  • 注意摘要演算法的變更 :OpenSSL 版本可能使用不同的摘要演算法,因此請在命令列介面和 Java 中明確指定摘要程式碼。

以上是如何使用 AES 在 Java 中解密 OpenSSL 加密的檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn