>Java >java지도 시간 >AES를 사용하여 Java에서 OpenSSL 암호화 파일을 해독하는 방법은 무엇입니까?

AES를 사용하여 Java에서 OpenSSL 암호화 파일을 해독하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-03 08:42:11164검색

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

AES가 포함된 JAVA를 사용하여 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 모두에서 다이제스트를 명시적으로 지정합니다. 코드입니다.

위 내용은 AES를 사용하여 Java에서 OpenSSL 암호화 파일을 해독하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.