消息认证码(MAC)

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

posted @ 2020-05-20 22:51  SjYu  阅读(2027)  评论(0编辑  收藏  举报