2012-09-22 33 views

Trả lời

5

... sự khác biệt giữa EVP và HMAC

là những gì

EVP_* chức năng là một giao diện cấp cao. HMAC_*, AES_* và bạn bè là cấp thấp hơn nguyên thủy. Bạn cũng có thể làm việc, nhưng bạn nên làm việc với các hàm EVP_*. Các thói quen HMAC_* là dựa trên phần mềm và không sử dụng phần cứng.

Chức năng EVP_* sẽ cho phép bạn dễ dàng hoán đổi trong các băm khác nhau và mã cơ bản vẫn giữ nguyên. Và bạn sẽ tận dụng khả năng tăng tốc phần cứng, như AES-NI cho AES-CMAC, nếu có.

Dưới đây là ví dụ về OpenSSL dựa trên https://www.openssl.org/docs/crypto/EVP_DigestInit.html.

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

Hiện tại, và HMAC hơi khác với Hash. HMAC là một băm có khóa, trong khi băm không được khóa. Bạn cũng có thể sử dụng các chức năng EVP_* cho HMAC'ing. Dưới đây là từ trang wiki của 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"); 

Giao diện ở mức độ thấp sẽ trông tương tự như:

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

Có vấn đề lớn với mã của bạn. '' 'key''' không phải là một mảng' '' unsigned char''', nó là '' 'EVP_PKEY'''. Ngoài ra, có một số lỗi chính tả. – jcoffland

+1

Tôi đã tìm hiểu cách tạo EVP_PKEY (tại http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation) –

+0

Cách sử dụng tính năng này để tính toán CMAC ??? – user489152

1

Bạn cần phải sử dụng EVP_PKEY_new_mac_key chức năng để có được cấu trúc quan trọng phù hợp với HMAC. Và đừng quên giải phóng nó bằng EVP_PKEY_free.

Các vấn đề liên quan