消息认证码
消息认证码可以实现“认证”和“检测篡改”这两个功能。密文的内容在传输过程中可能会被篡改,这会导致解密后的内容发生变化,从而产生误会。消息认证码就是可以预防这种情况发生的机制。
加密处理流程
假设A发送给B的密文在通信过程中被X恶意篡改了,而B收到密文后没有意识到这个问题。
如果使用消息认证码,就能检测出消息已被篡改。为了让大家了解实际的处理流程,我们再一次回到A正要向B发送密文的时候。
A生成了一个用于制作消息认证码的密钥,然后使用安全的方法将密钥发送给了B。
接下来,A使用密文和密钥生成一个值。此处生成的是7f05。这个由密钥和密文生成的值就是消息认证码,以下简称为MAC(Message AuthenticationCode)。
A将MAC(7f05)和密文发送给B。
和A一样,B也需要使用密文和密钥来生成MAC。经过对比,B可以确认自己计算出来的7f05和A发来的7f05一致。
假设在A向B发送密文和MAC时,X对密文进行了篡改。
B使用该密文计算MAC,得到的值是b85c,发现和收到的MAC不一致。
由此,B意识到密文或者MAC,甚至两者都可能遭到了篡改。于是B废弃了收到的密文和MAC,向A提出再次发送的请求。
存在的问题
这种方法也有缺点。在使用消息认证码的过程中,AB双方都可以对消息进行加密并且算出MAC。也就是说,我们无法证明原本的消息是A生成的还是B生成的。
使用MAC时,生成的一方和检测的一方持有同样的密钥,所以不能确定MAC由哪方生成。这个问题可以用“数字签名”来解决。
MAC的算法
我们可以把MAC想象成是由密钥和密文组成的字符串的“哈希值”。计算MAC的算法有HMAC、OMAC、CMAC等。目前,HMAC的应用最为广泛。
参考: 我的第一本算法书 5-8 消息认证码