我正在用OpenSSL解密传入的数据包,我使用EVP库来完成这项工作,我首先解密数据包,然后计算hmac。
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
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计算就不能正常工作。
发布于 2016-02-16 20:19:25
不,用OpenSSL实现是不可能的。
在OpenSSL术语中,像EVP_CIPHER_CTX或EVP_MD_CTX这样的“上下文”是one加密/解密操作或one摘要所需的所有状态的容器。若要重置下一次加密/解密的上下文或摘要(从而清除所有以前的状态),对EVP_DigestInit_ex()和EVP_DecryptInit_ex()的调用是必要的。
另一种看待这一点的方法是,您(程序员)可能在每个EVP_DigestInit_ex()或EVP_DecryptInit_ex()调用上更改密码/摘要算法或其他参数;底层上下文不知道您的意图。因此,每次调用初始化函数以重用该上下文结构时,都会为这些初始化参数(下一次可能会有所不同)准备该结构。
希望这能有所帮助!
https://stackoverflow.com/questions/35431483
复制相似问题