这是一个非常基本的问题,但EVP和HMAC有什么区别? EVP是一个消息摘要,但它与HMAC生成的有何不同?在OpenSSL中使用HMAC和EVP功能
6
A
回答
5
... EVP和HMAC
之间的区别是什么
EVP_*
功能是一个高层次的接口。 HMAC_*
,AES_*
和朋友是较低级别的基元。您可以使用其中一种,但推荐您使用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略有不同。 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");
低层次的接口将类似于:
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");
1
你需要使用EVP_PKEY_new_mac_key功能,以获得HMAC右键结构。并且不要忘记用EVP_PKEY_free释放它。
相关问题
- 1. MD5 HMAC使用OpenSSL
- 2. 使用openSSL的HMAC-MD5
- 3. openssl hmac使用aes-256-cbc
- 4. Openssl EVP从文件加密和解密
- 5. openssl 0.9.8 EVP EVP_PKEY_CTX未定义
- 6. OpenSSL的HMAC蟒蛇HMAC
- 7. Java Mac HMAC vs C++ OpenSSL hmac
- 8. 解密AES CCM 128,麦克风8位,在C使用OpenSSL EVP
- 9. 使用openssl的EVP API可以使用公钥解密吗
- 10. OpenSSL的EVP是什么意思?
- 11. OpenSSL EVP AES/DES加密实现
- 12. OpenSSL的EVP随机失败解密
- 13. 使用openssl对文件进行加密的问题evp api(aes256cbc)
- 14. HMAC一个结构与openssl
- 15. 在OpenSSL EVP api的EVP_OpenInit()中获取RSA解密错误,C
- 16. 如何验证使用OpenSSL功能
- 17. 如何获得OpenSSL中的HMAC密钥
- 18. 具有FIPS功能的OpenSSL和`make depends`
- 19. 在Java中使用HMAC-Whirlpool
- 20. Python hmac和C#hmac
- 21. 自写HMAC功能,工作不正常
- 22. 关于hmac功能的提示,登录
- 23. 使用AES加密OpenSSL解密输出中的字符无效libcrypto EVP API和FUSE文件系统
- 24. OpenSSL EVP API无碰撞与单向属性MAC
- 25. 如何在功能中使用功能
- 26. 使用SHA384在C中实现HMAC
- 27. 如何在GWT中使用hmac加密
- 28. 在Web应用程序和API中使用HMAC
- 29. 在C++ Builder中使用OpenSSL
- 30. 在D中使用OpenSSL库
您的代码存在主要问题。 '''key'''不是一个'''unsigned char'''数组,它是'''EVP_PKEY'''。此外,还有一些错别字。 – jcoffland
我已经挖掘出如何创建EVP_PKEY(详见http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation) –
如何使用它来计算CMAC? – user489152