不重复须说明在哪个范围

AEAD等机制通常要求同一密钥下的新加密调用使用不同nonce,目的是避免同一关键状态被重复用于不同内容。唯一性可能由计数器、设备前缀和计数器组合等方式实现,不必把每种nonce都理解成必须隐藏的随机密码。

范围和长度仍需由所选构造规定。一个进程自己的计数器看似不重复,若多个进程共享密钥却都从零开始,整体仍可能碰撞;重启恢复也要避免把旧值再次用于新的加密。

参考:[1]

唯一、不可预测与新鲜不是同一条件

某些挑战或初始化场景还要求不可预测性,另一些机制只要求规定范围内唯一。递增数值可便于保证不重复,却很容易被预测;随机值则有碰撞概率。因此不能不看协议,就用同一种生成方式解释所有nonce。

NIST的DRBG初始化还给出它特定的nonce要求,并把nonce与秘密熵输入区分。把一个公开唯一值加进种子,不表示它必然贡献了同样多的秘密熵;序列号、时间信息和随机输入各自提供什么保证,必须分别分析。

参考:[2] [3]

防重放还须认证并核对状态

nonce可随密文发送或由接收端重建;AEAD解密会把它纳入相应验证,值不一致通常导致验证失败。但同一合法消息被再次送来,是否拒绝仍取决于协议的重放检查,不能只因为报文带着nonce就跳过状态管理。

重放防护应把相应值与消息和上下文可靠绑定,并定义哪些值已经使用、能否乱序和何时过期。公开字段可帮助区分实例,却不自动证明发件人身份、时间真实或该操作获准,算法输入与应用授权依旧是不同层次。

参考:[1]