1

我有一个问题,当我使用http://slproweb.com/products/Win32OpenSSL.html时,我尝试初始化加密,但总是捕获错误,例如

“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);
}

谢谢!

4

1 回答 1

1

唯一的断言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;
}
于 2012-11-13T15:35:03.110 回答