门限 ECDSA:为什么放在最后
学习定位(选修):完成 FROST 综合项目后再读。本章目标是理解非线性 MPC 难点,不要求把门限 ECDSA 纳入核心毕业项目。
学习目标
完成本章后,你应当能够:
- 对比 Schnorr 与 ECDSA 的签名方程;
- 指出门限 ECDSA 中最困难的非线性步骤;
- 解释为什么 Shamir 份额不能直接套入 ECDSA;
- 为后续研究选择合适的协议范围,而不是混合多篇论文。
普通 ECDSA 方程
令私钥为 \(x\),临时随机数为 \(k\),消息摘要为 \(m\)。先计算:
\[ R=kG,\qquad r=x\text{-coordinate}(R)\bmod q \]
签名响应为:
\[ s=k^{-1}(m+rx)\bmod q \]
验证者通过等价的群关系检查签名。
与 Schnorr 的关键差异
Schnorr 的响应:
\[ z=k+cx \]
只包含秘密值的线性组合。Shamir 份额具有线性,因此参与者可以分别计算贡献,再把贡献相加。
ECDSA 中出现了:
- 秘密 \(k\) 的逆元 \(k^{-1}\);
- 秘密值之间的乘法;
- 从秘密共享点 \(R\) 中提取并共同认可 \(r\);
- 中止、恶意输入和偏置 nonce 等额外问题。
加法份额或 Shamir 份额可以本地相加,但两个被分享秘密的乘积通常不能仅靠各方本地计算后直接相加。协议需要安全乘法,例如 MtA、Paillier 同态加密、OT/Beaver triple,以及相应的范围证明或零知识证明。
一个重要的反例
若 \(k=k_1+k_2\),通常有:
\[ (k_1+k_2)^{-1}\ne k_1^{-1}+k_2^{-1} \]
因此“每个人把自己的 nonce 份额求逆,再把结果相加”不是门限求逆。这正是门限 ECDSA 不能照搬门限 Schnorr 的原因之一。
建议的学习顺序
完成 FROST、VSS、DKG 和状态机实验之后,再按下面两层进入 ECDSA:
教学层
- 实现普通 ECDSA;
- 用一个极小、明确标记为不安全的两方算术实验理解秘密乘法;
- 学习加法共享、Beaver triple 或 MtA 的基本思想;
- 只在本地、半诚实模型中演示最终签名等式。
教学层的目标是理解困难来自哪里,而不是得到安全协议。
研究层
- 选择一个现代且修订状态明确的协议族;
- 固定论文版本、安全模型和参与者数量;
- 严格实现其 Paillier/MtA、范围证明、零知识证明和 complaint/abort 过程;
- 对照论文测试向量、参考实现和安全公告;
- 单独评估并发会话、nonce 生成、DoS 和 identifiable abort。
不要把 GG18、GG20、CGGMP21 或其他论文中的局部步骤自由拼接。它们的证明依赖完整协议和特定假设。
为什么“能生成有效签名”远远不够
一个错误的门限 ECDSA 实现仍可能持续生成验证通过的签名,同时泄露长期密钥。以下问题都不会自动体现在最终验证结果中:
- Paillier 参数或证明验证不完整;
- 恶意参与者选择带偏置的输入;
- nonce 预处理材料重复使用;
- 并发会话混淆;
- 范围证明缺失或验证错误;
- 协议中止时泄露可关联信息。
因此本工程在 FROST 完成以前,不把门限 ECDSA 代码列入主线目标。
检查题
- 为什么 \(k^{-1}\) 是门限 ECDSA 的核心难点之一?
- Shamir 的线性性质允许哪些操作,不允许哪些操作?
- 为什么两个参与者各自选择一个 nonce 还不足以构造安全的 ECDSA?
- “签名能通过标准验证器”遗漏了哪些协议安全性质?
- 为什么实现研究论文时必须固定版本和安全模型?