OpenSSL错误“断言失败”

时间:2012-05-20 10:27:23

标签: c++ encryption openssl

我遇到问题,当我使用http://slproweb.com/products/Win32OpenSSL.html时,我尝试使用Init Encryption,但总是遇到错误,如

  

“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},{{1} }是NULL。

使用上述功能的代码:

iv

谢谢!

1 个答案:

答案 0 :(得分:0)

EVP_EncryptUpdate中唯一的断言是断言缓冲区长度小于或等于加密算法的块大小。

不要将strlen(in)称为输入大小,而是尝试循环EVP_EncryptUpdate,每次执行时,请务必使用以下内容限制输入大小:

int in_size_limit = EVP_CIPHER_CTX_block_size(&ctx);

循环时,一定要将第2和第4个参数的偏移量增加你已经加密的字节数:

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