通常,MAC的构造方法主要有两种类型:一种是使用分组密码体制构造MAC;另一种是使用带密钥的Hash函数构造MAC。两者的区别在于前者使用了与Hash函数相同的技术,而后者则直接调用现成的Hash函数。
1.CBC-MAC
利用分组加密体制的密文分组链接模式(CBC)构造MAC函数,其中使用最广泛的是基于DES分组加密体制的数据认证算法(Data Authentication Algorithm,DAA),它在联邦信息处理标准(Federation Information Processing Standard,FIPS)的出版物FIPS PUB 113和ANSI标准X9.17中进行了描述。
数据认证算法构建在DES的CBC模式下,如图8-3所示。在CBC模式中,每个明文分组mi在进入DES加密变换之前,要与前一个密文分组Ci-1进行异或。用一个初始向量IV作为密文分组的初始值C0,C0取值为0,基于DES的CBC-MAC的具体构造过程如下。
1)对消息M进行64bit的长度分组,得到mi(i=1,2,…,L),最后的一个分组若不足64bit,则以0补齐成64bit。
2)采用DES的CBC模式加密分组,密钥K的长度为56bit。
3)抛弃加密的中间结果,只将最后一组密文CL(或最后一组密文CL的左边n(16≤n≤64)bit作为原始消息的MAC。
图8-3 基于DES的CBC-MAC构造
2.HMAC
标准的Hash函数并不依赖于密钥,不能直接作为MAC函数。一般的做法是通过某种方式将密钥和现有的Hash函数结合起来,形成带密钥的Hash函数。目前,MAC的两种构造方法中,以Hash函数为核心构成的带密钥的Hash函数应用要更广泛些,主要是因为:Hash函数的执行速度通常比分组加密算法要快,以Hash函数为核心构造MAC,其效率更高;Hash函数的出口限制没有加密算法严格,因而更容易推广。
HMAC(Keyed-Hashing for Message Authentication Code)由Bellare等人于1996年提出,它就是一种带密钥的Hash函数构造方案,于1997年作为RFC 2104标准发表。HMAC使用不同的Hash函数,可以得到不同的HMAC,例如选用MD5时的HMAC记为HMAC-MD5,选用SHA-1时的HMAC记为HMAC-SHA1。如今,HMAC已被作为ANSI、IETF、ISO和NIST的标准,并广泛应用于因特网协议中,如IPSec、SSL中就使用了HMAC。
HMAC算法的实现框图如图8-4所示。图中的参数说明如下:
●H是算法中嵌入的Hash函数,如MD5、SHA-1;
●M为HMAC的输入消息,mi(i=1,2,…,L)是M的第i个分组,即将消息M划分为L个分组,每个分组为bbit;(www.xing528.com)
●K为密钥,当K的长度大于bbit时,用H(K)值替代原来的K,即length(K)>b,则K←H(K),当K的长度小于bbit时,将K的右边填充0,使其成为长度为bbit,记为K+,即length(K)<b,则K+←(K‖00…0),如果K的长度刚好等于bbit,则不作处理;
●ipad为00110110(即0x36)重复b/8次后的序列,opad为01011100(即0x5C)重复b/8次后的序列。
图8-4 HMAC算法框图
HMAC算法的具体执行步骤可描述如下:
1)将K+与ipad逐比特异或得到bbit的分组Si,即计算Si=K+⊕ipad。
2)把输入消息M=m1m2…mL附加在Si的右端,得到Si‖M。
3)将Si‖M作为Hash函数H的输入,得到Lbit的输出H(Si‖M)。
4)将K+与opad逐比特异或得到bbit的分组S0,即计算S0=K+⊕opad。
5)将第3)步得到的H(Si‖M)填充到bbit后附加在S0的右端。
6)将第5)步处理后的比特流作为Hash函数H的输入,得到Lbit的输出即为消息M的消息认证码HMACK(M)。
此执行步骤可以简单描述为:
HMACK(M)=H[(K+⊕opad)‖H[(K+⊕ipad)‖M]]
其实,也可以对第6)步中最后的输出截取左边若干位作为消息认证码。在RFC 2104中推荐截取长度不少于Hash输出长度的一半,且不少于80bit。例如,使用MD5实现的HMAC-MD5-128取输出的128bit作为MAC;使用SHA-1实现的HMAC-SHA1-160算法,则使用160bit作为输出结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。