2012-09-22 76 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釋放它。