首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenSSL DigestInit_ex

OpenSSL DigestInit_ex
EN

Stack Overflow用户
提问于 2016-02-16 11:34:20
回答 1查看 517关注 0票数 1

我正在用OpenSSL解密传入的数据包,我使用EVP库来完成这项工作,我首先解密数据包,然后计算hmac。

代码语言:javascript
复制
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_DecryptUpdate(ctx, payload, &len, payload, data_len);
EVP_DecryptFinal_ex(ctx, payload + len, &len);

还有HMAC

代码语言:javascript
复制
EVP_PKEY *skey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, hmac_key, 32);
EVP_DigestInit_ex(md_ctx, EVP_sha256(), NULL);
EVP_DigestSignInit(md_ctx, NULL, md, NULL, skey);
EVP_DigestSignUpdate(md_ctx, hmac_payload, m+13);
EVP_DigestSignFinal(md_ctx, buff, &size);

现在,这很好,但问题是每次我解密和计算HMAC之前都要调用init函数,因为每个数据包都有相同的解密和HMAC密钥,这是不有效的。

是否有可能对每个密钥相同的数据包进行解密和hmac计算,而不每次调用init函数?显然,如果我从代码中删除它们,解密和HMAC计算就不能正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-16 20:19:25

不,用OpenSSL实现是不可能的。

在OpenSSL术语中,像EVP_CIPHER_CTXEVP_MD_CTX这样的“上下文”是one加密/解密操作或one摘要所需的所有状态的容器。若要重置下一次加密/解密的上下文或摘要(从而清除所有以前的状态),对EVP_DigestInit_ex()EVP_DecryptInit_ex()的调用是必要的。

另一种看待这一点的方法是,您(程序员)可能在每个EVP_DigestInit_ex()EVP_DecryptInit_ex()调用上更改密码/摘要算法或其他参数;底层上下文不知道您的意图。因此,每次调用初始化函数以重用该上下文结构时,都会为这些初始化参数(下一次可能会有所不同)准备该结构。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35431483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档