2013-04-30 6 views
1

CIS를 닫아야하기 때문에 문제가 발생합니다 (또는 마지막 16 바이트를 얻지 못합니다). 소켓을 통해 사용하고 있기 때문에 문제가 있습니다.CipherInputStream을 닫는 방법

cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream)); 

(정확하게는 아니지만 구성 방법입니다.)

내가 소켓을 닫을 경우에 따라서, 프로그램이 다음을 사용하려고하고 내가 그것을 위해 예외를 얻을 ...

감사합니다 많이!

+0

가능한 복제본 [어떻게 CipherOutputStream이 암호화를 끝내지 만 기본 스트림을 열어 둘 수 있습니까?] (http://stackoverflow.com/questions/5449103/how-can-iforce-a-cipheroutputstream-to) -finish-encrypting-but-leave-the-underlyi) – Gamb

+0

npe, 중복이 아니며 문제는 sipherinputstream이 아닌 출력 스트림 – besnico

+1

CIS를 닫으면 마지막 256 바이트를 읽어야합니다. 나중에 그들을 잡아라. 여기서 뭐가 문제 야? – EJP

답변

1

마지막 데이터 블록을 읽으려면 CipherInputStream을 닫을 필요가 없습니다. 그건 아무 의미가 없어요.

CipherInputStream은 최종 암호문 블록의 모든 데이터를 읽었지만 기본 스트림에서 read() 호출로 차단되었습니다. 스트림의 끝 부분을 감지하면 이 update() 대신 암호로 doFinal()을 호출합니다. 일반적으로 소켓이 닫혀 있기 때문에 스트림의 끝에 도달했기 때문에 발생합니다.

소켓을 닫지 않으려면 암호문의 길이를 알아야합니다. 이것은 HTTP 헤더 또는 암호화 된 데이터를 전송하기 위해 작성한 다른 프로토콜에서 가져올 수 있습니다.

합니다 ( skip() 방법에 대해 잊지 마세요) 소비되어 얼마나 많은 바이트를 추적 클래스와 FilterInputStream을 확장하고, 반환 -1 read() 방법에서 암호 텍스트의 지정된 길이가 읽은 경우. 파생 클래스에서 close() 메서드를 재정 의하여 기본 스트림을 닫지 않도록합니다.

+0

매우 철저했지만, 저는 믿지 않습니다. 기술을 이해하고 전략을 숙고 할 필요가 있습니다. 제대로 이해 했음에도 불구하고 확실하게 작동합니다. – besnico

+0

Apache Commons를 보증 할 수는 없지만 [이 기능을 정확히 제공한다고 주장합니다.] http : // commons .apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/BoundedInputStream.html) – erickson

+0

내가 알아야 할 것 같아. – besnico