1

我正在尝试在非阻塞模式下将 SSLengine 与 SocketChannels 一起使用。

握手正确完成,但是当我尝试从 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 测试 HTTP/1.1/ Cache-Control: no-cache Content-Length: 20 Content-Type: application/octet-stream Host: 192.168.XX // 然后这里是三个空行。

这是SSlengine的解密问题吗?

谢谢

我还想添加该 unwrap 方法返回 OK 状态。

4

1 回答 1

1

很可能实际的 POST 内容是空的,除了 2 个空行(如果我没记错的话,标头后面的一行是标准的)。由于PKCS#7 填充,至少 16 字节的数据(一个块,AES 为 16 字节)将至少被加密。

除此之外,数据还将包含MAC ,因为 SSL 通常使用 MAC-then-encrypt (根据大多数情况,也称为错误方式)。

所以看起来可能有数据,即使它只是开销。

于 2014-10-06T19:40:02.030 回答