Threshold ECDSA

分为分布式密钥生成和签名,核心内容来自GG18的主要逻辑部分。

ECC

椭圆曲线密码学,基于有限域的椭圆曲线和椭圆曲线离散对数,非对称,私钥为一个整数,公钥为椭圆曲线上的点。

基本概念

椭圆曲线

概念
二元三次方程
最常用的表达式为 { ( x , y ) ∈ R 2 ∣ y 2 = x 3 + a x + b , 4 a 3 + 27 b 2 ≠ 0 } ∪ { 0 } \left\{(x, y) \in \mathbb{R}^{2} \mid y^{2}=x^{3}+a x+b, 4 a^{3}+27 b^{2} \neq 0\right\} \cup\{0\} { (x,y)R2y2=x3+ax+b,4a3+27b2=0}{ 0},右边为一个无穷远的点,用O或者0这个符号表示。左边括号里面右边的条件是为了保证曲线不含奇点(无极限,无定义)
大概长这样,如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P77Z4hOq-1679967655611)(https://cdn.nlark.com/yuque/0/2023/jpeg/28041456/1678245679855-fce244e1-e09c-4df4-b991-67f09b5960b7.jpeg)]

椭圆曲线上的群论
为了建立曲线上点与点之间的联系,在椭圆曲线上定义阿贝尔群(封闭,结合,单位元,逆元,交换):

  • 群中元素为曲线上点,
  • 单位元为无穷处的点,
  • 逆元为关于x轴的对称点,
  • 加法定义为点加,取一条直线与椭圆曲线相交的非零三点P,Q,R,满足 P + Q + R = 0 , P + Q = − R P+Q+R=0,P+Q=-R P+Q+R=0P+Q=R

image.png
加法
椭圆曲线上的计算主要为点加法,也就是已知两点求另外一点,几何法可以直接画图,代数法如下,
考虑P,Q非零,求得R得方法为

  1. 求得斜率 m = y P − y Q x P − x Q m = \frac{y_P-y_Q}{x_P-x_Q} m=xPxQyPyQ
  2. 计算交点R的坐标 x R = m 2 − x P − x Q , y R = y P + m ( x R − x P ) o r y R = y Q + m ( x R − x Q ) x_{R}=m^{2}-x_{P}-x_{Q},y_{R}=y_{P}+m\left(x_{R}-x_{P}\right)\quad or \quad y_{R}=y_{Q}+m\left(x_{R}-x_{Q}\right) xR=m2xPxQyR=yP+m(xRxP)oryR=yQ+m(xRxQ)
  3. 得到坐标 ( x P , y P ) + ( x Q , y Q ) = ( x R , − y R ) \left(x_{P}, y_{P}\right)+\left(x_{Q}, y_{Q}\right)=\left(x_{R},-y_{R}\right) (xP,yP)+(xQ,yQ)=(xR,yR)

有限域上的椭圆曲线

椭圆曲线是连续的,并不适合用于加密;所以,把椭圆曲线变成离散的点,即把椭圆曲线定义在有限域 G F ( p ) GF(p) GF(p)上。形式如下,
{ ( x , y ) ∈ ( F p ) 2 ∣ y 2 ≡ x 3 + a x + b (   m o d   p ) , 4 a 3 + 27 b 2 ≢ 0 (   m o d   p ) } ∪ { 0 } \left\{(x, y) \in\left(\mathbb{F}_{p}\right)^{2} \mid y^{2} \equiv x^{3}+a x+b(\bmod p), 4 a^{3}+27 b^{2} \not \equiv 0(\bmod p)\right\} \cup\{0\} { (x,y)(Fp)2y2x3+ax+b(modp),4a3+27b20(modp)}{ 0}
连续的椭圆曲线在xy轴平面上表现为不相交的点集,如图,
image.png
加法
域上的椭圆曲线加法还是定义为在同一直线的三点P,Q,R
image.png
两点成一条线,有mod运算,所以线是不断重复的,其余计算在前文基础上加一个mod运算即可。

如果让 P = Q P=Q P=Q那么将得到 P + P = 2 P = − R P+P=2P=-R P+P=2P=R 进而得到一种数乘 n P = P + P + ⋯ + P ⏟ n  times  n P=\underbrace{P+P+\cdots+P}_{n \text { times }} nP=n times  P+P++P
注意:这是点加,得到的结果是曲线上的点哦。

而定义在椭圆曲线上的这种数乘,将构成一个循环子群,也就是存在一个n,使得 n P = 0 nP=0 nP=0,这和模加的运算类似,也就是说,nP的集合是一个循环阿贝尔群。这里的P就是循环子群的生成元或者基点。
椭圆曲线的阶:群的表示为群中有多少个点,所以椭圆曲线的阶就是曲线上的点的数目N
**椭圆曲线上某一点的阶:**也就是基点P的阶,定义为满足 n P = 0 nP=0 nP=0的n。
由拉格朗日定理,子群的阶是父群的阶的因子。可以通过找N的所有因子,来找n。也就是说有 N P = n ( h P ) = 0 NP=n(hP)=0 NP=n(hP)=0,h永远为一个整数,令 G = h P G=hP G=hP,可以得到点G生成了一个阶为n的一个子群。

一般离散对数问题

给定一个整数b和一个质数p的一个原根a,找到一个唯一的指数i,使得 b = a i   m o d   p b = a^i\bmod p b=aimodp成立,其中 0 ≤ i ≤ p − 1 0\leq i\leq p-1 0ip1

椭圆曲线上的离散对数问题

是指给定两个椭圆曲线上的点 G 和 H,找到一个整数 d,使得 H = d G H = dG H=dG

算法思想

ElGamal
基于离散对数问题
image.png
EC EIGamal
简单描述,私钥为小于子群阶n的整数d,即 d ∈ { 1 , … , n − 1 } d \in \{1,\dots,n-1\} d{ 1,,n1},公钥为点H,即 H = d G H=dG H=dG,G为子群的基点,根据椭圆曲线上的离散对数难题得知,知道H和G求得d是很难的。
image.png

DSA

数字签名算法,安全性依赖于离散对数问题。
大致过程
主要参数

  • p:大素数
  • q:q是 p-1的一个素因子
  • y: y = g x   m o d   p y=g^x \bmod p y=gxmodp
  • g: g = h ( p − 1 ) / q   m o d   p g=h^{(p-1)/q} \bmod p g=h(p1)/qmodp,(1<h<p-1)

以上为公开的参数

  • x:随机私钥,0<x<p
  • k:随机数,0<k<p
  • H:哈希

签名:
r = ( g k m o d    p )   m o d   q r=(g^k \mod p) \bmod q r=(gkmodp)modq
s = k − 1 ( H ( m ) + x r ) )   m o d   q s=k^{-1} ( H(m)+xr ))\bmod q s=k1(H(m)+xr)modq
签名为(r,s)
验证:
分别计算 w = s − 1 m o d    q w=s^{-1} \mod q w=s1modq, u 1 = ( H ( m ) × w )   m o d   q u_1 = (H(m)\times w)\bmod q u1=H(m)×wmodq, u 2 = ( r w )   m o d   q u_2 = (rw) \bmod q u2=(rw)modq v = ( ( g u 1 × y u 2 )   m o d   p )   m o d   q v = ((g^{u_1} × y^{u_2}) \bmod p) \bmod q v=((gu1×yu2)modp)modq
然后比较v和r,相等则验证成功。

ECDSA

ECC+DSA,广泛用于数字加密货币
签名过程和DSA类似,需要选用安全的哈希函数,为了使哈希结果的比特长度和子群的阶n的比特长度一致,消息的哈希结果需要被截断,被截断后的哈希值会是一个整数。后文暂定为z,即 z = H ( m ) z=H(m) z=H(m)
大致过程
H A = d A G H_A=d_AG HA=dAG公钥为 H A H_A HA,私钥为 d A d_A dA

  • 签名
    1. 选择一个随机数 k , ( 1 < k < n ) k,(1<k<n) k,(1<k<n)n为子群的阶
    2. 计算 P = k G P=kG P=kG,G为子群的基点
    3. 计算 r = x p   m o d   n r=x_p \bmod n r=xpmodn,x为点P的x轴坐标,若 r = 0 r=0 r=0则重新选一个k来计算
    4. 计算 s = k − 1 ( z + r d A )   m o d   n s=k^{-1}(z+rd_A)\bmod n s=k1(z+rdA)modn,z为被截断的消息哈希值,是一个整数, d A d_A dA是私钥,如果 s = 0 s=0 s=0,重新选择一个k计算。
    5. ( r , s ) (r,s) (r,s)就作为签名。
  • 验证
    1. 计算整数 u 1 = s − 1 z   m o d   n u_1 = s^{-1}z\bmod n u1=s1zmodn
    2. 计算整数 u 2 = s − 1 r   m o d   n u_2=s^{-1}r\bmod n u2=s1rmodn
    3. 计算点 P = u 1 G + u 2 H A P=u_1G+u_2H_A P=u1G+u2HA

正确性验证一下
KaTeX parse error: {align} can be used only in display mode.

涉及到阈值 ECDSA

Threshold cryptosystems

概述

基础概念

门限密码主要解决的是,传统公钥密码中由于私钥唯一,而可能导致的单点故障问题,如密钥丢失,单点权限过高或者该点被攻击者控制而导致安全风险问题等等。
它通过将密钥信息分享给多个用户分散保存, 密码功能操作可由至少门限值个用户 协作完成, 而且任意少于门限数量的用户无法进行合谋. 简而言之,就是密钥信息被拆成多个零散的碎片,由多个用户保存,其中一定数量的用户一起使用自己的密钥信息就可以合成密钥,这个数量就是门限。
这有点像特殊的多方安全计算, 多个用户秘密地分享了密钥 信息, 在进行解密/签名操作时, 用户可使用自己的私钥, 通过多方安全计算的模式多方协作解密密文/签名消息。
这样做,一方面提高了系统的健壮性, 即使少量用户丢失 密钥, 不会导致密码系统丧失功能性. 另一方面, 提高了系统的安全性, 恶意敌手即使窃取了部分 (少于门限值) 用户的密钥, 也难以打破密码系统的安全性。

分类

  • 门限密码主要包括门限加密门限签名,这和传统公钥中的两种操作类似。
  • 全分布式和非交互式:系统公钥和各个用户私钥是由用户们自行交互生成,而不需要密钥生成中心,则称全分布式的门限密码。而在解密/签名时,无需用户之间或者和用户和组合器之间的交互的话,则称为非交互式的门限密码

攻击模型

  • 静态攻击模型: 敌手在系统参数发布前先选定攻击的目标用户, 可获得目标用户的私钥信 息
  • 自适应攻击模型: 敌手可在系统运行的任何时刻,根据具体的攻击情况自适应地选择攻击的目标用户, 获得目标用户的私钥信息

一些特性

  • 紧致性:公钥尺寸和密文/签名尺寸与参与 用户的数量无关。
  • 鲁棒性 : 各用户的解密/签名分享的正确性可被公开验证。
  • 全分布式:系统的公钥和用户的私钥可由用户自己通过交互生成, 避免了密钥生成中心的权限过大或者被攻击者 控制等带来的安全风险。
  • 抗合谋:门限密码系统要求参与的用户数量达到门限值, 才能正确完成密码 操作, 防止了单个用户失败导致整个系统瘫痪, 同时防止任意少于门限值个用户合谋。

门限加密

它包含密钥生成、加解密、消息组合器(combiner)几个过程。 解密的时候用户使用自己的私钥解密 密文, 并将解密分享发送给消息组合器, 消息组合器在接收到门限值数量个解密分享时就可以组合还原出原消息。

算法

  • K e y G e n ( λ , n , t ) : KeyGen(λ, n, t): KeyGen(λ,n,t): 密钥生成算法输入安全参数 λ, 用户数量 n 和门限值 t, 输出公钥 pk 和用户私钥分享 s k = ( s k i d 1 , … , s k i d n ) sk = (sk_{id_1} , \dots, sk{id_n} ) sk=(skid1,,skidn)
  • E n c ( p k , m ) : Enc(pk, m): Enc(pk,m): 加密算法输入公钥 pk 和消息 m, 输出密文 c。
  • D e c ( s k i d , c ) : Dec(sk_{id}, c): Dec(skid,c): 解密算法输入任意用户的私钥分享 s k i d sk_{id} skid 和密文 c, 输出解密分享 c i d c_{id} cid
  • C o m b i n e ( c i d i 1 , … , c i d i t ) : Combine(c_{id_{i1}} , \dots , c_{id_{it}} ): Combine(cidi1,,cidit): 消息组合算法输入任意 t 个解密分享 c i d i 1 , … , c i d i t c_{id_{i1}} , \dots , c_{id_{it}} cidi1,,cidit, 输出消息 m。

门限签名

它包括密钥生成、签名和验签过程, 以及一个签名组合器。签名时, 用户使用自己的私钥签名消息, 并将签名分享发送给签名组合器, 签名组合器在接收到门限值数量个签名分享时就可以组合还原出该消息的签名。

算法

  • K e y G e n ( λ , n , t ) : KeyGen(λ, n, t): KeyGen(λ,n,t): 密钥生成算法输入安全参数 λ, 用户数量 n 和门限值 t, 输出验证公钥 vk 和用 户私钥 s k = ( s k i d 1 , … , s k i d n ) sk = (sk_{id_1} , \dots, sk_{id_n} ) sk=(skid1,,skidn)
  • S i g n ( s k i d , m ) : Sign(sk_{id}, m): Sign(skid,m):签名算法输入任意用户私钥 s k i d sk_{id} skid 和消息 m, 输出签名分享 σ i d σ_{id} σid
  • C o m b i n e ( σ i d i 1 , ⋅ ⋅ ⋅ , σ i d i t ) : Combine(σ_{id_{i1}} , · · · , σ_{id_{it}} ): Combine(σidi1,⋅⋅⋅,σidit):签名组合算法输入任意 t 个签名分享 σ i d i 1 , ⋅ ⋅ ⋅ , σ i d i t σ_{id_{i1}} , · · · , σ_{id_{it}} σidi1,⋅⋅⋅,σidit , 输出签名 σ。
  • V e r i f y ( v k , m , σ ) : Verify(vk, m, σ): Verify(vk,m,σ):验证算法输入验证公钥 vk, 消息 m 和签名 σ, 当签名验证成功时输出 1, 否则输 出 0。

多重签名与门限签名
提一嘴多重签名,顾名思义,它依赖于拥有单独而且唯一的密钥的各方,需要他们用这些密钥来一个接着一个的对一笔交易签名,验证者就需要分别检查每一个签名。而门限签名只有一把公钥,一把密钥和一个签名,验证者只需验证一个签名即可。

Threshold ECDSA

基本概念

基于椭圆曲线数字签名算法(ECDSA)的分布式密钥生成和签名协议。它允许多个参与方共享一个ECDSA密钥对,并且只有当达到一定数量的参与方同意时才能生成有效的签名。
阈值ECDSA的工作原理大致如下:

  1. 首先,参与方通过一个可信的设置协议生成一个共享的ECDSA密钥对,并将其分解为多个分片,每个参与方持有一个分片。
  2. 然后,当需要签名一条消息时,参与方通过一个安全的多方计算协议计算出一个共享的随机数(nonce)和它对应的椭圆曲线点。
  3. 接着,参与方使用自己的密钥分片和共享的nonce来计算出签名的一部分,并将其发送给其他参与方。
  4. 最后,如果收到足够数量(达到阈值)的签名部分,任何一个参与方都可以将它们组合成一个完整的ECDSA签名,并将其附加到消息上。

G-DSA

这是个统一DSA和ECDSA两种方案的签名
公开的参数有
image.png
密钥生成,签名和验证
image.png
image.png
相关注释,不同方案的乘法操作和 H ′ ( ) H'() H()函数的处理不同。
image.png

DKG (Distributed Key Generation)

这里使用的是Pedersen’s DKG,然后增加了一些手段来保证安全。
下面是大致的描述
不需要Dealer的秘密共享 ( n , t ) (n,t) n,t

  1. 首先每个参与者 P i P_i Pi随机选择一个秘密值 u i u_i ui,计算一个陷门承诺 [ K G C i , K G D i ] = C o m m i t ( g u i ) [KGC_i,KGD_i]=Commit(g^{u_i}) [KGCi,KGDi]=Commit(gui),并广播 K G C i KGC_i KGCi承诺,同时每个参与者还需要广播自己的用于MtA的Paillier同态加密算法的公钥 E i E_i Ei

下面是陷门承诺的方案描述。
image.png

  1. 接着每个参与者公布 K G D i KGD_i KGDi(用于承诺验证),让 y i y_i yi作为解开的承诺,即 y i = g u i y_i=g^{u_i} yi=gui公钥就是 Y = ∏ i = 1 n y i Y=\prod_{i=1}^n y_i Y=i=1nyi

然后每个参与者都把自己的 u i u_i ui作为主秘密,通过Feldman vss的方式分享给其他的参与者。
(也就是每个参与者都单独作为一个Dealer,每个人都随机选择一个 t − 1 t-1 t1阶多项式,对所有人包括自己分发子秘密 f u i ( j ) = u i j f_{ui}(j)=u_{ij} fui(j)=uij,每个人的标号不变,固定 [ 1 , n ] [1,n] [1,n],这样每个人加上自己的会收到共 n n n个子秘密值)

  1. 最后每个参与者都把自己收到的秘密值加起来( n n n个)得到 f X ( i ) = x i = ∑ j = 1 n u i j f_X(i)=x_i=\sum_{j=1}^n u_{ij} fX(i)=xi=j=1nuij,这样整体的秘密值(私钥 X = ∑ i = 1 n x i X=\sum_{i=1}^n x_i X=i=1nxi

Signature Generation

签名思路

要把ECDSA算法改为分布式的,核心在于如何对算法里的某些参数进行合理的确保安全性的拆分。这里的主要思路是拆分ECDSA算法中的随机数为 k = ∑ k i k=\sum k_i k=ki与私钥 x = ∑ w i x=\sum w_i x=wi之和,只有参与者知道自己的数据。
求签名中的r
根据签名的G-DSA算法,求 r r r需要求得 R = g k − 1 R=g^{k^{-1}} R=gk1,方案的思路为,引入一个变量 γ \gamma γ,也拆分为几个之和。如下
R = g k − 1 = g γ k − 1 γ − 1 = g ( ∑ γ i ) k − 1 γ − 1 = ( g ( ∑ γ i ) ) ( k γ ) − 1 = ( ∏ g γ i ) ( k γ ) − 1 \begin{aligned} R & =g^{k^{-1}} \\ & =g^{\gamma k^{-1} \gamma^{-1}} \\ & =g^{\left(\sum \gamma_{i}\right) k^{-1} \gamma^{-1}} \\ & =\left(g^{\left(\sum \gamma_{i}\right)}\right)^{(k \gamma)^{-1}} \\ & =\left(\prod g^{\gamma_{i}}\right)^{(k \gamma)^{-1}} \end{aligned} R=gk1=gγk1γ1=g(γi)k1γ1=(g(γi))()1=(gγi)()1
每个参与者单独计算 g γ i g^{\gamma _i} gγi σ i = k i γ i \sigma_i = k_i\gamma_i σi=kiγi并公开,这样不会泄漏每个 k i k_i ki γ i \gamma_i γi
求签名中的s
类似的,也是拆分为 σ i = k i w i \sigma_i = k_iw_i σi=kiwi的和的形式,如下(假设有三个参与者)
s = k ( m + x r ) = ( ∑ k i ) m + k x r = ( k 1 + k 2 + k 3 ) m + ( σ 1 + σ 2 + σ 3 ) r = ( m k 1 + r σ 1 ) + ( m k 2 + r σ 2 ) + ( m k 3 + r σ 3 ) = s 1 + s 2 + s 3 = ∑ s i \begin{aligned} s & =k(m+x r) \\ & =\left(\sum k_i\right) m+k x r \\ & =\left(k_{1}+k_{2}+k_{3}\right) m+\left(\sigma_{1}+\sigma_{2}+\sigma_{3}\right) r \\ & =\left(m k_{1}+r \sigma_{1}\right)+\left(m k_{2}+r \sigma_{2}\right)+\left(m k_{3}+r \sigma_{3}\right) \\ &= s_1+s_2+s_3=\sum s_i \end{aligned} s=k(m+xr)=(ki)m+kxr=(k1+k2+k3)m+(σ1+σ2+σ3)r=(mk1+rσ1)+(mk2+rσ2)+(mk3+rσ3)=s1+s2+s3=si

MtA(Multiplicative-to-Additive)

乘法转加法,需要用到加法同态算法(这里是paillier算法)。为什么用?因为乘法会使得多项式的阶数翻倍,从而让签名的门限人数增加,必须要让它降下来。
该协议功能为在双方不泄露自己的 a a a b b b的情况下,可以分别得到另外一个秘密值 α \alpha α β \beta β
a b = α + β   m o d   q ab=\alpha + \beta \bmod q ab=α+βmodq
协议流程
假设有两个用户A和B

  1. A to B:

发送 c A = E p k A ( a ) c_A=E_{pk_A}(a) cA=EpkA(a)

  1. B to A:

选择一个 β \beta β,计算发送 b × c A + c A E A ( − β ) = E p k A ( a b − β ) b\times_{c_A}+_{c_A}E_A(-\beta)=E_{pk_A}(ab-\beta) b×cA+cAEA(β)=EpkA(abβ)
注意符号,具体计算看看这个,
image.png

  1. A解密即可得到 α \alpha α

签名流程

一共五个阶段,首先根据MtA协议求得人数为 t t t

  1. Phase 1
  • 每位参与者随机选取 k i k_i ki γ i \gamma_i γi(前面思路拆分中有提到), k = ∑ k i , γ = ∑ γ i k=\sum k_i,\gamma = \sum \gamma_i k=ki,γ=γi
  • 计算承诺

计算 C o m m i t ( g γ i ) = [ C i , D i ] Commit(g^{\gamma_i})=[C_i,D_i] Commit(gγi)=[Ci,Di],并公布 C i C_i Ci

  1. Phase 2

每两个人之间都进行两次MtA协议。

  • 第一次MtA协议:(计算 k γ k\gamma

P i , P j P_i,P_j Pi,Pj k i , γ j k_i,\gamma_j ki,γj使用MtA,将 P i P_i Pi得到的结果记为 α i j \alpha_{ij} αij,将得到的结果记为 β i j \beta_{ij} βij,得到 k i γ j = α i j + β i j k_i\gamma_j=\alpha_{ij}+\beta_{ij} kiγj=αij+βij
定义 δ i = k i γ i + ∑ j ≠ i α i j + ∑ j ≠ i β j i \delta_i=k_i\gamma_i+\sum_{j \neq i}\alpha_{ij}+\sum_{j \neq i}\beta_{ji} δi=kiγi+j=iαij+j=iβji,这样如果每位参与者都公开自己的 δ i \delta_i δi,所有参与者就可以在不公布自己的 ( k i , γ i ) (k_i,\gamma_i) (ki,γi)的情况下求得 k γ = ( ∑ k i ) ⋅ ( ∑ γ i ) = ∑ δ i k\gamma=(\sum k_i) \cdot (\sum \gamma_i)=\sum \delta _i =(ki)(γi)=δi
举例
假设有三个人,分别选择 ( k 1 , γ 1 ) , ( k 2 , γ 2 ) , ( k 3 , γ 3 ) (k_1,\gamma_1),(k_2,\gamma_2),(k_3,\gamma_3) (k1,γ1),(k2,γ2),(k3,γ3),这样两两进行两次MtA协议(一共六次),将得到$[k_1\gamma_2,k_1\gamma_3],[k_2\gamma_1,k_2\gamma_3],[k_3\gamma_1,k_3\gamma_2] 3 对, 6 个值,再加上自己的三个值 3对,6个值,再加上自己的三个值 3对,6个值,再加上自己的三个值k_1\gamma_1,k_2\gamma_2,k_3\gamma_3 就能组成 就能组成 就能组成\delta_i ,如 ,如 ,如\delta_1 = k_1\gamma_1+\alpha_{12}+\alpha_{13}+\beta_{21}+\beta_{31}$,一共3组。

  • 第二次MtA协议:(计算 k x kx kx

类似第一次的, P i , P j P_i,P_j Pi,Pj k i , w j k_i,w_j ki,wj使用MtA,将 P i P_i Pi得到的结果记为 μ i j \mu_{ij} μij,将得到的结果记为 ν i j \nu_{ij} νij,得到 k i w j = μ i j + ν i j k_iw_j=\mu_{ij}+\nu_{ij} kiwj=μij+νij,同样的定义 σ i = k i w i + ∑ j ≠ i μ i j + ∑ j ≠ i ν j i \sigma_i=k_iw_i+\sum_{j \neq i}\mu_{ij}+\sum_{j \neq i}\nu_{ji} σi=kiwi+j=iμij+j=iνji,这样也可以和上面类似,求得 k x = ( ∑ k i ) ⋅ ( ∑ w i ) = ∑ σ i kx=(\sum k_i) \cdot (\sum w_i)=\sum \sigma _i kx=(ki)(wi)=σi

  1. Phase 3

每位参与者都公开自己的 δ i \delta_i δi,所有参与者计算出 k γ k\gamma

  1. Phase 4 (求 r r r
  • 所有参与者公布 D i D_i Di,让 Γ i = g γ i \Gamma_i=g^{\gamma_i} Γi=gγi作为承诺解开的值,然后求得 R = [ ∏ Γ i ] δ − 1 = g k − 1 R=[\prod\Gamma_i]^{\delta^{-1}}=g^{k^{-1}} R=[Γi]δ1=gk1,最后求出 r = H ′ ( R ) r=H'(R) r=H(R)
  1. Phase 5(求 s s s

s s s是一个Additive Sharing。
每位参与者计算 s i = m k i + r σ i s_i=mk_i+r\sigma_i si=mki+rσi,求和 s = ∑ s i s=\sum s_i s=si就可以得到 s s s
这里没有选择直接公布 σ i \sigma_i σi,而是增加了一系列验证手段来提升安全性。如下
image.png

  • 这里引入了一组随机的 g ℓ i g^{\ell_i} gi值用作 R s i R^{s_i} Rsi的掩码,形成加码后的 V i = R s i g ℓ i V_i=R^{s_i}g^{\ell_i} Vi=Rsigi

image.png

image.png

  • 那么显然不能通过暴露 g ℓ i g^{\ell_i} gi去检查 V V V的正确性,于是又引入了一个$U

=g^{\ell_\rho}$

image.png

  • 然后是各位参与者一起通过分布式DH交换来计算 U U U,验证成功后还原 s s s

image.png

Reshare

也就是动态的改变门限,假定为(5,3),要变为(8,5)。

(n,t) to Additive Sharing方法

它,将Feldman-VSS方案转换为Additive sharing方案,假设整体的秘密(私钥)是 X X X,用Feldman VSS方案得到一组门限 ( n , t ) (n,t) (n,t)的子秘密 x i x_i xi,现在要将这个方案变为转换为划分数为 X = ∑ t i X=\sum t_i X=ti的加法分享方案。
原理就是拉格朗日插值法,详见秘密共享
具体的方案就是 t i = λ i ⋅ x i t_i=\lambda_i \cdot x_i ti=λixi得到,其中 λ i \lambda_i λi是对应的拉格朗日系数,也就是 ℓ ( x ) = ∏ j = 0 , i ≠ j t x − x j x i − x j \ell(x)=\prod_{ {j}=0, {i} \neq {j}}^{ {t}} \frac{ {x}-{x}_{ {j}}}{ {x}_{ {i}}-{x}_{ {j}}} (x)=j=0,i=jtxixjxxj。(系数特点是,在 x = x i x=x_i x=xi的时候取值为1,在其他值取值为0)。

转换方法

具体方法是先使用调用(n,t) to Additive Sharing方法,将它转化为Additive Sharing,这里是将总体的秘密值转换为了3个之和,然后选择5位新增参与者选择随机数秘密值为 u i = 0 u_i=0 ui=0,代入DKG流程,这样就把总数变为了8,期间选择的多项式为4阶的即可将门限变更为5。这样就可以改变门限。

参考

椭圆曲线加密算法(中文翻译) 英文原文
椭圆密码学原理
ECC椭圆曲线详解
DSA简介
Multiparty Threshold ECDSA
Commitment Scheme
TU B B, CHEN Y. A Survey of Threshold Cryptosystems. Journal of Cryptologic Research. 2020, 7(1): 1-14 https://doi.org/10.13868/j.cnki.jcr.000344
Rosario Gennaro and Steven Goldfeder. 2018. Fast Multiparty Threshold ECDSA with Fast Trustless Setup. In Proceedings of the 2018 ACM SIGSAC Conference on Computer and Communications Security (CCS '18). Association for Computing Machinery, New York, NY, USA, 1179–1194. DOI:https://doi.org/10.1145/3243734.3243859

猜你喜欢

转载自blog.csdn.net/qq_43271194/article/details/129809580