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:
函式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位元組。
相關文章
- Svm演算法原理及實現演算法
- CRC演算法原理、推導及實現演算法
- 蟻群演算法原理及Matlab實現演算法Matlab
- kmp演算法實現原理及簡單示例KMP演算法
- CRC原理及實現
- AOP如何實現及實現原理
- 常見排序演算法原理及JS程式碼實現排序演算法JS
- 令牌桶演算法原理及實現(圖文詳解)演算法
- Promise原理探究及實現Promise
- KVO使用及實現原理
- 面試必備:八種排序演算法原理及Java實現面試排序演算法Java
- 一致性hash演算法原理及go實現演算法Go
- 裁剪演算法 - Cohen Sutherland Clipping的原理及Java實現演算法Java
- vue 實現原理及簡單示例實現Vue
- **超詳細的**10種排序演算法原理及 JS 實現排序演算法JS
- DES原理及程式碼實現
- TreeMap原理實現及常用方法
- NNLM原理及Pytorch實現PyTorch
- MapReduce原理及簡單實現
- SpringMVC實現原理及解析SpringMVC
- BloomFilter 原理,實現及優化OOMFilter優化
- LRU cache原理及go實現Go
- Java ArrayDeque工作原理及實現Java
- HTTP 代理原理及實現(2)HTTP
- Java HashMap工作原理及實現JavaHashMap
- 分散式鎖的實現及原理分散式
- 單頁面路由原理及實現路由
- ES6 Promise 及實現原理Promise
- HashMap實現原理及原始碼分析HashMap原始碼
- ARouter原理剖析及手動實現
- JSONP 跨域原理及實現JSON跨域
- simple-mybatis的原理及實現MyBatis
- Butterknife原理分析及自己實現Butternife
- synchronized實現原理及鎖優化synchronized優化
- JavaScript 預解析的原理及實現JavaScript
- java中的鎖及實現原理Java
- 演算法-排序演算法思想及實現演算法排序
- IM敏感詞演算法原理和實現演算法