ホームページ >Java >&#&チュートリアル >Java で AES を使用して OpenSSL 暗号化ファイルを復号化する方法

Java で AES を使用して OpenSSL 暗号化ファイルを復号化する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-12-03 08:42:11164ブラウズ

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 実装

以下は、OpenSSL で暗号化されたファイルを復号化する方法を示す Java コード スニペットです。 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 の両方でダイジェストを明示的に指定します。コード。

以上がJava で AES を使用して OpenSSL 暗号化ファイルを復号化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。