C - 消息认证码
消息认证码(MACs)
原书:《Understanding Cryptography: A Text book for Students and Practitioners》
消息认证码 MAC: Message Authentication Code
,也被称作加密校验和或带密钥的哈希函数。MAC 与数字签名共享一些属性,因为它们都能够提供消息的完整性与消息认证。不过,不想数字签名,MAC 是对称密钥策略,它们不提供不可抵赖性。MAC 的一个优点是相较于数字签名它们运算速度更快,因为它们要么基于块运算,要么基于哈希运算。
12.1 消息认证码的原则
与数字签名类似,MACs 在消息后面附加一个认证标签。MACs 与数字签名的最主要的区别在于,MACs 使用对称密钥 k 生成认证标签,并使用这个密钥校验标签。
B 使用密钥 \(k\) 计算消息 \(x\) 的消息认证码 \(m\),并将其附加在消息的后面,将 \((x,m)\) 发送给 A,A 受到消息之后,使用 \(k\) 计算消息的消息认证码 \(m'\) 来判断 \(m\) 是否与 \(m'\) 一致。
使用 MAC 的动机是,A 与 B 希望确定消息 \(x\) 在传输过程中是否有做修改。
消息认证码属性
- 密码学校验 MAC 为提供消息的安全认证
- 对称性 MAC 基于对称算法,生成方与校验方共享密钥
- 消息长度任意 MAC 可以接收任意长度的消息
- 消息认证码长度固定 MAC 生成固定长度的标签
- 消息完整性 MAC 提供消息的完整性认证
- 消息认证 MAC 可以提供消息源认证
- 不能提供不可抵赖 MAC 基于对称运算不能提供不可抵赖性
最后一点十分重要,消息认证码不能够提供不可抵赖性。
12.2 哈希函数的 MACs:HMAC
一个可选的计算 MAC 的方案是使用哈希函数如 SHA-1 实现。一个可能的构造是 HMAC,在最近十年变得十分流行。比如,它在 TLS: Transport Layer Security
协议以及 IPsec
协议套件中使用。HMAC 之所以被广泛使用,在于只要满足某些前提假设,它就能够保证是安全的。
在所有基于哈希的消息认证码的背后,是密钥是与消息一起哈希的。有两个可能的构造方式,其中一个是前缀 MAC:
另一种是后缀 MAC:
上面的符号 \(||\) 表示串联。
针对前缀 MAC 的攻击
B 希望认证的消息是一系列消息块 \(x = {x_1,x_2,...,x_n}\),其中消息块的长度与哈希函数的输入匹配,B 计算的消息认证码是:
前缀 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\) 满足:
两条消息 \(x\) 与 \(x_O\) 都能够做为支付纤细,如果 B 消息认证 \(x\) 为:
\(m\) 同时也是 \(x_O\) 的有效消息认证码:
HMAC
HMAC 是基于哈希函数构造的消息认证码生成算法,避免了上面提到的弱点。它由 Mihir Bellare、Ran Canetti 以及 Hugo Krawczyk 于 1996 年提出。这个策略由内部哈希与外部哈希组成。
MAC 计算开始于在密钥 \(k\) 的左侧填充零,保证得到的 \(k^+\) 位长为 \(b\),其中 \(b\) 是哈希函数的输入块宽度,扩展密钥与内部填充 \(ipad\) 进行异或,内部 \(ipad\) 由重复的比特模式组成:
异或结果做为第一个喂给内部哈希函数的输入块,紧跟着就是消息块 \(x_1,x_2,...,x_n\)。
外部哈希类似,首先对密钥 \(k\) 用零填充得到 \(k^+\),并与 \(opad\) 进行异或,外部 \(opad\) 为:
异或的结果做为外部哈希的第一个输入块,另一个输入块是内部哈希的输出,在外部哈希计算完成后,它的结果做为消息 \(x\) 的消息认证码。HMAC 构造可以表示为:
如果攻击者能够破解 HMAC,意味着他也能够破解策略中使用的哈希函数。破解 HMAC 意味着,即便攻击者不知道密钥,他依然可以构造消息的有效认证标签。
12.3 块运算的 MACs:CBC-MAC
另一种实现构造 MAC 的方式是使用块运算构造。实践中最流行的方式是使用诸如 AES 快运算的 CBC 模式构造。这样的策略也称作 CBC-MAC。
生成 MAC
为了生成 MAC,我们必须首先将消息 \(x\) 分割成块 \(x_i\),使用密钥 \(k\) 以及初始向量 \(IV\),我们可以计算 MAC 算法的第一个迭代:
其中 \(IV\) 是公开的随机值,后续的消息块,伴随着前一个块运算的输出,计算得到:
最终消息 \(x\) 的 MAC 是最后一轮的输出:
与 CBC 加密不同的是,\(y_1,y_2,...,y_{n-1}\) 不会传输,它们只是计算最终 MAC 值的中间值。
校验 MAC
校验 MAC 只需要重复计算 MAC 的操作。
12.4 伽罗瓦计数器消息认证码(GMAC)
GMAC 是 GCM 的一个变体。GMAC 可以轻松实现并行计算,很适合高速应用。GMAC 使用硬件的实现可以达到 10 Gbps 以上。