1

非ブロック モードで SocketChannels で SSLengine を使用しようとしています。

ハンドシェイクは正しく行われますが、channelsocket から http 投稿を読み取って復号化しようとすると、ヘッダーのみが復号化され、本文が消えます。

<code>
int num=0;

            while(num==0){
                num=socketChannel.read(peerNetData);
                if(num==-1)
                    break;
            }

            if (num == -1) {
                System.out.println("channel closed");
            } else if (num == 0) {
                System.out.println("no bytes to read");
            } else {
                // Process incoming data

                peerNetData.flip();

                SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
               //return a ok status 

peerNetData.flip();
            peerAppData.flip();
            System.out.println(new String(peerNetData.array()));  
            System.out.println(new String(peerAppData.array()));  


</code>

暗号化されたデータを peerNetData で印刷すると、次のようになります。

?>.//POST テスト HTTP/1.1 Cache-Control: no-cache Content-Length: 20 Content-Type: application/octet-stream Host: 192.168.XX

?>.//?>.//?>.//?>.//?>.//?>.//?>.//?>.//?>.//?>.// ?>.// <--- ここに暗号化された文字

しかし、peerAppDataで復号化されたデータを印刷すると、取得しています

POST test HTTP/1.1/ Cache-Control: no-cache Content-Length: 20 Content-Type: application/octet-stream Host: 192.168.XX // そしてここに 3 つの空行。

これは SSLengine の復号化の問題ですか??

ありがとう

また、unwrap メソッドが OK ステータスを返すように追加したいと思います。

4

1 に答える 1

1

実際の POST コンテンツは、2 つの空の行を除いて空だった可能性があります (私が間違っていなければ、ヘッダーの後の 1 行が標準です)。PKCS#7 パディングにより、少なくとも 16 バイトのデータ (1 ブロック、AES の場合は 16 バイト) が暗号化されます。

それに加えて、SSLは通常MAC-then-encryptを使用するため、データにはMACも含まれます(ほとんどの場合、間違った方法としても知られています)。

そのため、単なるオーバーヘッドであっても、データがあるように見える場合があります。

于 2014-10-06T19:40:02.030 に答える