C OpenSSL DigestInit_ex

C OpenSSL DigestInit_ex,c,openssl,cryptography,hmac,C,Openssl,Cryptography,Hmac,我用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 +

我用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计算将无法正常工作。

不,这在OpenSSL实现中是不可能的

在OpenSSL术语中,“上下文”如
EVP\u CIPHER\u CTX
EVP\u MD\u CTX
one加密/解密操作或one摘要所需的所有状态的容器。要为下一次加密/解密或摘要重置上下文(从而清除所有以前的状态),必须调用
EVP\u DigestInit\u ex()
EVP\u DecryptInit\u ex()

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

希望这有帮助