摘要

  • RFC 5297 的 SIV 把 nonce 重用的后果限制为一种可描述的隐私损失:攻击者仍难以伪造可接受密文,但能看出相同明文和相同关联数据是否再次出现。
  • “抗 nonce 误用”是事故发生后的安全网,不是取消 nonce 唯一性、AD 结构治理或先验证后释放的许可证。

被保住的是真实性,不是沉默

许多基于 nonce 的认证加密模式有一条脆弱前提:同一密钥下不能重复 nonce。SIV 改变了这条前提失守后的坠落方式。它先让 S2V 用 CMAC 处理按顺序排列的关联数据和明文,生成 128 位合成初始化向量;再把这个结果交给 AES-CTR。最终输出由合成 IV 和与明文等长的密文组成。

当 nonce 唯一时,SIV 提供 RFC 5297 所述的常规机密性与真实性。当同一密钥下的 nonce 重复时,真实性仍在:攻击者不能轻易制造一个解密后不是 FAIL 的新对象。但如果明文和全部关联数据也相同,输出的相同性就会显露出来。

等同性不是抽象泄漏。一个只有“批准/拒绝”两种值的隐蔽指令、一份很少变化的权限对象、反复封装的结构化密钥、固定格式的状态回执,都可能因为“又出现了同一个值”而泄露节奏、身份或政策没有变化。不能因为内容仍不可直接阅读,就把暴露记为零。

两种合法模式需要两份权力说明

RFC 5297 允许两种运行方式。在 nonce 模式中,nonce 是 S2V 输入向量里紧邻明文的最后一个关联数据分量。其他分量由应用定义,可以绑定租户、对象类型、版本、接收方和用途。随机 nonce 应至少 128 位,并来自至少提供 128 位熵的池;计数器或时间戳也可以使用,但应用必须守住它们各自的唯一性条件。

确定性模式则不需要 nonce。它面向攻击者无法预测的明文,例如被封装的密码学密钥。协议仍可用关联数据绑定用途或接收方。

同一个库函数能够支持两种模式,不代表调用者拥有自由切换的权限。没有 nonce 的确定性封装可能完全正确;把一串可预测业务指令伪装成“确定性对象”,只为省去状态,却是另一件事。审计记录必须说明模式、应用配置、授权者和适用理由,而不是从密文本身猜测。

AD 向量不是可以随意压扁的字符串

S2V 原生接受多个可变长度字符串。分量顺序和边界都进入认证语义。tenant=ab, type=c 与 tenant=a, type=bc 不能因为朴素拼接而成为同一串字节;version 被省略或接收方与用途交换位置,也不是同一个声明。

RFC 5116 的 AEAD 接口只提供一个关联数据分量。通过该接口调用 SIV 时,软件必须把向量编码成一个无歧义字符串。长度、类型和模式版本因此成为安全合同。标签验证通过只证明两端处理了相同字节,并不证明两个版本把这些字节解释成相同字段。

S2V 的总分量上限是 127,明文占用一个,所以关联数据最多 126 个分量。适配器若为满足上限而静默合并、丢弃或重排字段,保护的已经是另一句话。这个决定必须被拒绝或显式迁移,不能藏在序列化层。

候选明文没有生效权

解密时,CTR 会先产生候选明文。接收方随后用同一组 AD 与候选明文重算 S2V,并同收到的合成 IV 比较。相等才返回明文,不等则返回 FAIL。

这条算法顺序在软件边界上很容易被破坏。为了流式处理或缩短延迟,包装层可能提前把候选字节送进解析器、日志、缓存或策略引擎。即使最后比较失败,未经认证的数据已经产生副作用。密码学实现通过测试向量,不能证明外围接口遵守了释放门槛。

有效证据至少要拆分:开始解密、候选被隔离、认证比较完成、认证通过、明文释放、应用解析、对象授权与最终效果。把它们压成一个“decrypt success”,既看不到提前泄放,也把密码学成功误当成业务接受。

计数器之间不能互相作证

RFC 5297 讨论同一密钥下 SIV 调用总量,并沿用 CMAC 的谨慎做法,建议把不同调用限制在 2^48 量级。这个预算与 nonce 唯一性是两条轴。nonce 没有重复,不等于密钥预算未耗尽;调用量很小,也可能在第一次重启时就重复 nonce。

IANA 为三种 AES-SIV-CMAC 密钥尺寸登记了 15、16、17。登记证明共享编号,不证明运行时真正选择了哪个算法,也不证明密钥正确拆分、模式合规、nonce 唯一、AD 编码一致或明文等待了验证。

一份不含秘密的完整收据应连接:算法与构建版本、密钥代际、模式与应用配置、AD 分量名称和摘要、nonce 来源与唯一性判定、对象标识、合成 IV 摘要、认证结果、释放决定、重复元组、等同性暴露评估、下游接受结果和每密钥预算。

Sources