返回首页

Schnorr 和 MuSig2 中的随机数:数学分析和指标

本文介绍了一种数学方法,用于分析 Schnorr 和 MuSig2 加密签名中的隐藏随机数。描述了将签名转换为仿射约束以及用于检测结构模式的指标的方法。详细考察了压缩和连通性模型,并提供了实际实现示例。

随机数几何:Bitcoin 密码分析的数学基础
Advertisement 728x90

Schnorr 和 MuSig2 中隐藏随机数的分析:数学基础与度量指标

现代加密签名方案,如 Schnorr (BIP340) 和 MuSig2 (BIP327),不仅需要有效性验证,还需要对结构特征进行深入分析。本文探讨了一种将签名转化为仿射约束集的方法,以揭示随机数中的隐藏模式。这种方法从二元验证转向对随机数族几何结构的定量评估,这对于部分数据泄露情况下的取证分析至关重要。

仿射表示的核心原理

关键思想是将签名方程解释为仿射约束。对于 BIP340,方程 s = k + e·d mod n 是构建隐藏随机数函数 k_i(d') = s_i - e_i·d' mod n 的基础,其中 d' 是候选私钥。当 d' = d 正确时,该函数能恢复真实的规范随机数。对于错误的候选,该函数会生成具有与真实数据显著不同的统计特性的伪随机族。

BIP340 成员桥接

通过恢复点 R* = sG - eP 的归一化转换,可以严格按照五个标准对签名进行分类:

Google AdInline article slot
  • r 在域内
  • s 在有效范围内
  • 非零点 R*
  • Y 坐标的奇偶性
  • X 坐标匹配

此桥接通过在应用度量前过滤掉垃圾字符串,消除了分析中的假阳性。没有这一阶段,后续分析将易受解析伪影影响。

随机数族的几何结构

压缩度量

对单一密钥的签名集合分析基于测量随机数族 K(d') 的压缩度:

  • 唯一随机数U_k(d') = |{k_i(d')}|
  • 碰撞C_k(d') = m - U_k(d')
  • 差值分析

- 唯一差值:U_Δ(d') = |{Δ_i(d')}|

Google AdInline article slot

- 重复差值:C_Δ(d') = (m-1) - U_Δ(d')

  • 前缀度量(针对 128/64/32/16 位级别):

- U_pref_b(d') = |{Pref_b(k_i(d'))}|

这些度量揭示了特征模式:

Google AdInline article slot
  • 随机数重用 → 碰撞增加
  • 梯形生成 → 重复差值
  • 短随机数 → 高位前缀中异常低的熵

连通性模型

为检测局部结构,使用双层系统:

K_plus = sorted([k_i(d') for i in range(m)])
K_minus = sorted([-k_i(d') % n for i in range(m)])

分析在四种邻域模式(++/--/+-/-+)下进行,计算:

  • 局部差值支持:Support_local(d') = max_mode max_δ count_mode(δ)
  • 重复质量:Mass_repeat(d') = Σ max(count(δ)-1, 0)
  • 各级别(128/96/64/32/16)的前缀支持

这种方法揭示了全局分析无法触及的隐藏簇和局部对称性。

MuSig2 特性

协议有效的线性化

对于 MuSig2,分析不是针对最终签名,而是针对带有完整会话上下文的部分签名。主要组件:

  • 聚合密钥 Q
  • 共享随机数 R
  • 系数 bea
  • 奇偶因子 ggacc

密钥奇偶性确定为 par_key = g·gacc mod n,从而正确处理偶/奇 Y 坐标。部分签名通过从会话上下文中恢复原始随机数,简化为仿射形式。

与 BIP340 的关键差异

  • 没有直接方程 s = k + ed
  • 需要考虑密钥聚合
  • 依赖会话特定参数
  • 双重奇偶处理(密钥 + 随机数)

这要求修改所有度量,使其适用于协议有效结构而非原始数据。

关键要点

  • 成员桥接 — 分析前的必备过滤阶段
  • 压缩度量有效检测重用和梯形模式
  • 连通性分析通过双层模型揭示局部结构
  • MuSig2 需要通过会话上下文单独处理
  • 所有结论基于可测量的数学属性,而非启发式

实际实现

该系统作为 GitHub 上的交互式演示实现。主要组件:

  • BIP340 成员验证器
  • 给定 d' 的仿射族生成器
  • 压缩/连通性度量套件
  • 随机数几何可视化器

示例前缀支持计算:

def top_prefix_support(k_list, bits):
    prefix_mask = (1 << (256 - bits)) - 1
    prefixes = [k & prefix_mask for k in k_list]
    return max(Counter(prefixes).values())

项目工件证实了度量在具有已知漏洞的真实数据上的有效性。重要的是,该系统不直接恢复私钥,而是提供可测信号以供进一步分析。

这种方法扩展了密码分析工具集,将任务从猜测转向可测量的数学属性。对于开发者,它提供了一种验证随机数生成质量并检测实现中隐藏漏洞的方法。

— Editorial Team

Advertisement 728x90

继续阅读