2012-09-22 77 views

回答

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"); 
+0

您的代码存在主要问题。 '''key'''不是一个'''unsigned char'''数组,它是'''EVP_PKEY'''。此外,还有一些错别字。 – jcoffland

+1

我已经挖掘出如何创建EVP_PKEY(详见http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation) –

+0

如何使用它来计算CMAC? – user489152

1

你需要使用EVP_PKEY_new_mac_key功能,以获得HMAC右键结构。并且不要忘记用EVP_PKEY_free释放它。