消息認證碼:帶密碼的Hash (能提取消息的'指紋')
消息認證碼 MAC (Message Authentication Code)是種消息認證技術。

發送方A和接收方B共享密鑰K,若A向B發送消息。則A計算利用C=F(K,M)計算MAC值:然后將原始消息M和C一起發送給接收方。
接收方B對收到的消息M用相同的密鑰進行相同的計算得出新的MAC值C'。並將接收到的C與其計算出的C'進行比較,若相等,則:
(1)接收方可以相信消息未被修改。 如果被修改,Hash值會不等
(2)接收方可以確信消息來自真正的發送方。 K值只有A、B知道,能知道來自誰
F是MAC函數,它利用密鑰和任意長度的消息來生成一個固定長度的短數據塊C。
CBC-MAC
基本思想:
首先,填充數據,形成一串n比特組
其次,使用CBC模式加密這些數據 CBC (cipher block chaining)模式 https://www.cnblogs.com/sjyu/p/12810759.html
對最后的輸出分組進行選擇處理和截斷(如果m<n)形成MAC. (也就是說最后的Mac輸出長度m可能會比明文分塊長度n小)
設n比特數據組D1,D2,…Dq.
則MAC的具體計算過程如下:
1.置I1=D1,計算O1=ek(I1)。
2.對i=2,3,…,q,完成下列計算
Ii⊕Oi-1=Di
Oi=ek(Ii)
3.對Oq進行選擇處理和截斷,獲得m比特MAC.其中ek表示分組密碼的加密函數.
若數據不是加密算法分組長度的整數倍,則需進行消息填充,填充方法有:
方法1:對需要計算MAC的數據的右邊填充若干個或零個“0"比特,以便得到一個比特長度是n的整數倍的數據串。
方法2:對需要計算MAC的數據的右邊先填充一個“1"比特,然后填充若干個或零個“0"比特,以便得到一個比特長度是n的整數倍的數據串。
方法3:首先對需要計算MAC的數據的右邊填充若干個或零個0”比特,以便得到一個比特長度是n的整數倍的數據串:其次,在所到的數據串的左邊填充一個n比特組:該組包含了未進行填充的數據的比特長度的二元表示,其左邊用“0"補齊。
注:如果驗證者不知道數據的長度,則應選用填充方法或3,因為這兩種方法可使驗證者查明所填充的那些“0”比特.
HMAC
HMAC的基本觀點:
使用Hash函數H,K1和K2(K1≠K2)計算MAC=H(K1||H(K2||m)),其中K1和K2由同一個密鑰K導出
HMAC的工作流程如下:
H是一個Hash函數
K表示密鑰
B表示計算消息摘要時消息分塊的字節長度(對MD5和SHA-1是512比特,64字節)
L表示消息摘要按字節計算的長度(對MD5是16字節)
ipad表示0x36重復B次,opad表示0x5重復B次
K可以有不超過B字節的任意長度,但一般建議K的長度不小於L。當使用長度大於B的密鑰時,先用田對密鑰進行雜湊,然后用得出的L字節作為HMC的真正密鑰

計算一個數據“文本”的HMAC的操作如下:
1.在K的后面加上足夠的0以得到B字節的串
2.將上一步得到的B字節串與ipad異或
3.將數據流“文本”接在第2步得到的B字節串后面
4.將H應用於上一步的比特串
5.將第1步所得到的B字節串與opad異或
6.將第4步的消息摘要接在第5步的B字節串后面
7.應用於上一步的比特串
前面的描述可以表述為H((K⊕opad)||H(K⊕ipad||text))
