“使用CMAC作为字节串认证函数F,dbl和短块pad沿用CMAC的定义。S2V接受至多127个分量X₁,…,Xₙ。零分量时规定输出F(0¹²⁷∥1);否则先置D₀=F(0¹²⁸),对i=1,…”
形式陈述
固定16字节标签的字节接口
CMAC把分组密码变为可认证变长消息的MAC。这里固定NIST SP800-38B的AES-128实例:密钥K为16字节,消息M为任意有限字节串,标签为完整16字节。它没有nonce参数,也不加密消息。验证重新计算标签,长度或全部标签字节不符便拒绝。[1, §§5–6]
记E_K(X)为AES对恰好16字节X的正向计算,⊕为等长逐位异或,∥为拼接。先计算
把128位串按大端无符号整数读成x,则dbl先左移一位并截回128位;若移出的最高位是1,再异或常量00000000000000000000000000000087。K₁、K₂是同一秘密L的确定变换,并非独立抽出的两把AES密钥。它们和中间链值都必须保密。
只有最后一块换规则
令n=max(1,⌈|M|/16⌉),把消息切成n−1个完整块及最后的Mₙ*。空消息也有一个空末块。构造最终输入块Bₙ:
pad只用于不足16字节的串:接一个80字节,再补零至16字节。例如两字节12 34变成12 34 80 00 … 00,空串变成80 00 … 00。这是比特级10*填充的字节版本;完整末块不额外增加一整块。
置Z₀=0¹²⁸。对i<n计算Zᵢ=E_K(Zᵢ₋₁⊕Mᵢ),最后计算Zₙ=E_K(Zₙ₋₁⊕Bₙ),输出Zₙ。迭代的不变量是Zᵢ恰为已经处理的格式化前缀的CBC链值;归纳到n便得到上述定义的标签。双方以同一K、同一M执行同一确定算法,故诚实验证通过。
本页只接受完整标签和字节消息。其他AES密钥长度、非字节对齐消息与截断标签是规范的其他实例,不能靠截掉本例输出便继承所有参数条件。教学下载器另把单条消息限制为1 MiB;这是资源上限,不是CMAC允许的密钥总用量。
直觉
给消息的结束位置加一层秘密区分
普通CBC链看见一块就处理一块,却没有在最终标签里区分“这条消息到此结束”和“后面还有块”。若直接把最后链值公开作为标签,攻击者可能拿它抵消下一段输入。
CMAC仍保留这条链,只在真正末块混入秘密掩码。完整块用K₁,短块补10*后用K₂。于是末块既带着内容,也带着“原来完整还是填充而成”的区分;接收方必须知道消息边界,才能选对分支。
例子与边界
从公开向量复算40字节消息
以下密钥仅用于离线公布测试:2b7e151628aed2a6abf7158809cf4f3c。RFC4493给出[2, §4]:
| 量 | 十六进制值 |
|---|---|
| L | 7df76b0c1ab899b33e42f047b91b546f |
| K₁ | fbeed618357133667c85e08f7236a8de |
| K₂ | f7ddac306ae266ccf90bc11ee46d513b |
L最高位为0,所以第一次只左移;K₁最高位为1,第二次左移后还要异或87。消息为
6bc1bee22e409f96e93d7e117393172a
ae2d8a571e03ac9c9eb76fac45af8e51
30c81c46a35ce411
前两行各16字节,最后一行8字节。先照常处理两个完整块,再把尾部补成30c81c46a35ce4118000000000000000,与K₂异或后处理最后一块。输出为dfa66747de9ae63030ca32611497c827。附件输出每次格式化输入和链值,可以逐块核算,不只比较最终标签。
同一规范测试还包含空串、前16字节和全部64字节消息,其标签分别为bb1d6929e95937287fa37d129b756746、070a16b46b4d4144f79bdd9dd04a287c、51f0bebf7e3b9d92fc49741779363cfe。空串走K₂分支,后两者走K₁分支;“长度能被16整除”还必须排除零。
裸CBC的标签怎样被接成长消息
只开放裸CBC标签oracle,询问一块M得到t=E_K(M)。构造此前没问过的两块消息M∥(M⊕t)。第二块计算为
所以同一个公开t可验证另一条更长消息。这攻击的是允许任意完整块长度的裸CBC-MAC;固定长度消息的安全定理没有允许从一块跳到两块。
对CMAC,询问同一M公开的是τ=E_K(M⊕K₁)。若依样构造M∥(M⊕τ),第一块的内部链仍为E_K(M),不是τ,刚才的相消推导便失去条件。附件用两种接口各自公开的标签尝试拼接,裸CBC接受,CMAC在该样例拒绝。
不能额外把CMAC内部的E_K(M)送给攻击者后,再期待原来的MAC游戏继续成立。下载器为已公开测试密钥打印链值,只用于复算;生产日志泄漏这些值会改变攻击模型。
填充不能用零随意代替
若短串只右补零,则12和12 00可能得到同一块。10*中的终止1标出真实结束位置。完整块还要走不同子密钥分支,否则一条完整块消息可能与另一条较短消息的填充形式混在一起。
推论与应用
从伪随机性得到单次伪造界
CMAC与OMAC1相同。其安全分析先将AES替换为随机置换,再控制内部链及不同末块掩码之间的碰撞。相关的K₁、K₂不能当成两份独立随机数;OMAC证明使用它们满足的具体线性关系条件。[3, §2.3.3]
给出一个便于使用的充分预算口径:S统计全部标签查询及最终待验证新消息的块数,每条计max(1,⌈|M|/16⌉),取S≤2⁶⁴。完整128位标签的单次新消息伪造概率有界为
这里B最多作S+1次正向分组查询,额外一次用于L;模拟还要处理实际输入块。依据是OMAC的变长输入PRF界4S²/2¹²⁸,加上新消息在理想随机函数下猜中标签的2⁻¹²⁸。[3, Corollary3.1] 最终验证也算进S,是因为归约必须求出那条新消息的正确标签才能判断攻击是否成功。
平方项说明数据越多,保证会变弱。这个界是固定AES实例的具体优势界,不是从一次向量通过便证明算法安全;多次在线验证、短标签及侧信道要另外计入模型。它也不阻止原样旧消息重放。
工作量与终点任务
同一密钥预计算一次L,需一次AES;K₁、K₂只做固定长度位操作。随后m字节消息需max(1,⌈m/16⌉)次AES。固定分组宽度下时间O(1+m),除输入输出外的链状态为常数空间;流式实现须暂留最后一块,不能太早判定它不是末块。附件开启逐块轨迹后,额外保存O(1+⌈m/16⌉)条记录。
综合练习要求先完成40字节链,再把最后8字节补成真正16字节消息,重选K₁分支;同时检查空消息与16字节全零消息为何不是同一输入。随后CMAC将作为AES-SIV的向量认证构件。
参考资料
- NIST,SP800-38B,2005、2016勘误版,§§5–6:CMAC输入、子密钥及两类末块。
- Song等,RFC4493,2006,§§2,4:AES-CMAC算法与四个公布向量。
- Tetsu Iwata、Kaoru Kurosawa,Stronger Security Bounds for OMAC, TMAC and XCBC,2003-04-30,§2.1空串块计数、§2.3.3 OMAC1、§3.2 Corollary3.1与Theorem3.1。本文将最终验证消息显式计入归约预算。