2012-09-22 7 views

答えて

5

...差EVP_*

EVPとHMACの間の機能は、ハイレベルのインターフェースものであるています。 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はキー付きハッシュですが、ハッシュはキー付きではありません。 HMACのためにEVP_*関数を使用することもできます。以下は、OpenSSLののwikiページ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

あなたはHMACのための右のキー構造を得るためにEVP_PKEY_new_mac_key機能を使用する必要があります。 EVP_PKEY_freeでそれを解放することを忘れないでください。

関連する問題