2014-10-06 4 views
1

Я пытаюсь использовать SSLengine с SocketChannels в неблокирующем режиме.SSLEngine не расшифровывает все данные

Рукопожатие сделано правильно, но когда я пытаюсь читать & расшифровывать HTTP сообщение от channelsocket, только заголовки расшифрованы и 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 Cache-Control: нет кэша Content-Length: 20 Content-Type: применение/октет-поток Ведущий: 192.168.xx

?> .//?> .//?> .//?> .//?> .//?> .//?> .//?> .//?> .//?> .//?>.// < --- шифрованные символы здесь

но когда я напечатать расшифрованные данные в peerAppData я получаю

POST тест HTTP/1.1/ Cache-Control: нет кэша Content-Length: 20 Content-Type: application/octet-stream Host: 192.168.XX // а затем три пустые строки здесь.

это проблема дешифрования с помощью SSlengine ??

Благодаря

Также я хотел бы добавить, что метод разворачивать возвращает статус OK.

+0

'while (num == 0)'? Извините, но что случилось со всеми остальными номерами? –

+0

while (num == 0) guarrante me, что цикл будет выходить, если и только если сокет получил что-то. (в моем случае сокет может читать все вместе, так как сообщение мало) – user3791570

+0

Да, но есть ли гарантия, что он будет читать * все * данные? –

ответ

1

Вполне возможно, что фактическое содержимое POST было пустым, за исключением двух пустых строк (одна строка является стандартной после заголовка, если я не ошибаюсь). Из-за PKCS#7 padding не менее 16 байт данных (один блок, 16 байт для AES) будут зашифрованы как минимум.

Кроме того, данные также будут содержать MAC, поскольку SSL обычно использует MAC-then-encrypt (также известный как неправильный путь according to most).

Так что может показаться, что есть данные, даже если это просто накладные расходы.

+0

yep your right – user3791570