2012-04-26 6 views
0

어떤 크기의 비밀번호가 주어지면 스트림을 통해 수신되는 파일을 AES으로 암호화하는 방법을 찾고 있습니다. 일을 더 쉽게 시작하려면 파일에 암호화 된 메시지를 작성하려고했습니다. 하지만 문제가 있습니다 :CipherOutputStream + AES를 사용하여 파일에 문자열 쓰기

  1. 어떤 크기의 암호도 정의하고 싶습니다. "표준"형식으로이 작업을 수행 할 수 있습니까 아니면 암호를 2^k 크기로 채워야합니까? 현재 임시 "aaaaaaaaaaaaaaaa"비밀번호를 제공하는 문제를 피하고 있지만 최대한 빨리 문제를 해결하고 싶습니다.
  2. cos에 긴 문자열을 쓰려고하면 암호화 된 내용이 파일에 기록됩니다. 그러나 "abc"와 같이 더 작은 것을 시도하면 아무 것도 쓸 수 없습니다. 나는 여러 패딩 옵션을 가지고 놀았지만 아무 쓸데없는 것 같습니다 (PKCS5Padding, SSL3Padding, NoPadding). 여기

내가 사용하고 코드입니다 :

SecretKeySpec localSecretKeySpec = new SecretKeySpec("aaaaaaaaaaaaaaaa".getBytes(), "AES"); 
    Cipher localCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    localCipher.init(Cipher.ENCRYPT_MODE, localSecretKeySpec); 

    CipherOutputStream cos = new CipherOutputStream(new FileOutputStream("abc"), localCipher); 
    IOUtils.write("abc", cos); 
    cos.flush(); 

답변

4

This answer는 임의의 길이의 암호를 기반으로 키를 생성하는 SecretKeyFactory를 사용하는 방법을 보여줍니다.

두 번째 문제는 cos.flush()으로 마지막 블록을 채우고 암호화하는 것으로 충분하지 않습니다. 이를 위해서는 cos.close()으로 전화해야합니다. Here은이 사실을 설명하는 close() 메서드의 설명서입니다.