我遇到问题,当我使用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
谢谢!
答案 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;
}