PMAC、TMAC、EMAC、OMAC、CMAC、XCBC
PMAC、TMAC、EMAC、OMAC、CMAC、XCBC,这些都属于基于分组密码的MAC算法,旨在使用像AES这样的分组密码来构建安全的消息认证码。
核心概念与演化脉络
这些算法的演化主线是:如何在保证安全性的前提下,更高效、更灵活地使用分组密码来生成MAC。它们主要解决了早期方案(如CBC-MAC)在安全性和灵活性上的缺陷。
-
起源:CBC-MAC
-
这是最直观的方式:将消息用CBC模式加密,并取最后一个密文块作为MAC。
-
致命缺陷:对于固定长度的消息是安全的,但对于可变长度消息不安全。攻击者可以通过拼接已知的MAC对来伪造新消息的MAC。
-
-
第一代改进:EMAC, XCBC, TMAC
-
它们通过引入额外的加密步骤或多个密钥来修复CBC-MAC的安全缺陷,使其支持变长消息。
-
-
标准化与简化:OMAC (CMAC)
-
它们进一步简化了密钥管理,通常只使用一个或两个密钥,并通过在内部生成子密钥来达到与XCBC类似的安全性。CMAC是OMAC的标准化版本,也是目前最广泛使用的算法之一。
-
-
并行化革命:PMAC
-
这是一个范式转变,它打破了CBC模式的串行依赖,允许并行计算,极大地提高了高速硬件实现中的吞吐量。
-
详细比较表格
| 特性 | EMAC | XCBC | TMAC | OMAC (CMAC) | PMAC |
|---|---|---|---|---|---|
| 全名 | Encrypted CBC-MAC | eXtendable CBC | Two-key MAC | One-Key CBC-MAC (Cipher-based MAC) | Parallelizable MAC |
| 核心思想 | 对CBC-MAC的输出进行第二次加密 | 使用三个独立密钥处理最后一块 | 使用两个密钥,其中一个由另一个推导出 | 使用一个主密钥,内部推导出两个子密钥 | 使用“偏移量”和ECB模式,最后加密输出 |
| 密钥数量 | 2个独立密钥 | 3个独立密钥 | 2个独立密钥 | 1个主密钥 (或2个,但OMAC1/CMAC通常被视为1个) | 1个主密钥 |
| 并行性 | 否 (CBC模式串行) | 否 (CBC模式串行) | 否 (CBC模式串行) | 否 (CBC模式串行) | 是 (核心计算可并行) |
| 安全性 | 可证明安全 | 可证明安全 | 可证明安全 | 可证明安全 | 可证明安全 |
| 消息长度要求 | 任意长度 (填充) | 任意长度 (填充) | 任意长度 (填充) | 任意长度 (填充) | 任意长度 (填充) |
| 效率 | 一般 | 一般 | 一般 | 高 (密钥调度一次) | 非常高 (并行计算) |
| 标准化情况 | 旧标准,较少使用 | 未广泛标准化 | 未广泛标准化 | NIST 标准 (SP 800-38B) | NIST 标准 (SP 800-38B) |
| 主要优势 | 比原始CBC-MAC安全 | 解决了变长消息问题 | 比XCBC少一个密钥 | 简洁、安全、标准化,易于实现 | 高性能,适用于高速网络 |
| 主要劣势 | 需要两个密钥,效率较低 | 三个密钥管理稍复杂 | 安全性证明较复杂 | 串行计算,无法并行加速 | 设计更复杂 |
各算法工作原理详解
1. EMAC
在原始CBC-MAC之后,再用一个独立的密钥 K2K2 加密最后一个密文块。
-
MAC = E_K2( CBC-MAC_K1(M) ) -
分析:第二次加密有效地防止了针对原始CBC-MAC的拼接攻击,提高了安全性。但需要管理两个密钥,并且进行了两次加密。
2. XCBC
使用三个密钥 K,K1,K2K,K1,K2。密钥 KK 用于所有完整块的CBC加密,而根据消息最后一块是否是完整块,使用 K1K1 或 K2K2 进行异或和加密。
-
分析:巧妙地解决了填充和长度扩展攻击问题。但其主要缺点是需要管理和存储三个独立的密钥。
3. TMAC
TMAC是XCBC的改进版,旨在将密钥数量从3个减少到2个。它通过令 K2=f(K1)K2=f(K1)(例如,对 K1K1 进行简单的变换)来生成第三个密钥。
-
分析:简化了密钥管理,但安全性证明变得稍微复杂一些。
4. OMAC / CMAC
这是XCBC/TMAC思想的最终升华,也是目前的主流选择。
-
核心:只使用一个主密钥 KK。
-
过程:
-
从 KK 推导出两个子密钥 K1K1 和 K2K2(通过对加密 0n0n 的结果进行移位和异或常数实现)。
-
像XCBC一样处理消息,使用 K1K1 或 K2K2 来处理最后一块。
-
-
分析:CMAC兼具了XCBC的安全性和TMAC的密钥管理简便性。它只需要一次密钥调度,效率很高,并且已被NIST标准化。它是大多数通用场景下的推荐选择。
5. PMAC
采用了完全不同的思路,不属于CBC家族。
-
核心:
-
对每个消息块 MiMi,先与一个特定的“偏移量” ΔiΔi 异或。
-
然后用分组密码加密每个块。注意:这一步是并行的,因为每个块的加密不依赖于前一个块的结果。
-
将所有加密结果的最后一块进行累加(通常是异或),最后再加密一次这个累加值,得到MAC。
-
-
分析:PMAC的革命性在于其并行性。在硬件实现中,可以同时加密所有块,吞吐量远高于串行的CBC模式。它是高性能计算环境(如核心路由器、高速网卡)的首选。
总结与选择建议
-
通用和平衡之选:CMAC
-
如果你的应用没有极致的性能要求,CMAC是首选。它安全、标准化、实现简单、密钥管理方便。适用于大多数软件和嵌入式系统。
-
-
极致性能之选:PMAC
-
如果你在构建高速网络设备、数据中心、或者任何需要为海量数据生成MAC的系统,并且硬件支持并行计算,PMAC是无可匹敌的。它通常与GMAC(基于GCM模式,用于AEAD)一起成为高性能场景的标配。
-
-
历史算法:EMAC, XCBC, TMAC
-
这些主要是密码学演化过程中的重要里程碑。在现代设计中,它们通常被更优的CMAC所取代,除非在需要与旧系统兼容的特定场景下。
-
简单来说,CMAC 和 PMAC 是当今最重要的两个基于分组密码的MAC,前者胜在简洁通用,后者胜在性能。
更多推荐



所有评论(0)