HMAC-MD5算法原理及實現


以下是分析節選,對於更詳細的描述可以查閱RFC2104文檔。
 
 
HMAC需要一個加密用散列函數(表示為H)和一個密鑰K。
假設H是一個將數據塊用一個基本的迭代壓縮函數來加密的散列函數。
用B來表示數據塊的長。(以上說提到的散列函數的分割數據塊長B=64),用L來表示散列函數的輸出數據長(MD5中L=16,SHA—1中L=20)。
 
 

密鑰的長度可以是小於等於數據塊長的任何正整數值。應用程序中使用的密鑰長度若是比B大,則首先用使用散列 
函數H作用於它,然后用H輸出的L長度字符串作為在HMAC中實際使用的密鑰。

一般情況下,推薦的最小密鑰K長度是L長。(與H的輸出數據長度相等)。 
我們將定義兩個固定且不同的字符串ipad,opad:

ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times.
計算‘text'的HMAC:
H( K XOR opad, H(K XOR ipad, text))
即為以下步驟:


void hmac_md5(char* out, char* data, int dlen, char* key, int klen)
{

(1) 在密鑰key后面添加0來創建一個長為B(64字節)的字符串(str)。

(2) 將上一步生成的字符串(str)與ipad(0x36)做異或運算,形成結果字符串(istr)。 
  
(3) 將數據流data附加到第二步的結果字符串(istr)的末尾。 
  
(4) 做md5運算於第三步生成的數據流(istr)。 
  
(5) 將第一步生成的字符串(str)與opad(0x5c)做異或運算,形成結果字符串(ostr)。
  
(6) 再將第四步的結果(istr)附加到第五步的結果字符串(ostr)的末尾。 
  
(7) 做md5運算於第六步生成的數據流(ostr),輸出最終結果(out)。

}

注:如果第一步中,key的長度klen大於64字節,則先進行md5運算,使其長度klen=16字節。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM