8. 密码学专题 - 消息认证码 (MAC)

密码学专题 - 消息认证码 (MAC)

消息认证码,或者 MAC,用于检测对消息的篡改。加密使 Eve 不能够获取消息的内容,但不能防止 Eve 对消息进行操纵,这时就需要消息认证码。与加密消息一样,MAC 也使用一个密钥 ,Alice 和 Bob 知道这个密钥但 Eve 不知道。当 Alice 向 Bob 发送消息 时,不仅仅发送消息 ,而且还发送一个由 MAC 函数计算得到的 MAC 值。Bob 检验接收到的消息的 MAC 值与收到的 MAC 值是否相等,如果不匹配则丢弃这个没能通过认证的消息。由于 Eve 不知道密钥 ,所以不能为篡改后的消息找到正确的 MAC 值,从而保证 Eve 不能对消息进行操纵。

8.1 MAC 的作用

MAC 函数有两个输入,其中一个是固定长度的密钥 ,另一个是任意长度的消息 ,产生固定长度的 MAC 值。这里将 MAC 函数表示为 。为了对一个消息进行认证,Alice 把消息 与 MAC 值 一起发送,这个 MAC 值也称为标签 (tag)。假设 Bob (同样有密钥 ) 收到消息 和标签 后,可以使用 MAC 验证算法来检验 是否成立。

8.2 CBC-MAC 和 CMAC

CBC-MAC 是一种将分组密码转换为 MAC 的经典方法,密钥 被用作分组密码的密钥。CBC-MAC 所采用的方法是对消息 用 CBC 模式进行加密,而只保留密文的最后一个分组,其余全部丢弃。对一个由分组 组成的消息,MAC 计算过程为:

有时也会取最后一个分组的一部分 (例如一半) 作为 CBC-MAC 函数的输出。CBC-MAC 的常见定义要求 IV 固定为 0。

8.3 HMAC

既然理想的 MAC 是一个以密钥和消息为输入的随机映射,而且我们已经有了与随机映射类似的散列函数,因此很自然地会想到用散列函数构造 MAC,这正是 HMAC 所要完成的工作。HMAC 的设计者当然非常了解散列函数的问题,正是由于这个原因,不能将 HMAC 简单地定义为 `、 甚至 等,因为如果使用标准的迭代散列函数会产生很多问题。

所以在 HMAC 中计算 ,其中 a 和 b 为指定的常数。即首先对消息进行一次散列运算,输出结果再与密钥一起进行散列运算。

附录 1. MAC

与密钥相关的单向散列函数通常称为 MAC,即消息认证码 (MAC, Message Authentication Code)。MAC 具有与先前讨论的单向散列函数同样的特性,但 MAC 还包括一个密钥。只有拥有相同密钥的人才能鉴别这个散列。这对于在有没有保密的情况下提供可鉴别性是非常有用的。

MAC 可在用户之间鉴别文件。它还可以被单个用户用来确定他的文件是否已改动,或是否感染了病毒。用户也可以计算出文件的 MAC,并将该值存入某个表中。如果用户采用了单向散列函数,在感染病毒后就可以计算出新的散列值,并用它代替表中的值。病毒就不能做到这一点,因为它不知道密钥。

将单向散列函数变成 MAC 的一个简单办法是用对称算法加密散列值。相反,将 MAC 变成单向散列函数则只需将密钥公开即可。

项目源代码

项目源代码会逐步上传到 Github,地址为 https://github.com/windstamp。

Contributor

  1. Windstamp, https://github.com/windstamp

你可能感兴趣的:(8. 密码学专题 - 消息认证码 (MAC))