2012-05-20 77 views
0

我有一個問題,當我使用http://slproweb.com/products/Win32OpenSSL.html,我嘗試初始化加密,但總是捉像OpenSSL的錯誤「斷言失敗」

錯誤「OpenSSL的斷言失敗,evp_enc.c(282)」

有人可以幫我解決這個問題嗎?

我的代碼:

bool do_encrypt(const char *in, unsigned char *out, int *outlen, unsigned char *key, unsigned char *iv) 
{ 
    int buflen, tmplen; 

    EVP_CIPHER_CTX ctx; 
    EVP_CIPHER_CTX_init(&ctx); 
    EVP_EncryptInit_ex(&ctx, EVP_rc4(), NULL, key, iv); 

    if(!EVP_EncryptUpdate(&ctx, out, &buflen, (unsigned char*)in, strlen(in))) // error here 
    { 
     return false; 
    } 

    if(!EVP_EncryptFinal_ex(&ctx, out + buflen, &tmplen)) 
    { 
     return false; 
    } 

    buflen += tmplen; 
    *outlen = buflen; 
    EVP_CIPHER_CTX_cleanup(&ctx); 

    return true; 
} 

我用key測試{0,1,2,3,4,5,6,7,8,9,10,11,12,13, 14,15},iv爲NULL。

int WINAPI OwnSend(SOCKET s, const char FAR *buff, int len, int flags) 
{ 
    if(s == ServerSocket) 
    { 
     if(len > 0) 
     { 
      int outlen; 
      unsigned char EncryptBuffer[5500]; 
      do_encrypt(buff, EncryptBuffer, &outlen, KeyTest, NULL); 
      buff = (const char *) EncryptBuffer; 
      return pTrampolineSend(s, buff, outlen, flags); 
     } 
    } 
    return pTrampolineSend(s, buff, len, flags); 
} 

感謝:使用上面這個功能

代碼!

+0

哪個調用給出錯誤? – stark

+0

我更新了第一篇文章(「//錯誤在這裏」)。如果(!EVP_EncryptUpdate(&ctx,out,&buflen,(unsigned char *)in,strlen(in))) – Roman

回答

0

EVP_EncryptUpdate中的唯一斷言是聲明緩衝區長度小於或等於加密算法的塊大小的斷言。

與其說strlen(in)作爲輸入的大小,儘量循環EVP_EncryptUpdate並在每次經過時,請務必將限制輸入的大小:

int in_size_limit = EVP_CIPHER_CTX_block_size(&ctx); 

雖然循環,一定要增加偏移第二個和第四個參數的字節數由你已經加密的字節數決定:

if (EVP_EncryptUpdate(&ctx, 
         out+encrypted_bytes, 
         &bytes_encrypted_this_call, 
         in+encrypted_bytes, 
         in_size_limit) != 1) 
{ 
    /* error */ 
} 
else 
{ 
    encrypted_bytes += bytes_encrypted_this_call; 
}