2014-10-06 63 views
1

我正在尝试在非阻塞模式下使用带有SocketChannels的SSLengine。SSLEngine不解密所有的数据

握手做得正确,但是当我尝试读取channelsocket &解密HTTP的帖子,只有标题被解密和身体disapear:

<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 缓存控制:无缓存 的Content-Length:20 内容类型:应用/八位字节流 主机:192.168.XX

????????????????????????????????????这里.//?>.// < ---加密字符

但是当我打印peerAppData解密数据我得到

POST测试HTTP/1.1/ 缓存控制:无缓存 Content-Length:20 Content-Type:application/octet-stream Host:192.168.XX //然后在这里有三个空行。

这是SSlengine的解密问题吗?

谢谢

另外我想补充说,解包方法返回一个OK状态。

+0

'while(num == 0)'?对不起,但所有其他数字有什么不对? – 2014-10-07 00:20:35

+0

while(num == 0)保证我,当退出循环,当且仅当套接字已收到某些东西。 (在我的情况下,套接字能够一起读取,因为信息很小) – user3791570 2014-10-07 13:28:31

+0

是的,但有没有保证它会读取*全部*数据?在一般情况下,我们必须处理下溢情况下的 – 2014-10-07 13:58:23

回答

1

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

除此之外,数据还将包含MAC,因为SSL通常使用MAC-then-encrypt(也称为围绕according to most的错误方式)。

因此,它可能看起来像有数据,即使它只是开销。

+0

是的,你是对的 – user3791570 2014-10-08 14:20:41