“综合练习要求先完成40字节链,再把最后8字节补成真正16字节消息,重选K₁分支;同时检查空消息与16字节全零消息为何不是同一输入。随后CMAC将作为AES SIV的向量认证构件。”
形式陈述
两把AES-128密钥与有边界的输入
本页实现RFC5297(2008)的AES-SIV-CMAC-256实例:32字节密钥K分成前16字节Kₐ和后16字节Kₑ,分别认证和加密。这里的256是总密钥位数;两次使用的底层AES分组密码都是AES-128。安全模型中两半独立均匀选取,不能令它们相同。[1, §§2,6.1]
输入为字节串向量A=(A₁,…,Aᵣ)和明文P,0≤r≤126;输出Z长|P|+16字节。向量的顺序和各分量边界有意义,空向量、含一个空串的向量也不同。它是认证加密接口:解密只返回通过认证的明文或FAIL,关联数据本身不加密。
RFC登记的明文上限为2¹³²字节,恰对应至多2¹²⁸个AES块;本页执行器将关联数据总长加明文长限制为1 MiB。两者都不是同一密钥可以无限重复使用的安全预算。下面只接受完整128位认证值,不支持截断标签。
S2V把一组字符串变为一块
使用CMAC作为字节串认证函数F,dbl和短块pad沿用CMAC的定义。S2V接受至多127个分量X₁,…,Xₙ。零分量时规定输出F(0¹²⁷∥1);否则先置D₀=F(0¹²⁸),对i=1,…,n−1计算
处理完i个前置分量的不变量是
每轮用dbl的线性性就能保持此式。最终分量Xₙ单独处理:若至少16字节,把Dₙ₋₁异或到它的最后16字节,前缀原样保留;若不足16字节,则构造dbl(Dₙ₋₁)⊕pad(Xₙ)。对所得字符串再做一次F,输出V。
加密实际调用V=S2V(A₁,…,Aᵣ,P),所以总有最后的P分量,即使P为空也不是零分量调用。将["ab","c"]与["a","bc"]直接拼成同一个字符串会丢掉信息;S2V则逐分量处理,位置通过dbl次数进入状态。不同输入仍可能发生128位碰撞,不能据此宣称它是无碰撞编码。
从V形成计数器,再验证V
复制V为Q,将从最低位0起编号的第31、63位清零。按大端字节索引,这就是Q[8]和Q[12]各与7f相与;V本身不修改。对第i块(i从0起)用E_{Kₑ}(Q+i mod 2¹²⁸)做CTR异或,输出Z=V∥C。末块只取实际需要的密钥流字节。[1, §2.4]
解密先检查Z至少有16字节,拆出V和C。用V导出的Q在内部解出候选P,再计算V′=S2V(A,P)。仅当完整V′等于V时交付P,否则返回FAIL。诚实加密的两次CTR异或相消,重算得到同一S2V值,故正确性成立。失败候选不得交给解析器、日志或其他应用回调。
若采用带nonce的调用约定,将nonce作为最后一个关联数据分量,紧挨最终明文分量之前;RFC的nonce型登记要求它非空。它占用126个关联数据名额中的一个。无nonce时仍可使用基本确定性接口,但不能把两种调用的向量边界混用。[1, §§3,6.1]
直觉
先让内容决定起点
普通CTR先拿到外部起点,再遮住内容。SIV先用认证密钥看完关联数据和明文,让这份输入决定起点V,再用另一把密钥遮住明文。因此加密需先认证后加密,通常是两遍;不是拿到第一个字节就能立即输出最终密文。
AES-GCM的标签直接认证密文,可以先验证再解密。SIV认证的是明文,接收方必须先在内部解出候选。两者都遵守同一交付边界:未认证的候选不会成为成功输出。
例子与边界
14字节明文走短分支
RFC5297附录A.1的离线测试密钥为
fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0
f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
关联数据仅一个分量101112131415161718191a1b1c1d1e1f2021222324252627,明文为14字节112233445566778899aabbccddee。初始D₀=0e04dfafc1efbf040140582859bf073a,加入关联数据后D₁=edf09de876c642ee4d78bce4ceedfc4f。计算
dbl(D₁) dbe13bd0ed8c85dc9af179c99ddbf819
pad(P) 112233445566778899aabbccddee8000
异或 cac30894b8eaf254035bc20540357819
最后一行经CMAC得到V=85632d07c6e8f37f950acd320a2ecc93。清位后的Q=85632d07c6e8f37f150acd320a2ecc93;这里字节8从95变15,字节12原本最高位为0。E_{Kₑ}(Q)=51e218d2c5a2ab8c4345c4a623b2f08f,取前14字节与P异或,得到C=40c02b9690c4dc04daef7f6afe5c。最终输出30字节V∥C。[1, Appendix A.1]
附录A.2有两个普通关联数据分量及一个nonce分量,47字节明文走xorend长分支,最终为63字节输出。综合练习给出全部输入,要求标出D混入的末16字节和三个计数块。
重复输入泄漏什么
固定密钥下,完全相同的(A,P)必得到完全相同的Z。nonce放入A后,重复nonce而其他输入不同,并不会自动复用同一个合成IV;安全分析仍需计入可能碰撞和总块数。重复nonce、相同其他关联数据且相同明文时,观察者能识别相等。长度和公开关联数据也一直可见。
若对手可以让系统加密自己猜测的低熵明文,并保持相同A,就能用确定性输出逐个比对猜测。这里的保密目标允许完整输入相等泄漏,不是把确定性加密声称为任意查询下的随机化IND-CPA。
原样重复提交已生成的(A,Z),解密依然会成功。SIV不记录“这份记录是否已交付”,所以不能替代序号、重放窗口或业务幂等状态。抗nonce误用也不抵消密钥泄漏、候选明文泄漏或时序侧信道。
空串也有位置
S2V([])使用专门的0¹²⁷∥1输入;加密空消息时调用的是S2V([空串]),走D₀、dbl和pad。这两条控制流不同。再加入一个空的关联数据分量,还会先执行一次D←dbl(D)⊕F(空串)。附件逐一计算三者,不能把“没有字节”当成“没有分量”。
推论与应用
定理的构件条件与安全游戏
理解合成IV的证明需要伪随机函数工具。把S2V看作接受向量的函数F:对手可查询向量输入,目标是区分F与对每个新向量独立抽取128位结果的随机函数。S2V的证明先把底层CMAC替换为随机字符串函数,再控制不同向量在dbl折叠和最终认证输入处相遇的概率;向量长度小于128是构造定理的条件。[2, §5, Theorem3]
一般SIV组合定理还要求另一把独立密钥实现安全的随机IV加密,且输出在相应攻击游戏中接近随机串,不能只要求“能够解密回来”。将向量PRF和这样的IV加密组合,得到确定性认证加密;通用优势界由向量PRF优势、IV加密优势及q/2¹²⁸项组成,q为总查询数。[2, §4, Theorem2] AES-SIV用CMAC构造S2V、用CTR实现加密,具体界另计AES的PRP优势、总处理块数和Q的两位清零,不能直接把任意MAC代入。
该确定性安全游戏比较真实加解密与理想接口:每个新的(A,P)对应一条长度|P|+16的随机串,重复询问沿用旧答案;理想解密对新密文返回FAIL。游戏排除把加密刚返回的(A,Z)原样交给解密,以及将解密已成功得到的(A,P)再交给加密的平凡交叉查询。真实接口仍允许这些调用,只是不把它们当作破解证据。[2, §3, Definition1]
机制是先把新输入的V替换为伪随机值,再把CTR输出替换为随机外观;攻击者要产生此前未知的有效组合,必须突破某个构件或碰上证明计入的坏事件。向量输入相等本就必须重用V,因此相等泄漏留在理想接口中。nonce唯一时,可进一步得到通常的nonce型认证加密目标;把nonce重复放入向量仍保留上述较弱且明确的保证。
两遍计算的实际成本
令r为关联数据分量数、bᵢ=max(1,⌈|Aᵢ|/16⌉)、p=⌈|P|/16⌉。附件构造CMAC对象先用一次AES求L;每次seal再用一次CMAC认证16字节零块,处理关联数据需Σbᵢ次AES,最终明文分支需max(1,p)次AES,CTR需p次AES。因此每次seal合计
次AES,另加对象初始化一次。空明文也有两次认证AES,CTR为零次。固定分组宽度下时间O(1+r+Σ|Aᵢ|+|P|);附件会构造最终认证输入、密文或内部候选,并可保存轨迹,空间同阶。流式优化可以减少认证状态,但两遍读取和失败前不交付的缓冲约束仍须兑现。
终点任务要求把A.1明文延长到16字节,改走xorend而非继续使用短分支;再交换A.2两个关联数据分量、保持nonce位置,验证旧密文被拒绝。最后对比重复输入、重复nonce但改变明文和原样重放三个实验,分别说明可观察输出与接收端状态责任。
参考资料
- Harkins,RFC5297,2008,Informational;§§2.1–2.7算法、§§3–5使用边界、§6.1精确参数、§7安全考虑、Appendix A两份可执行测试向量。
- Phillip Rogaway、Thomas Shrimpton,A Provable-Security Treatment of the Key-Wrap Problem,2006扩展版;§3 Definition1、§4 Theorem2及证明、§5 Theorem3、§6 Figure5、§7重复IV模型。本文给出构件条件和归约机制,有限向量通过不代替安全证明。