> Java > java지도 시간 > Java에서 OpenSSL의 AES-256-CBC로 암호화된 파일을 해독하는 방법은 무엇입니까?

Java에서 OpenSSL의 AES-256-CBC로 암호화된 파일을 해독하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-14 04:44:09
원래의
545명이 탐색했습니다.

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

Java에서 OpenSSL의 AES-256-CBC 알고리즘으로 암호화된 파일 해독

문제 설명

OpenSSL 명령을 사용하여 암호화된 파일을 해독하려면:

openssl aes-256-cbc -a -salt -in password.txt -out password.txt.enc
mypass
mypass
로그인 후 복사

OpenSSL 암호화 프로세스

OpenSSL은 일반적으로 특정 비밀번호 기반 키 파생 방법(EVP_BytesToKey)을 사용하고 암호문을 base64로 인코딩합니다. 프로세스의 의사 코드는 다음과 같습니다.

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))
로그인 후 복사

복호화 프로세스는 다음과 같습니다.

(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)
로그인 후 복사

Java 구현

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)
        }
    }
}
로그인 후 복사

고려 사항

  • 코드는 ASCII를 문자 집합으로 가정하며 특정 상황에 따라 조정해야 할 수도 있습니다. 요구 사항.
  • 보안 강화를 위해 사용자 정의 PBKDF2 구현을 사용하는 것이 좋습니다.
  • 코드에서 선택한 MD5 다이제스트를 SHA-256으로 바꾸거나 OpenSSL 명령에 명시적으로 지정해야 합니다. 호환성 문제를 방지하세요.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿