gpt4 book ai didi

c++ - OpenSSL 解密 - EVP_DecryptFinal_ex 失败

转载 作者:行者123 更新时间:2023-11-30 16:25:25 24 4
gpt4 key购买 nike

我正在使用此解密函数来获取使用 EVP AES 265 GCM 加密的密码的纯文本值;我可以在 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;
}
}

最佳答案

来自 OpenSSL 文档:

“如果启用填充并且最终 block 格式不正确,EVP_DecryptFinal() 将返回错误代码。”

显然,加密和解密之间的填充方案不匹配,或者输入解密引擎的密文大小与加密引擎输出的密文大小不完全匹配。请注意,密文必须包含相应调用 EVP_EncryptFinal_ex 的结果。

不幸的是,原始发布者没有提供足够的信息来做出准确的决定。

关于c++ - OpenSSL 解密 - EVP_DecryptFinal_ex 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53394102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com