我正在使用这个解密函数来获取使用EVP AES265GCM加密的密码的明文值;我可以在rawOut
中看到数据,但ret = EVP_DecryptFinal_ex(ctx, rawOut, &len);
返回0;您能解释一下原因吗?我也见过在EVP_DecryptFinal_ex
代码中执行rawOut + len
的源代码,我不确定为什么需要这样做,因为它会将指针移动到缓冲区的末尾。
unsigned char* keyDecrypter(unsigned char* pszMasterKey)
{
ERR_load_crypto_strings();
int ret, len;
EVP_CIPHER_CTX* ctx;
unsigned char* rawOut = new unsigned char[48]; // ToDo Remove Hardcoded Value
Info info = m_header.processKeyInfo();
if (NULL == info.nonce)
return NULL;
if (!(ctx = EVP_CIPHER_CTX_new()))
return NULL;
if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, pszMasterKey, info.nonce))
return NULL;
if (!EVP_DecryptUpdate(ctx, NULL, &len, m_header.aad, m_header.aad_len))
return NULL;
if (!EVP_DecryptUpdate(ctx, rawOut, &len, m_header.encryptedValue, m_header.encryptedValueLen))
return NULL;
// Finalise the decryption. A positive return value indicates success,
// anything else is a failure - the plain text is not trustworthy.
ret = EVP_DecryptFinal_ex(ctx, rawOut, &len);
ERR_print_errors_fp(stderr);
EVP_CIPHER_CTX_free(ctx);
if (ret > 0)
{
return rawOut;
}
else
{
return NULL;
}
}
发布于 2021-06-30 05:56:46
从OpenSSL文档中:
“如果启用了填充并且最后一个块的格式不正确,则EVP_DecryptFinal()将返回错误代码。”
显然,加密和解密之间的填充方案不匹配,或者可能馈送到解密引擎的密文的大小与从加密引擎输出的密文的大小不完全匹配。请注意,密文必须包含对EVP_EncryptFinal_ex的相应调用的结果。
不幸的是,最初的海报没有提供足够的信息来作出确切的决定。
发布于 2018-11-20 22:26:00
您需要将rawOut + len
传递给EVP_DecryptFinal_ex
。请参见documentation末尾的示例中的
/* Buffer passed to EVP_EncryptFinal() must be after data just
* encrypted to avoid overwriting it.
*/
if(!EVP_EncryptFinal_ex(ctx, outbuf + outlen, &tmplen))
{
/* Error */
return 0;
}
outlen += tmplen;
还要注意,rawOut必须有足够的空间来容纳(m_header.aad_len + cipher_block_size)
字节。您可以使用EVP_CIPHER_block_size()
获取块大小。
https://stackoverflow.com/questions/53394102
复制相似问题