消息认证码:带密码的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))