gpt4 book ai didi

c - 在 OpenSSL 中使用 HMAC 与 EVP 函数

转载 作者:太空狗 更新时间:2023-10-29 17:23:02 26 4
gpt4 key购买 nike

这是一个很基础的问题,但是EVP和HMAC有什么区别呢? EVP 是消息摘要,但它与 HMAC 生成的内容有何不同?

最佳答案

... what is the difference between EVP and HMAC

EVP_* 函数是一个高级接口(interface)。 HMAC_*AES_* 和 friend 是较低级别的原语。您可以使用其中任何一个,但建议您使用 EVP_* 函数。 HMAC_* 例程是基于软件的,不使用硬件。

EVP_* 函数将允许您轻松地交换不同的哈希值,并且代码基本上保持不变。如果可用,您将利用硬件加速,例如用于 AES-CMAC 的 AES-NI。

这是一个基于 https://www.openssl.org/docs/crypto/EVP_DigestInit.html 的 OpenSSL 示例.

EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;

unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;

char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";

OpenSSL_add_all_digests();

md = EVP_get_digestbyname("SHA1");
mdctx = EVP_MD_CTX_create();

if(!EVP_DigestInit_ex(mdctx, md, NULL))
handleError();

if(!EVP_DigestUpdate(mdctx, message, strlen(message)))
handleError();

if(!EVP_DigestFinal_ex(mdctx, md_value, &md_len))
handleError();

if(!EVP_MD_CTX_destroy(mdctx))
handleError();

printf("Digest is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");

现在,HMAC 与 Hash 略有不同。 HMAC 是键控哈希,而哈希是非键控的。您还可以使用 EVP_* 函数进行 HMAC 处理。以下来自 OpenSSL 的维基页面 EVP Signing and Verifying :

EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
EVP_PKEY *pkey = NULL;

unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;

char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";

OpenSSL_add_all_digests();

if(!(mdctx = EVP_MD_CTX_create()))
handleError();

if(!(md = EVP_get_digestbyname("SHA1")))
handleError();

if(!(pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, "password", strlen("password"))))
handleError();

if(1 != EVP_DigestSignInit(mdctx, NULL, md, NULL, pkey))
handleError();

/* Call update with the message */
if(1 != EVP_DigestSignUpdate(mdctx, message, strlen(message)))
handleError();

if(1 != EVP_DigestSignFinal(mdctx, md_value, &md_len))
handleError();

printf("HMAC is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");

底层接口(interface)类似于:

EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;

unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;

char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";

OpenSSL_add_all_digests();

md = EVP_get_digestbyname("SHA1");
mdctx = EVP_MD_CTX_create();

if(!HMAC_Init_ex(mdctx, key, sizeof(key), md, NULL))
handleError();

if(!HMAC_Update(mdctx, message, strlen(message)))
handleError();

if(!HMAC_Final(mdctx, md_value, &md_len))
handleError();

if(!HMAC_CTX_cleanup(mdctx))
handleError();

printf("HMAC is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");

关于c - 在 OpenSSL 中使用 HMAC 与 EVP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545811/

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