【问题标题】:OpenSSL error "assertion failed"OpenSSL 错误“断言失败”
【发布时间】:2013-01-12 00:19:01
【问题描述】:

我有一个问题,当我使用 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);
}

谢谢!

【问题讨论】:

  • 哪个调用给出了错误?
  • 我更新了第一篇文章("//error here")。 if(!EVP_EncryptUpdate(&ctx, out, &buflen, (unsigned char*)in, strlen(in)))

标签: c++ encryption openssl


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2012-11-28
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2017-07-14
    相关资源
    最近更新 更多