本文会重点基于 ECDSA 的场景介绍安全多方计算框架下的门限签名:
- 安全多方计算(Secure Multi-Party Computation)是一种隐私计算技术,用于多方在不泄露私有输入的情况下计算任意函数。常见概念包括:秘密分享、不经意传输、混淆电路、同态加密等。
- 门限签名(Threshold Signature Scheme)是一种加密数字签名协议,是安全多方计算的实际应用场景。通常用 (t,n) 表达:密钥散布在 n 个人手里,<t 个人一定无法签名成功,但任意 ≥t 个人一定能签名成功。
前置知识
Shamir’s Secret Sharing
1979 年 Shamir 在 How to share a secret 中提出。
目标:在门限 (t,n) 中分享秘密,即 n 个人各自持有部分秘密,任意 t 个人能还原出完整秘密。
原理:秘密是多项式 f(x)=a0+a1x+⋯+at−1xt−1 中的 a0,每次还原时利用拉格朗日插值。
注意:初始时依赖可信赖第三方(Dealer)生成多项式并分发 (x,f(x))。
Fiat-Shamir Heuristic
1986 年 Fiat 和 Shamir 在 How to Prove Yourself: Practical Solutions to Identification and Signature Problems 中提出。
目标:零知识证明(Zero-Knowledge Proof)转为非交互式版本(Non-Interactive Zero-Knowledge Proof)。
原理:把交互式协议中 Verifier 的挑战通过哈希函数来自行生成。
Schnorr Identification Protocol
1989 年 Schnorr 在 Efficient Identification and Signatures for Smart Cards 中提出。
目标:设有限域 Zq 下的生成元是 g,Prover 想在不泄露 α 的情况下证明他知道 α 满足 y=gαmodp。
原理:
- 承诺(Commit):Prover 随机选择 k∈Zq,计算 r=gkmodp 发送给 Verifier。
- 挑战(Challenge):Verifier 随机选择 e∈Zq 并发送给 Prover。
- 响应(Response):Prover 计算 z=k+e⋅αmodp 并发送给 Verifier。
- 验证(Verify):Verifier 检查 gz=?r⋅ye 是否成立。
Feldman Verifiable Secret Sharing
1987 年 Feldman 在 A Practical Scheme for Non-interactive Verifiable Secret Sharing 中提出。
目标:在门限 (t,n) 分享秘密的基础上,保证了 Dealer 在分发 (x,f(x)) 时无法恶意替换。
原理:
- Dealer 在分发的同时声明 c0=ga0,c1=ga1,…,ct−1=gat−1。
- 每个成员收到 (x,f(x)) 后验证 gf(x)=∏icixi 是否成立。
Pedersen Commitment & Pedersen Verifiable Secret Sharing
1991 年 Pedersen 在 Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing 中提出。
Pedersen Commitment 目标:Prover 想针对事先不公开的值 α 提交承诺,使得公开后可验证不可篡改。
Pedersen Commitment 原理:
- 承诺(Commit):Prover 随机选择盲化因子 r∈Zq,计算承诺 C=gαhrmodp 并发送给 Verifier。
- 打开(Open):Prover 公开 (α,r),Verifier 验证 C=?gαhr。
Pedersen Commitment 评价:
- 完美隐藏性:满足信息论安全(Information-Theoretic Secure),即不依赖于计算复杂性假设。
- 计算绑定性:在离散对数困难性下,敌手无法找到 (α′,r′) 使得 (α,r),(α′,r′) 能生成同样的 C。
- (加)同态性:注意到 C1⋅C2=gm1+m2hr1+r2
Pedersen Verifiable Secret Sharing 原理:
- 新增 g(x)=b0+b1x+⋯+bt−1xt−1 这个陪跑多项式,分发时发送 (x,f(x),g(x))。
- Dealer 分发后公布 ci=saitbi 作为承诺,成员验证 sf(x)tg(x)=∏icixi。
Distributed Key Generation
VSS 协议中不依赖 Dealer 的密钥分享算法被称为分布式密钥生成技术(Distributed Key Generation)。
1991 年 Pedersen 在 A Threshold Cryptosystem without a Trusted Party 中提出 Pedersen’s DKG。
- n 个人各自随机选择一个秘密 ui,密钥 x=∑iui。
- 每位参与者把 ui 通过 Feldman VSS t−1 阶多项式分发给其他参与者。记 fj(x) 为表示第 j 位参与者秘密的多项式,那么第 i 位参与者最终会收到 f0(i),f1(i),…,fn−1(i),并计算 xi=∑jfj(i)。
- 当 t 个参与者想要还原私钥时,用他们的 (idi,xidi) 拼成的多项式在 0 处的值即为密钥 x。
1999 年 Gennaro 在 Secure distributed key generation for discrete-log based cryptosystems 中提出恶意参与者可能通过特殊构造的贡献值使得 Pedersen’s DKG 协议泄露共享私钥的信息,并初步给了个新方案。
2006 年,Gennaro 在 Secure Distributed Key Generation for Discrete-Log Based Cryptosystems 中正式提出可证明安全的非交互式的 Gennaro’s DKG,引入了零知识证明、双重验证机制和适应性安全。
Multiplicative-to-Additive
目标:乘法到加法的转换协议。假设 Alice 和 Bob 各自有个秘密值 a∈Zq,b∈Zq,MtA 能在不泄露各自秘密的情况下,让他们各自得到 α∈Zq,β∈Zq 使得 ab=α+βmodq。
MtA 通常使用 Paillier 工具,其具有同态加的特性,详见 《密码学导论》。
ECDSA 多方签名原理
目标
设 G 是有限域下阶为 q 的椭圆曲线,g 是其生成元。私钥是 x,公钥是 y=gx∈G。
- 签名:将待签字符串表示成字符串 m∈Zq,取随机数 k∈Zq,计算 R=gk−1∈G,设 r 是 R 点在椭圆上的横坐标,计算 s=k(m+xr)modq,称 (R,s) 是一组对 m 的签名。
- 验签:计算 R′=gms−1modqgrs−1modq∈G,判断是否满足 r 是 R′ 的横坐标。
上述签名方式与标准流程略有区别(R 处从 gk 改为为 gk−1,s 处从 k−1 改为 k),猜测为了求 s 时更好维护。
现在假设私钥是被 n 个参与者各自维护(即 x=∑xi),他们想基于门限 t 对 m 进行签名但不泄露私钥。
原理
密钥生成时每位参与者各自准备 xi,认为全局私钥为 x=∑xi。
每次签名时每位参与者各自取随机数 ki,认为全局随机数 k=∑ki。
求 r=gk−1 时引入辅助随机数 γ=∑γi,同样由每个参与者各自生成:
gk−1=gγk−1γ−1=(g∑γi)(kγ)−1=(∏gγi)(kγ)−1
注意到各自公开 gγi 不影响 γi 的安全性,只需优雅计算出 kγ 即可。为了求出 kγ,每一组参与者 (i,j) 需要用 MtA 协议将 kiγj 拆解为 kiγj=αi,j+βi,j,即双方各自持有 αi,j 和 βi,j。最后每个参与者求出 δi:
kγ=(∑ki)(∑γi)=i=j∑kiγj+i∑kiγi=i=j∑(αi,j+βi,j)+i∑kiγi=i∑δi=kiγi+j=i∑αi,j+j=i∑βj,i
计算 s 时,每一组参与者 (i,j) 同样用 MtA 将 kixj 拆解为 kixj=μi,j+νi,j,最后每个参与者求出 σi 和 si:
s=k(m+xr)=(i∑mki)+(i∑ki)(i∑xi)r=i∑(si=mki+rσi)σi=kixi+j=i∑μi,j+j=i∑νi,j
GG18 & GG20
原论文:Fast Multiparty Threshold ECDSA with Fast Trustless Setup,鸣谢 sig01 的 讲解。
协议流程
密钥生成阶段
- 每个参与者 i 生成 ui∈Zq,生成承诺 (KGCi,KGDi)=Com(gui) 并广播 KGCi 和 Paillier 公钥 Ei。
- 参与者进行 DKG,即每个参与者基于自身的秘密 ui 进行 (t,n) 的 Feldman-VSS,点对点广播结束后计算出属于自己的 xi。同时每个参与者广播 KGDi,未来签名的私钥是 x=∑iui,公钥是 y=gx=∏igui。
- 每位参与者 i 用 ZKP 证明他们知道 xi(因为 gxi 是公开的)且同态加密的 Ni=piqi 中无平方因子。
参与者集合 S 对消息 m 的签名阶段
- 签名参与者 i∈S 生成 ki,γi∈Zq,计算 [Ci,Di]=Com(gγi) 并广播 Ci。
- 每一组签名参与者 (i,j)∈S 进行两个 MtA 子协议:
- MtA:计算 kiγj=αi,j+βi,j。每个签名参与者 i∈S 生成 δi=kiγi+∑j=iαi,j+∑j=iβj,i。
- MtAwc:计算 kiwj=μi,j+νi,j。每个签名参与者 i∈S 生成 σi=kixi+∑j=iμi,j+∑j=iνj,i。
- 签名参与者 i∈S 广播 δi,大家可以共同还原出 δ=∑i∈Sδi=kγ,并计算 δ−1。
- 签名参与者 i∈S 广播 Di,大家可以共同还原出 R=g(∑i∈Sγi)δ−1=gk−1 并计算 r=H′(R)。
- 签名参与者 i∈S 计算 si=mki+rσi,则签名值满足 s=∑i∈S。为了安全性增加步骤:
- 签名参与者 i∈S 生成 ℓi,γi∈Zq 计算 Vi=Rsigℓi,Ai=gρi,[C^i,D^i]=Com(Vi,Ai) 并广播 D^i。
- 签名参与者 i∈S 用 ZKP 证明他知道 (si,ℓi,ρi) 使得 Vi=Rsigℓi,Ai=gρi(如果证明失败则流程结束)。设 ρ=∑i∈Sρi,ℓ=∑i∈Sℓi,A=∏i∈SAi,那么 V=g−my−r∏i∈SVi 满足 V=gl。
- 签名参与者 i∈S 计算 Ui=Vρi,Ti=Aℓi,[C~i,D~i]=Com(Ui,Ti) 并广播 C~i。
- 签名参与者 i∈S 广播 D~i。大家验证 ∏i∈SUi=?∏i∈STi,若失败则协议终止。
- 经过上述步骤验证后,签名参与者 i∈S 就可以广播 si 了,签名值满足 s=∑i∈Ssi。
Range Proof
GG18 在签名过程中需要对 MtA 子协议进行 Range Proof:利用 Paillier 加密算法来实现 MtA 协议,Bob 计算得到的 α=ab−βmodN 是基于 Paillier 的公钥取模的,而我们希望这个结果能在模 q 域下保持正确。
GG18 核心逻辑是 控制数值范围防止对 N 取模。Alice 把计算公式改为加:Enc(a)⊗b+Enc(β′),注意本地使用 β=−β′modq,这样能在模 q 域下保持 MtA 结果的准确性。如果 (a,b,β′) 在数值上能保证 ab+β′<N,那么 Paillier 流程相当于没有执行 modN 行为,Bob 解开后的 α 一定是模 q 域下正确的。
GG18 为了确保 ab+β′<N 成立,要求 N>q8(密钥生成阶段检查),a<q3(Alice 生成时保证且声明),b<q3,β′<q7(Bob 生成时保证且声明)。这样就有 ab+β′<q3⋅q3+q7<q8<N。
在区块链实践中, q 是 Secp256k1 的 order,256 比特位长度;N 是 2048 比特位长度。
GG20
安全性问题
CMP20
原论文:UC Non-Interactive, Proactive, Threshold ECDSA
Range Proof 细节
enc:(N0,K),证明 ∃k∈±2l 使得 K=Paillier(k;ρ,N0) 。
aff-p:(N0,N1,D,C,Y,X),证明 ∃x∈±2l,y∈±2l′ 使得
X=Paillier(x;ρx,N1),Y=Paillier(y;ρy,N1),D=Cx⋅Paillier(y;ρ,N0)modN02
aff-g:(Gq,g,N0,N1,C,D,Y,X),证明 ∃x∈±2l,y∈±2l′ 使得:
gx=X∈G,Y=Paillier(y;ρ1,N1),D=Cx⋅Paillier(y;ρ0,N0)modN02
log:(Gq,g,N0,C,X),证明 ∃x∈±2l 使得 C=Paillier(x;ρ,N0),X=gx 。
协议流程
CGCMP
这篇论文的形成有一段佳话:Rosario Gennaro 和 Steven Goldfeder 在 CCS 2020 提出了 GG20,而 Ran Canetti、Nikolaos Makriyannis、Udi Peled 同样在 CCS2020 提出了 CMP20;双方在 2021 年合作提出了 CGCMP,里面提供了具有 trade-off 的两个签名方法;双方在 2024 年更新了 CGCMP,统一了签名方法。
