Skip to content

算法Algorithm

RFC6979 确定性签名临时量

Deterministic signature nonce · RFC6979

以私钥和摘要初始化HMAC状态,严格区分位截断与整数编码,按拒绝采样连续产生适合ECDSA的临时标量。

形式陈述 ​

输入与三个转换 ​

RFC6979用确定性状态机生成DSA/ECDSA签名临时量。本页固定2013年8月RFC的SHA-256实例,并纳入已验证勘误3812。输入为素数阶q>2、私钥1≤d<q及消息摘要h1=SHA256(M);输出是候选k序列,签名者还需检查候选产生的r,s。它实际调用HMAC,不是把私钥和摘要直接拼接后当作整数。

记b=bitlen(q)、rbytes=⌈b/8⌉。三个转换分别为:

  • bits2int(u)把u按大端解释,若输入超过b位则只保留最左b位;输入较短时不在右边补零
  • int2octets(x)把0≤x<q编码为恰好rbytes字节的大端整数,必要时在左侧补零
  • bits2octets(u)=int2octets(bits2int(u)modq)

最后一项的模约简用于初始化输入;生成候选时的范围检查不会做这次模约简。

K、V状态与连续重试 ​

令V=0132、K=0032、B=int2octets(d)‖bits2octets(h1),按顺序执行:

K←HMACK(V‖00‖B),V←HMACK(V),K←HMACK(V‖01‖B),V←HMACK(V).

每次尝试把T清空,反复令V←HMACK(V)并向T追加V,直到至少有b位;取k=bits2int(T)。若1≤k<q,把它交给签名者。越界,或签名者发现r=0、s=0,都执行

K←HMACK(V‖00),V←HMACK(V),

再开始下一次尝试。状态不会恢复到初始值。生成器在每个新消息上重新初始化;同一私钥和同一摘要则重现同一轨迹。

直觉

秘密d使外部观察者无法只由公开消息计算临时量;消息摘要使不同输入沿不同状态轨迹运行。每个控制字节区分初始化的两个阶段和重试阶段。把任何一个字节省略,都会得到另一个算法,不能再用RFC向量验收。

候选不是“随便取一个大整数再模q”。若一个区间大小不是q的倍数,模约简会让某些余数拥有更多前像。拒绝采样只接受预定区间;理想均匀候选经此步骤后在1,…,q−1上均匀。现实HMAC的确定输出并非每次独立抛硬币,这一均匀性解释说明范围变换的作用,不是无条件证明具体HMAC安全。

例子与边界

非整字节长度能暴露错误 ​

取q=19,则b=5,rbytes=1。输入字节ff的左5位是11111,所以bits2int(ff)=31,而bits2octets(ff)=0c,因为31mod19=12。直接把255模19得到8,是另一个值。

int2octets(18)=12,即位串00010010。把这个完整字节再次送入bits2int,只留下00010,得到2而非18。两个名字看起来像互逆函数,但当b不是8的倍数时,它们移动边界的方向不同。

先拒绝范围,再拒绝零s ​

用教学阶19、私钥7和消息ASCII retry/7,SHA-256摘要的最左5位给z=21。下载生成器产生候选22,越界后更新K、V;下一候选6在范围内,但ECDSA计算出r=16,s=0,所以继续更新状态。第三个候选5得到签名(9,13),才完成签名。

这个例子同时检查三处:22不能取模后变成3,零s不能输出,拒绝6后不能重启并再次得到同一段序列。下载器的可选日志记录每次候选的K、V,只对公开教学密钥使用;真实密钥环境不能把这些秘密状态当调试输出发布。

正式互操作例采用RFC6979附录A.2.5公开的P-256私钥和消息sample,其SHA-256候选为a6e3c57d…d8aad60,最终r以efd48b2a开头、s以f7cb1c94开头。下载器保存完整预期值并逐字比较,也核对test第二组向量;正文中的省略号不是待签字节。

推论与应用

确定性临时量去掉了每次签名时调用随机源的一类失败,但私钥生成仍要有足够熵。不同协议若让同一密钥签相同有效摘要,会产生相同临时量;应按协议规范把域和上下文纳入实际消息,不擅自修改RFC内部编码。对ECDSA来说,同一摘要重现同一签名本身不是“两条不同摘要复用k”的代数泄漏。

设实际尝试a次,每轮需t=⌈b/256⌉个HMAC输出来收集足够位,拒绝轮再用两次HMAC更新。初始化处理O(rbytes)字节,单轮收集及转换也是O(rbytes)字节;固定SHA-256下总字节工作为O(|M|+(a+1)(rbytes+1)),不含ECDSA的点乘与逆元。K、V固定64字节,临时T为O(rbytes)空间。保留每轮K、V日志会另占O(a)条记录,候选大整数另计位数。

签名执行实验可逐行检查候选状态。迁移任务:同一消息中保持摘要最左5位不变而改变其余位,解释教学q=19时bits2octets使生成器输入保持相同;再改为完整256位阶的P-256,说明该判断为何不再由“前5位相同”推出。最后让调用者拒绝一个本来合格的候选,确认下一次迭代没有重启。

参考资料
关系图谱5 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

被这些条目使用