2012-05-19 85 views
0

我繞道recv函數,我試圖解密緩衝區,但解密功能改變緩衝區的大小,我認爲decryotion是無效的,代碼:OpenSSL的AES解密改變大小

int WINAPI OwnRecv(SOCKET s, char FAR *buff, int len, int flags) 
{ 
    if(s == GameClientSocket) 
    { 
     int received = pTrampolineRecv(s, buff, len, flags); 

     if(received <= 0) 
     { 
      return received; 
     } 
      // now strlen(buff) is 2!! 
     char * plaintext; 
     plaintext = (char *)aes_decrypt(&Decrypt_Context, (unsigned char*)buff, &received); 
     (char *) buff = plaintext; // now strlen(buff) is 5!! 
     return received; 
    } 
    return pTrampolineRecv(s, buff, len, flags); 
} 

這有什麼錯我的代碼?

謝謝!

+0

在嘗試加密/解密之前,您可能需要練習更多C++或者做一些教程或其他工作。加密庫的問題是,如果你做錯了什麼,你很難弄清楚垃圾 - 像填充差這樣的異常幾乎不會告訴你實際的原因。如果這是一個緩衝區問題,您可能需要永久搜索。 –

回答

0

你忘了執行一個協議!無論您使用哪種協議來加密和解密數據,您都必須實際執行它。它必須定義塊大小,填充等等。它不會只靠魔法工作。 (請注意,使用流密碼將使比使用分組密碼更容易這

另外,不要在任意的二進制數據呼叫strlenstrlen函數僅適用於C風格的字符串。

而且,這行代碼不會做你認爲它的作用:

(char *) buff = plaintext; // now strlen(buff) is 5!! 

改變的buff值,即具有指向緩衝區中的變量,對內容沒有影響緩衝區。這是所有來電者關心的。