MAC学习笔记
1. MAC的基本思想
消息验证码,利用密钥来生成一个固定长度的短数据块,并将该数据块附加到消息之后。
假定通信双方比如A和B,共享密钥K。若A和B发送消息时,则A计算MAC,它是消息和密钥的函数,
即MAC=C(K,M)
其中,M时输入信息,C时MAC函数,K时共享的密钥,MAC是消息验证码。
消息和MAC一起被发送给接收方。接收方对收到的消息用相同的密钥K进行相同的计算,得出新的MAC,并将接收到的MAC与其计算出的MAC进行比较,如果我们假定只有收发双方指导该密钥,那么若接收到的MAC与计算得到的MAC相等,则:
1. 接收方相信消息未被篡改.
2. 接收方确认消息来自真正的发送方,
3. 如果消息中含有序列号,则接收方确认消息顺序正确;
图中显示了三种常见的MAC基本原理,第一种只提供认证功能,不进行加密;第二种对明文进行计算MAC,然后对明文加MAC消息进行加密;第三种先对原始消息进行加密,再进行认证加密。最常用的方法是第二种
2.MAC的安全性分析
我们假定MAC由如下函数产生:
T=MAC(K,M)
其中M是一个变长消息,K是收发双方共享的密钥,MAC(K,M)是定长的认证符。在假定或已知消息正确时,将MAC附加于发送方的消息之后;接收方可以通过计算MAC来认证该消息。
MAC函数应具有的性质:
1. 若攻击者已知M和MAC(K,M),则他构造满足MAC(K,M‘)=MAC(K,M)的消息M’在计算上是
不可行的。翻译成人话就是:攻击者知道消息M和验证消息MAC,消息可以是加密的也可以是不加密
的,但是不知道密钥,也不知道MAC函数,要尝试密钥和MAC函数,暴力尝试M‘得到M是超出计算能力
的;
2. MAC(K,M)应是均匀分布的,即对任何随机选择的消息M和M’,MAC(K,M)=MAC(K,M‘)的
概率是2^-n,其中n是MAC的位数。这种情况是为了阻止基于选择明文的穷举攻击,即攻击者不知道
K,但是他知道MAC函数,能对消息产生MAC,而M是明文,是公开的,那么攻击者只要对各种消息计
算MAC,直到与给定的MAC相同的消息为止。因为一般假定K的长度k>n,所以通过消息去破解比通过
密钥破解某一次验证要快,平均需要2^n-1步才能找到具有给定MAC的消息。
3. 设M‘是M的某个已知的变换,即M’=f(M),例如f可能是将M的一位或多位取反,要求
Pr[MAC(K,M)=MAC(K,M')]=2^-n。这一条是要求认证算法对消息的某部分或某些位不应比其他部分或位
更弱,否则,已知M和MAC(K,M)的攻击者可能会对M中已知的"弱点"进行修改,比如一位或多位取
反,然后再计算MAC,导致破解更加容易。
3.基于Hash的MAC:HMAC
3.1HMAC特点
HMAC,效率高、应用广、性质好、安全性强强的一种利用Hash函数实现MAC的方案。
HMAC是Bellare等人中提出的,其要求使用的Hash函数具有迭代结构(如MD5、SHA1、SHA2等)。所谓迭代结构就是反复的使用压缩函数f将长消息映射为短消息。这个压缩函数f具有两个输入;一个是长度魏l的链变量k,一个是长度为b的数据块x,表示为fk=f(k,x)。以SHA1为例,b=521,l=160。3.2HMAC设计目标
RFC2104给出了HMAC的设计目标:
- 不必修改而直接使用现有的Hash函数。特步的,很容易免费得到软件上执行速度较快的Hash函数及其代码。
- 如果找到或者需要更快或更安全的Hash函数,应能很容贵的替代原来嵌入的Hash函数。
- 应保持Hash函数原有性能,不能过分降低其性能。
- 对密钥的使用和处理应较简单
- 如果已知嵌入的Hash函数的强度,则完全可以知道认证机制抗密码分析的强度
前两个目标是 HMAC 为人们所接受的重要原因, HMAC 将 Hash 函数视为 “黑盒” 有两个好 处。
第一. 模块化,便于封装
第二. 便于替代和更新,想要提高安全性时只需要提高Hash算法的安全性即可;上述最后一个设计目标实际上是 HMAC 优于其他基于 Hash 的一些方法的主要方面。只要嵌入的Hash 函数有合理的密码分析强度, 则可以证明 HMAC 是安全的。
3.3HMAC实现原理
符号定义:
H为嵌入的Hash函数(如MD5、SHA1、RIPEMD-160)
IV为Hash函数输入的初始值
M为HMAC的消息输入(包括由嵌入Hash函数定义的填充位)
Yi为M的第i个分组,0<=i<=(L-1)
L为M中的分位数
b为每一分组所含的位数
n为嵌入的Hash函数所产生的Hash码长
K为密钥;建议密钥长度>=n,若密钥长度大于b,则将密钥作为Hash函数的输入,来产生一个n位的密钥
K+为使K为b位长而在K左边填充0后所得的结果
ipad=00110110(十六进制数36)重复b/8次的结果
opad=01011100(十六进制数5C)重复b/8次的结果
HMAC可表述为:
算法流程如下:
- 在K左边填充0,得到b位的K+(例如,若K是160位,b=512,则在K中加入44个字节的0)
- K+与ipad执行异或运算(位异或)产生b位的分组Si。
- 将M附加于Si后。
- 将H作用与步骤3所得出的结果。
- K+与opad执行异或运算(位异或)产生b位的分组Si。
- 将步骤4中的Hash码附于S0后
- 将H作用与步骤(6)所得到的结果,并输出该函数值。
K与ipad异或后,其信息为有一半发生了变化;同样,K与opad异或后,其信息位的另一半也发生了变
化,这样通过将Si与S0传给Hash算法中的压缩函数,我们可以从K伪随机地产生出两个密钥。
HMAC多执行了三次Hash压缩函数(对Si,S0和内部地Hash产生的分组),但是对于长消息,HMAC和
嵌入地Hash函数地执行时间应该大致相同。
第二种实现方案:
实现HMAC有更为有效的方法,如图12.6所示。我们可以预计算两个值:
f
(
I
V
,
(
K
+
⊕
i
p
a
d
)
)
f
(
I
V
,
(
K
+
⊕
opad
)
)
\begin{array}{l} f\left(\mathrm{IV},\left(K^{+} \oplus \mathrm{ipad}\right)\right) \\ f\left(\mathrm{IV},\left(K^{+} \oplus \text { opad }\right)\right) \end{array}
f(IV,(K+⊕ipad))f(IV,(K+⊕ opad ))
其中f(cv,block)是Hash函数地压缩函数,其输入是n位地链路变量和b位地分组,输出是n位的链接变量。上述这些值只在初始化或密钥改变时才需计算,实际上这些预先计算的值取代了Hash函数中的初值(IV)。这样,只多执行了一次压缩函数,在产生MAC的消息大多数都较短的情况下,这种实现特别有意义。
4.基于分组密码的消息验证码(CMAC)
首先,党消息长度是分组长度b的n倍时,我们考虑CMAC的运算情况。对AES,b=128,对于3DES,b=64.这个消息被划分为n组(M1,M2,…,Mn)。算法使用了k位的加密密钥K和m位的常数K1。对于AES,密钥长度k为128、192或256位,对于3DES,密钥长度为112或168位。CMAC按如下方法计算:
其中,T为消息验证码,也称为tag,Tlen是T的位长度,MSBs(X)是位串的X最左边的s位。
如果消息不实密文分组的整数倍,则最后分组的右边(低有效位)填充一个1和若干0使得最后的分布长度位b。除了使用一个不同的n位密钥K2代替K1外,和前面所述的一样进行CMAC计算。
两个n位的密钥由k位的秘密密钥按如下方式导出:
主题内容参考自教材《密码学编码原理与网络安全》,加入了一些自己的理解,希望能帮到一些朋友。
版权归原作者 weixin_50167003 所有, 如有侵权,请联系我们删除。