跳转至

第 9 章:消息认证码 MAC

目前讲到的所有加密方式都没有确保完整性。我们需要一种方式来维护消息的完整性。

消息认证码 Message Authentication Code

现在发送者和接收者都有同一个密钥。

  • \(k \leftarrow Gen(1^n)\),密钥生成。
  • \(t \leftarrow Mac_k(m)\),标签生成。
  • \(b := Vrfy_k(m, t)\),验证算法。其中 \(\forall k \forall m, Vrfy_k(m, Mac_k(m)) = 1\)

MAC 的安全性

定义一个实验“Mac 伪造”\(\text{Mac-forge}_{A, \Pi}\)

  • \(k \leftarrow Gen(1^n)\)
  • 对手有访问 \(Mac_k(\cdot)\) 的权限。
  • 对手:输出 \((m, t)\)。在这之前向 \(Mac_k(\cdot)\) 询问任意值 \(x \in Q\)

\(\text{Mac-forge}_{A, \Pi} = 1\) 如果有 \(Vrfy_k(m, t) = 1\) 并且 \(m \notin Q\),否则 \(\text{Mac-forge}_{A, \Pi} = 0\)

如果对于所有的 PPT 对手,\(\Pr[\text{Mac-forge}_{A, \Pi} = 1] \leq negl(n)\),那么 MAC 是安全的。

伪造攻击

  • 存在性伪造:攻击者在查询 MAC oracle 后选择要伪造的消息,就是上面那个 \(\text{Mac-forge}\)
  • 选择性伪造:对手在进行攻击前选择一条消息,但是在之后无法查询该消息。
  • 通用伪造:攻击者可以在查询 MAC oracle 后为任何消息创建 MAC。

复用攻击

MAC 可以保证攻击者不能新建可以验证的信息,但是可没说过能防御以前用过的信息。

防御方式:

  • 使用序列号。
  • 使用时间戳。
  • 使用随机数。

使用 PRF 的定长 MAC

F 是一个 PRF。定义一个定长 MAC:

  • \(Gen(1^n) = \{0, 1\}^n \to k\),随机而平均地生成的。
  • \(Mac_k(m) = F_k(m) = t\)
  • \(Vrfy_k(m, t) = 1\) 当且仅当 \(t = F_k(m)\)

如果 F 是 PRF,这个系统就是一个安全的定长 MAC 系统。

变长 MAC

有个明显的思路是分块,给块的末尾补上 0。对于第 i 个块,算出:

  • 一个新鲜出炉的随机辨识符 \(r\)
  • 信息长度 \(l\)
  • 块的编号 \(i\)
  • 信息 \(m_i\)

这四个部分每个最多 \(n / 4\) 比特长。

\(t_i \leftarrow Mac'_k(r || l || i || m_i)\)

基本 CBC-MAC

现在有一个 PRF \(F\)。基本 CBC-MAC \(Mac_k(m)\)

  • 把 m 分割为 \(m_1, \cdots, m_l\)
  • \(t_0 := 0^n\)
  • 从 1 到 l:\(t_i := F_k(t_{i - 1} \oplus m_i)\)
  • 输出为 \(t_l\)

\(Vrfy_k(m, t)\) 检查是否 \(t = Mac_k(m)\)

哈希函数

哈希的安全要求

  • 哈希函数应该是单向的。
  • 很难找到另外一个值,它的哈希和一个已知值的哈希相同。
  • 很难找到另外一个值,它的哈希和一个已知值相同。