2012-08-12 3 views
6

작은 크기 (1MB 미만)와 큰 크기 (약 500MB)의 파일을 암호화해야하는 응용 프로그램을 개발 중입니다.
어떻게 파일을 암호화하고 암호화 된 버전을 디스크의 어딘가에 효과적으로 저장할 수 있습니까?
시간이 걸리면 암호화 진행이 가능합니까?Java에서 AES를 사용하여 파일을 효과적으로 암호화하는 방법

+0

당신이 얼마나 보안이 필요합니까 :

이의 예

이 질문에서 언급? 일반적으로 암호화가 약할수록 빠를 것이고 반대의 경우도 마찬가지입니다. –

+1

'BouncyCastel' API를 사용할 수 있습니다. –

+0

@NoxHarmonium : 어떻게 측정해야합니까? ;-) 파일은 가능한 한 안전해야합니다. 나는 암호화가 느리다는 것에 신경 쓰지 않는다. 단지 그것이 가능한 최대 속도로 작동하기를 바랄 뿐이다. (나는'java.io'와'java.nio'를 사용하는 파일 복사와 같은 것을 의미합니다) – RYN

답변

6

AES 키와 일부 출력 스트림이 있다고 가정하면 다음과 같이 스트림에 암호화 데코레이터를 추가 할 수 있습니다.

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
enc.init(Cipher.ENCRYPT_MODE, key); 
AlgorithmParameters params = enc.getParameters(); 
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class); 
out.write(iv.getIV()); 
out = new CipherOutputStream(enc, out); 

이렇게하면 IV가 암호 텍스트의 시작 부분에 추가됩니다. 암호를 해독 할 때 암호화를 초기화하려면 해 당 암호를 파싱해야합니다.

더 나은 해결책은 장기적으로 S/MIME의 기반 인 Cryptographic Message Syntax를 구현하는 라이브러리를 사용하는 것입니다. 여기에는 암호 해독에 사용할 수있는 알고리즘 및 키에 대한 메타 데이터가 기록됩니다.

공급자가 구현할 경우 GCM 또는 CCM과 같은 AEAD 모드를 권장합니다. (SunJCE는 그렇지 않습니다.) 이것들은 파일이 올바르게 복호화되어 파손되어 있지 않은 것을 검증합니다.

+0

@owlstead GCM에 대한 API가 있으며 현재 SunJCE에서 제공하고 있음을 알고 있습니다. 그러나 확인하기 위해이 설명서에 대한 설명을 찾을 수 없습니다. (http://docs.oracle.com/) com/javase/7/docs/technotes/guides/security/SunProviders.html) 오라클이 포함 된 JCE 제공 업체를 통해 제공하겠다는 약속을 알고 있습니까? – erickson

+1

죄송합니다. 아마도 비표준 경로를 사용했을 것입니다. 소스로부터 : "JDK 7에서 이미 Java SE는 AEAD/GCM 인터페이스를 정의했습니다. JDK 8에서 JCA/JCE 제공자는 이러한 AEAD/GCM 인터페이스를 구현할 것이며 PKCS11에 대한 추가 메커니즘을 추가 할 것입니다. 현재의 PKCS11 표준이 지원합니다. * " –

+0

물론 Bouncy Castle API에는 GCM 모드를 구현하는 구현이 포함되어 있습니다. 내 스탠포드 대학 암호 클래스를 끝내고 난 후 공급자에게 그것을 구축하려고 노력할 것입니다. –

2

Bhavik이 위에서 언급했듯이 BouncyCastle은 가볍고 성숙한 좋은 방법입니다. 한 번에 읽고 쓸 수있는 양을 제어 할 수 있으므로 암호화 진행 상황을 확실히 볼 수 있습니다. 파일에서 바이트를 읽고, 암호화하고 파이프 라인의 다른 파일에 다시 쓸 수 있습니다. How to encrypt a string/stream with bouncycastle pgp without starting with a file

관련 문제