2012-10-14 1 views
1

사람이이 점진적으로 고정 된 크기의 연속 체인을 채우기 위해 javax.crypto.Cipher에 클래스를 사용하는 것이 가능할 수 있는지 알고 있나요 임의의 양의 암호화 된 데이터가있는 ByteBuffers (풀링 된 버퍼)? 다른 중개 버퍼 배열을 채우지 않고 &을 할당하지 않으면, 즉. 나의 특별한 경우에 대한 암호화는 CBC 모드에서 AES입니다.출력 유연성, 다시 : 고정 된 크기의 ByteBuffer의이

나는 CharsetEncoder의 encode (CharBuffer 입력, ByteBuffer 출력, 부울 endOfInput) 메서드와 비슷한 것을 기대했는데, 주어진 제한값을 작성하고 출력 사이를 전환하는 기능을 포함하여 출력 작성에 대한 충분한 양의 제어가 가능했다. 필요에 따라 버퍼. 액면

는이 암호의 업데이트 (ByteBuffer를 입력, ByteBuffer를 출력) 입력의 제한이 종래 예 전화로 설정되어 방법을 사용하여 달성 될 수있는 것으로 생각된다. 출력 버퍼의 용량 초과를 피하십시오. 비록 API 문서를 올바르게 이해하고 있다면 Cipher 구현은이 메서드 호출 사이에 암호화 된 데이터를 버퍼링 할 수 있으므로 update() 또는 doFinal()을 한 번 호출하면 ByteBuffer가 더 큰 용량으로 출력해야 할 수 있습니다. 풀에서 고정 크기 버퍼에서 사용할 수 있습니다. 이 경우, 두 방법 용 문서에있어서

output.remaining 경우() 버퍼가 결과를 보유하기에 충분하다하는 ShortBufferException가 발생된다. 이 경우 큰 출력 버퍼로이 호출을 반복하십시오. getOutputSize를 사용하여 출력 버퍼의 크기를 결정하십시오.

이 문제를 해결할 수있는 방법이 있는지 아는 사람이 있습니까? 아마도 update() 호출간에 암호화 된 데이터를 플러시하여 과도한 버퍼 누적을 방지하는 몇 가지 방법이있을 수 있습니다. 나는 아직 CipherOutputStream을 시도하는 길을 걷지 않았다. 다시 한 번 중요한 목표는 중개 바이트 배열을 할당/채우지 않고 고정 된 크기의 ByteBuffers 시리즈에 암호화 된 데이터를 직접 채우는 것입니다.

+0

아마도이 코드는 누군가를 도울 것입니다. http://www.itcsolutions.eu/wp-content/uploads/2011/08/BouncyCastleProvider_AES_CBC.java.txt – ed22

답변

0

:

내가했다, 그러나 그것은 단지 하나 개의 출력 버퍼를 사용하는 대신 고정 체인 사이를 전환하고, ByteBuffer를 채울 암호의 update(ByteBuffer input, ByteBuffer output) 방법을 사용하게 길이의 것들. Docs가 제안했듯이 (그리고이 메소드를 피하려고 시도한만큼) getOutputSize()를 호출하여 다음 update() 호출의 출력 크기에 대한 상한을 얻었고 필요에 따라 새 버퍼가 할당되었습니다.

CipherOutputStream 및 flush() 메소드를 사용하거나 사용하지 않고 Cipher 출력에 대해 가질 수있는 제어의 한계가 있습니다. 예를 들어, 처음 15 바이트의 입력이 AES와 같은 128 비트 (16 바이트) 블록 암호로 제출되면 추가 입력이 수신 될 때까지 출력이 항상 보류됩니다.플러시는 암호가 데이터의 블록 크기 이상으로 버퍼링하는 것을 막을 수 있지만 update(ByteBuffer input, ByteBuffer output)을 사용하여 가능한 한 많은 양의 출력을 채우고 다음 호출의 나머지 출력을 보류하려면 운이 좋지 않습니다. - 바이트를 처리하는 데 필요한 자신의 중개자 '오버플로'버퍼를 제공해야합니다. 그것은 가능하지만 조금 지저분합니다.

0

데이터가 임의 인 경우 왜 암호화해야합니까? 그냥 임의의 데이터를 생성하고 바이트 배열로 피드. 암호화 보안을 위해서는 SecureRandom과 같은 암호 품질의 RNG 만 사용하십시오. 원하는만큼의 바이트를 생성하는 데 사용할 수 있습니다 (SecureRandom.nextBytes() 참조).

그렇지 않으면 문제에 대한 해결책을 이미 언급 한 것 같습니다 : CipherOutputStream. 비슷한 요구를 조사하고 끝나는 사람의 이익을 위해

+0

미안하지만 말문이 잘못되었습니다. '임의의 양의 암호화 된 데이터' . 감사! 그래, 나는 CipherOutputStream으로 끝날 수도 있고, 필요에 따라 크기가 조정되고 복사 된 ByteBuffers를 도용 할 수도있다. 우리는 볼 것이다 .. 또한 아직 투표 할 수 없다. 미안하다. 충분한 담당자가 아니다. –