【施工中】开坑后一定更有动力写!
前置知识
Shamir’s Secret Sharin
1979 年 Adi Shamir How to share a secret
在门限 (t,n) 中分享秘密,即 n 个人持有部分秘密,任意 t 个人能还原出完整秘密。
原理:秘密是多项式 f(x)=a0+a1x+⋯+at−1xt−1 中的 a0,每次还原时利用多项式插值。
注意:初始时依赖可信赖第三方(Dealer)生成多项式并分发 (i,f(i))。
Verifiable Secret Sharing
Feldman VSS
1987 年 Feldman A Practical Scheme for Non-interactive Verifiable Secret Sharing
保证了 Dealer 在分发 (x,f(x)) 时无法恶意替换。
原理:Dealer 分完后声明 c0=ga0,c1=ga1,…,ct−1=gat−1;每个成员收到 (x,f(x)) 后验证 gf(x)=∏icixi
Pedersen VSS
1991 年 Pedersen Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing
新增 g(x)=b0+b1x+⋯+bt−1xt−1 这个陪跑多项式,分发时发送 (x,f(x),g(x))。
Dealer 公布 ci=saitbi,被称为 commitment。每个成员验证 sf(x)tg(x)=∏icixi。
Pedersen VSS 是 Information-Theoretic Secure(信息论安全的),即安全性不依赖于任何计算复杂性假设。
Publicly Verifiable Secret Sharing
1996 年 Stadler Publicly Verifiable Secret Sharing 中提出。
Distributed Key Generation(DKG)
1991 年 Pedersen A Threshold Cryptosystem without a Trusted Party 中提出的,可称为 Pedersen’s DKG( Joint Feldman DKG)。基于 Feldman VSS。
2006 年,Rosario Gennaro Secure Distributed Key Generation for Discrete-Log Based Cryptosystems 中提出的,可称为 Gennaro DKG。基于 Pedersen VSS。
Schnorr
交互式改非交互式,核心是 Verifier 给出的数值都用哈希产生。
Multiplicative-to-Additive
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 点在椭圆上的 x 坐标,计算 s=k(m+xr)modq,称 (R,s) 是一组对 m 的签名。
- 验签:判定 gm/sgr/s=Rmodq 是否成立。
上述签名方式与标准流程略有区别(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 的 讲解。
协议流程
门限
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
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,统一了签名方法。
