C - 消息认证码

消息认证码(MACs)

我的博客

原书:《Understanding Cryptography: A Text book for Students and Practitioners》

消息认证码 MAC: Message Authentication Code,也被称作加密校验和或带密钥的哈希函数。MAC 与数字签名共享一些属性,因为它们都能够提供消息的完整性与消息认证。不过,不想数字签名,MAC 是对称密钥策略,它们不提供不可抵赖性。MAC 的一个优点是相较于数字签名它们运算速度更快,因为它们要么基于块运算,要么基于哈希运算。

12.1 消息认证码的原则

与数字签名类似,MACs 在消息后面附加一个认证标签。MACs 与数字签名的最主要的区别在于,MACs 使用对称密钥 k 生成认证标签,并使用这个密钥校验标签。

\[m = MAC_k(x) \]

B 使用密钥 \(k\) 计算消息 \(x\) 的消息认证码 \(m\),并将其附加在消息的后面,将 \((x,m)\) 发送给 A,A 受到消息之后,使用 \(k\) 计算消息的消息认证码 \(m'\) 来判断 \(m\) 是否与 \(m'\) 一致。

使用 MAC 的动机是,A 与 B 希望确定消息 \(x\) 在传输过程中是否有做修改。

消息认证码属性

  1. 密码学校验 MAC 为提供消息的安全认证
  2. 对称性 MAC 基于对称算法,生成方与校验方共享密钥
  3. 消息长度任意 MAC 可以接收任意长度的消息
  4. 消息认证码长度固定 MAC 生成固定长度的标签
  5. 消息完整性 MAC 提供消息的完整性认证
  6. 消息认证 MAC 可以提供消息源认证
  7. 不能提供不可抵赖 MAC 基于对称运算不能提供不可抵赖性

最后一点十分重要,消息认证码不能够提供不可抵赖性。

12.2 哈希函数的 MACs:HMAC

一个可选的计算 MAC 的方案是使用哈希函数如 SHA-1 实现。一个可能的构造是 HMAC,在最近十年变得十分流行。比如,它在 TLS: Transport Layer Security 协议以及 IPsec 协议套件中使用。HMAC 之所以被广泛使用,在于只要满足某些前提假设,它就能够保证是安全的。

在所有基于哈希的消息认证码的背后,是密钥是与消息一起哈希的。有两个可能的构造方式,其中一个是前缀 MAC:

\[m = MAC_k(x) = h(k||x) \]

另一种是后缀 MAC:

\[m = MAC_k(x) = h(x||k) \]

上面的符号 \(||\) 表示串联。

针对前缀 MAC 的攻击

B 希望认证的消息是一系列消息块 \(x = {x_1,x_2,...,x_n}\),其中消息块的长度与哈希函数的输入匹配,B 计算的消息认证码是:

\[m = MAC_k(x) = h(k||x_1,x_2,...,x_n) \]

前缀 MAC 的问题在于,对消息 \(x = (x_1,x_2,...,x_n,x_{n+1})\),其中 \(x_{n+1}\) 是任意的一个附加消息块,可以在不清除 \(k\) 的前提下被构造出来,攻击如下:

O 拦截了B 发送的消息 \((x,m)\),并在消息的后面附加上一个消息块 \(x_{n+1}\),计算新的哈希 \(m_O = h(m || x_{n+1})\),并将新的消息 \((x_O,m_O)\) 发送给 A,A 对收到的消息做哈希,得到 \(x' = h(k || x_1,...,x_n,x_{n+1}) = m_O\),判定消息有效。

针对后缀 MAC 的攻击

假设 O 可以构造哈希函数的碰撞,既他能够找到消息 \(x_O\) 对于消息 \(x\) 满足:

\[h(x) = h(x_O) \]

两条消息 \(x\)\(x_O\) 都能够做为支付纤细,如果 B 消息认证 \(x\) 为:

\[m = h(x||k) \]

\(m\) 同时也是 \(x_O\) 的有效消息认证码:

\[m = h(x||k) = h(x_O||k) \]

HMAC

HMAC 是基于哈希函数构造的消息认证码生成算法,避免了上面提到的弱点。它由 Mihir Bellare、Ran Canetti 以及 Hugo Krawczyk 于 1996 年提出。这个策略由内部哈希与外部哈希组成。

MAC 计算开始于在密钥 \(k\) 的左侧填充零,保证得到的 \(k^+\) 位长为 \(b\),其中 \(b\) 是哈希函数的输入块宽度,扩展密钥与内部填充 \(ipad\) 进行异或,内部 \(ipad\) 由重复的比特模式组成:

\[ipad = 00110110,00110110,...,00110110 \]

异或结果做为第一个喂给内部哈希函数的输入块,紧跟着就是消息块 \(x_1,x_2,...,x_n\)

外部哈希类似,首先对密钥 \(k\) 用零填充得到 \(k^+\),并与 \(opad\) 进行异或,外部 \(opad\) 为:

\[ipad = 01011100,01011100,...,01011100 \]

异或的结果做为外部哈希的第一个输入块,另一个输入块是内部哈希的输出,在外部哈希计算完成后,它的结果做为消息 \(x\) 的消息认证码。HMAC 构造可以表示为:

\[HMAC_k(x) = h[(k^+ \oplus opad) || h[(k^+ \oplus ipad) || x]] \]

如果攻击者能够破解 HMAC,意味着他也能够破解策略中使用的哈希函数。破解 HMAC 意味着,即便攻击者不知道密钥,他依然可以构造消息的有效认证标签。

12.3 块运算的 MACs:CBC-MAC

另一种实现构造 MAC 的方式是使用块运算构造。实践中最流行的方式是使用诸如 AES 快运算的 CBC 模式构造。这样的策略也称作 CBC-MAC。

生成 MAC

为了生成 MAC,我们必须首先将消息 \(x\) 分割成块 \(x_i\),使用密钥 \(k\) 以及初始向量 \(IV\),我们可以计算 MAC 算法的第一个迭代:

\[y_1 = e_k(x_1 \oplus IV) \]

其中 \(IV\) 是公开的随机值,后续的消息块,伴随着前一个块运算的输出,计算得到:

\[y_i = e_k(x_i \oplus y_{i-1}) \]

最终消息 \(x\) 的 MAC 是最后一轮的输出:

\[m = MAC_k(x) = y_n \]

与 CBC 加密不同的是,\(y_1,y_2,...,y_{n-1}\) 不会传输,它们只是计算最终 MAC 值的中间值。

校验 MAC

校验 MAC 只需要重复计算 MAC 的操作。

12.4 伽罗瓦计数器消息认证码(GMAC)

GMAC 是 GCM 的一个变体。GMAC 可以轻松实现并行计算,很适合高速应用。GMAC 使用硬件的实现可以达到 10 Gbps 以上。

posted @ 2023-04-10 22:01  ArvinDu  阅读(101)  评论(0编辑  收藏  举报