算法初接触 | 安全算法[消息认证码]

149 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天

消息认证码

消息认证码可以实现“认证”和“检测篡改”这两个功能。密文的内容在传输过程中可能会被算改,这会导致解密后的内容发生变化,从而产生误会。消息认证码就是可以预防这种情况发生的机制

图解

01

1.jpg
首先,我们来看看什么情况下需要使用消息认证码。假设A在B处购买商品,需要将商品编号abc告诉B

02

2.jpg
此处,假设A使用共享密钥加密对消息进行加密。A通过安全的方法将密钥发送给了B

03

3.jpg
A使用双方共有的密钥对消息进行加密

04

4.jpg
A把密文发送给B,B收到后对密文进行解密,最终得到了原本的商品编号abc

05

5.jpg
以上是没有出现问题时的流程,然而在这个过程中可能会发生下面的情况

06

6.jpg
假设A发送给B的密文在通信过程中被X恶意篡改了,而B收到密文后没有意识到这个问题

07

7.jpg
B对被篡改的密文进行解密,得到消息xyz

08

8.jpg
B以为A订购的是编号为xyz的商品,于是将错误的商品发送给了A

09

9.jpg
如果使用消息认证码,就能检测出消息已被篡改。为了让大家了解实际的处理流程,我们再 一次回到A正要向B发送密文的时候

10

10.jpg
A生成了一个用于制作消息认证码的密钥,然后使用安全的方法将密钥发送给了B

11

11.jpg
接下来,A使用密文和密钥生成一个值。此处生成的是7f05。这个由密钥和密文生成的值就是消息认证码,以下简称为MAC(Message Authentication Code )

12

12.jpg
A将MAC(7f05)和密文发送给B

13

13.jpg
和A一样,B也需要使用密文和密钥来生成MAC。经过对比,B可以确认自己计算出来的7f05和A发来的7f05一致

提示:我们可以把MAC想象成是由密钥和密文组成的字符串的“哈希值”。计算MAC的算法有HMAC、OMAC、CMAC等。目前,HMAC的应用最为广泛

14

14.jpg
接下来,B只需使用密钥对密文进行解密即可。最终B成功取得了A发送过来的商品编号abc

15

15.jpg
X在通信过程中对密文进行了篡改是怎样一种情况呢?让我们回到A正要向B发送密文的时候

16

16.jpg
假设在A向B发送密文和MAC时,X对密文进行了篡改

17

17.jpg
B使用该密文计算MAC,得到的值是b85c,发现和收到的MAC不一致

18

18.jpg
由此,B意识到密文或者MAC,甚至两者都可能遭到了篡改。于是B废弃了收到的密文和MAC,向A提出再次发送的请求。

解说
加密仅仅是一个数值计算和处理的过程,所以即使密文被篡改了,也能够进行解密相关的计算。
如果原本的消息是很长的句子,那么它被篡改后意思会变得很奇怪,所以接收者有可能会发现它是被篡改过的。
但是,如果原本的消息就是商品编号等无法被人们直接理解的内容,那么解密后接收者便很难判断它是否被篡改。由于密码本身无法告诉人们消息是否被篡改,所以就需要使用消息验证码来检测。

补充说明
本文讲解了使用MAC检测密文是否被篡改的方法,继续进一步思考:X会不会为了让密文的篡改变得合理,而对MAC也进行篡改呢?
X没有计算MAC的密钥,所以即便他可以篡改MAC,也无法让篡改后的密文变得合理。所以,只要B计算出MAC,发现密文对应的MAC与自己算出的不同,就能确认通信过程中发生了篡改。
19.jpg
就像这样,只要使用消息认证码MAC,我们就能预防通信过程中的篡改行为。
然而,这种方法也有缺点。在使用消息认证码的过程中,AB双方都可以对消息进行加密并且算出MAC。也就是说,我们无法证明原本的消息是A生成的还是B生成的。
因此,假如A是坏人,他就可以在自己发出消息后声称“这条消息是B捏造的”,而否认自己的行为。如果B是坏人,他也可以自己准备一条消息,然后声称“这是A发给我的消息”。
使用MAC时,生成的一方和检测的一方持有同样的密钥,所以不能确定MAC由哪方生成。这个问题可以用下一节将会讲到的“数字签名”来解决。