函數H作用於它,然後用H輸出的L長度字符串作爲在HMAC中實際使用的密鑰。
一般情況下,推薦的最小密鑰K長度是L長。(與H的輸出數據長度相等)。
我們將定義兩個固定且不同的字符串ipad,opad:
ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times.
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字節。