分为分布式密钥生成和签名,核心内容来自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)∈R2∣y2=x3+ax+b,4a3+27b2=0}∪{0},右边为一个无穷远的点,用O或者0这个符号表示。左边括号里面右边的条件是为了保证曲线不含奇点(无极限,无定义)
大概长这样,如图

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

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


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

  1. 求得斜率 m = y P − y Q x P − x Q m = \frac{y_P-y_Q}{x_P-x_Q} m=xP​−xQ​yP​−yQ​​
  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​=m2−xP​−xQ​,yR​=yP​+m(xR​−xP​)oryR​=yQ​+m(xR​−xQ​)
  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​)2∣y2≡x3+ax+b(modp),4a3+27b2≡0(modp)}∪{0}
连续的椭圆曲线在xy轴平面上表现为不相交的点集,如图,

加法
域上的椭圆曲线加法还是定义为在同一直线的三点P,Q,R

两点成一条线,有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 0≤i≤p−1。

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

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

算法思想

ElGamal
基于离散对数问题

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

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(p−1)/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=k−1(H(m)+xr))modq
签名为(r,s)
验证:
分别计算 w = s − 1 m o d q w=s^{-1} \mod q w=s−1modq, u 1 = ( H ( m ) × w ) m o d q u_1 = (H(m)\times w)\bmod q u1​=(H(m)×w)modq, 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​=dA​G公钥为 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=xp​modn,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=k−1(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​=s−1zmodn
    2. 计算整数 u 2 = s − 1 r m o d n u_2=s^{-1}r\bmod n u2​=s−1rmodn
    3. 计算点 P = u 1 G + u 2 H A P=u_1G+u_2H_A P=u1​G+u2​HA​

正确性验证一下
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两种方案的签名
公开的参数有

密钥生成,签名和验证


相关注释,不同方案的乘法操作和 H ′ ( ) H'() H′()函数的处理不同。

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​。

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

整体的私钥就是 X = ∑ 1 n u i X=\sum_1^n u_i X=∑1n​ui​
2. 接着每个参与者公布 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=1n​yi​。

然后每个参与者都把自己的 u i u_i ui​作为主秘密,通过Feldman vss的方式分享给其他的参与者。
(也就是每个参与者都单独作为一个Dealer,每个人都随机选择一个 t − 1 t-1 t−1阶多项式,对所有人包括自己分发子秘密 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=1n​uij​, x i x_i xi​就是 x x x的 ( t , n ) (t,n) (t,n)共享。

Signature Generation

首先将 x i x_i xi​ ( t , n ) (t,n) (t,n)共享转换为 ( t , t + 1 ) (t,t+1) (t,t+1)共享,也就是转换为加法共享满足 x = ∑ w i x=\sum w_i x=∑wi​,参看后面Reshare的(n,t) to Additive Sharing方法部分

签名思路

要把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=gk−1,方案的思路为,引入一个变量 γ \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​=gk−1=gγk−1γ−1=g(∑γi​)k−1γ−1=(g(∑γi​))(kγ)−1=(∏gγi​)(kγ)−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​=ki​wi​的和的形式,如下(假设有三个参与者)
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算法)。为什么用MtA?因为要计算两数之和 a b = ∑ a i ∑ b i ab=\sum a_i \sum b_i ab=∑ai​∑bi​的联合运算,假设,一方持有 ( a 1 , b 1 ) (a_1,b_1) (a1​,b1​),另一方持有 ( a 2 , b 2 ) (a_2,b_2) (a2​,b2​),要计算 a b = a 1 b 1 + a 2 b 2 + a 1 b 2 + a 2 b 1 ab=a_1b_1+a_2b_2+a_1b_2+a_2b_1 ab=a1​b1​+a2​b2​+a1​b2​+a2​b1​。每一方可以单独计算自己的 ( a 1 b 1 , a 2 b 2 ) (a_1b_1,a_2b_2) (a1​b1​,a2​b2​),要想不泄露自己的私有秘密 ( a 1 , b 1 ) (a_1,b_1) (a1​,b1​)或 ( a 2 , b 2 ) (a_2,b_2) (a2​,b2​)去得到 ( a 1 b 2 , a 2 b 1 ) (a_1b_2,a_2b_1) (a1​b2​,a2​b1​)就可以通过Mta协议来实现。
该协议功能为在双方不泄露自己的 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​​+cA​​EA​(−β)=EpkA​​(ab−β)
注意符号,具体计算看看这个,

  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 kγ

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 kγ=(∑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} ki​wj​=μ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​=ki​wi​+∑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 kγ

  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=gk−1,最后求出 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​,而是增加了一系列验证手段来提升安全性。如下

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

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

=g^{\ell_\rho}$

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

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,n)共享的n份,变为加法共享的t份之和。
具体操作是使 ω i = λ i × x i ω_i=\lambda_i×x_i ωi​=λi​×xi​,其中 λ i \lambda_i λi​是拉格朗日基础多项式 ℓ i ( x ) 在 x = 0 \ell_i (x)在x=0 ℓi​(x)在x=0的时候的取值,也就是说得到私钥 X = ∑ ω i X=\sumω_i X=∑ωi​ 。因为任取t份(t,n)共享是可以通过拉格朗日恢复出原多项式的,任取的点变成了 ( i , x i ) (i,x_i) (i,xi​)
f ( x ) = y 1 f 1 ( x ) + y 2 f 2 ( x ) + y 3 f 3 ( x ) f(x)=y_1 f_1 (x)+y_2 f_2 (x)+y_3 f_3 (x) f(x)=y1​f1​(x)+y2​f2​(x)+y3​f3​(x)
f ( x ) = S + a 1 x + a 2 x 2 + … + a ( t − 1 ) x ( t − 1 ) f(x)=S+a_1 x+a_2 x^2+…+a_{(t-1)} x^{(t-1)} f(x)=S+a1​x+a2​x2+…+a(t−1)​x(t−1)
前面的 x i x_i xi​就是 y i y_i yi​,所以 ω i = y i × ℓ i ( x ) = x i × f i ( x ) ω_i=y_i×\ell_i (x)=x_i×f_i (x) ωi​=yi​×ℓi​(x)=xi​×fi​(x)

转换方法

具体方法是先使用调用(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

Threshold ECDSA相关推荐

  1. MPC Multiparty Threshold ECDSA (GG18实现原理)

    目录 1. 简介 2. Generic DSA signature 2.1. ECDSA 门限签名的难点 3. 主要思路 3.1. 求签名中的 r 3.2. 求签名中的 s 4. 协议描述 4.1.  ...

  2. 国际安全领域顶会NDSS 2023录稿整理 (下)

    隐私计算研习社 NDSS是网络和系统安全领域的四大顶级国际学术会议(BIG4)之一,第三十届会议于2023年2月27日到3月3日,在美国圣迭戈举办.本文将接着整理剩余论文,并对论文进行分类,感兴趣的小 ...

  3. Java并发编程的艺术_Conc

    Java并发编程的艺术 1 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制.时间片是CPU分配给各个线程的时间,因为时间片 ...

  4. cv2.threshold() 阈值:使用Python,OpenCV进行简单的图像分割

    图像分割有多种形式. 聚类.压缩.边缘检测.区域增长.图分区.分水岭等等:(Clustering. Compression. Edge detection. Region-growing. Graph ...

  5. python opencv local_threshold_Python-OpenCV中的cv2.threshold

    主要记录Python-OpenCV中的cv2,threshold()方法:官方文档 cv2.threshold() def threshold(src, thresh, maxval, type, d ...

  6. threshold 二值化的实现

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" in ...

  7. Opencv java 二值化函数threshold (10)

    函数理解 threshold 英语的意思是门槛,门槛的意思说要么在门槛外,要么在门槛内,并且门槛具有一定的条件要求 接下来我们看在opencv中如何使用该函数 Imgproc.threshold(sr ...

  8. pandas基于dataframe特定数据列的指定阈值将原dataframe分割成两个dataframe(split dataframe based on column value threshold

    pandas基于dataframe特定数据列的指定阈值将原dataframe分割成两个子dataframe(split dataframe based on column value threshol ...

  9. python判断列表list中的内容、数值是否全部都大于某一个阈值(threshold)、如果数值都大于某一个阈值(threshold)则跳出循环

    python判断列表list中的内容.数值是否全部都大于某一个阈值(threshold).python判断列表list中的内容是否全部都大于某一个阈值(threshold).如果数值都大于某一个阈值则 ...

最新文章

  1. mllib逻辑回归 spark_Spark架构详解——分布式流计算内存批处理迭代运算框架
  2. DPDK pmd驱动初始化(十九)
  3. linux下oracle数据库由于参数文件丢失导致的数据库服务启动失败,报“failure in processing system parameters“错误问题解决
  4. UA MATH566 统计理论5 假设检验:p值
  5. 自媒体时代的主流媒体不可替代
  6. linux mv 保持目录结构_Linux中的mv命令详解
  7. 【Linux】一步一步学Linux——newgrp命令(91)
  8. oracle model 分组,【已解决】关于Oracle分组函数高级用法(按照N条分组并生成唯一号)...
  9. goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.6:generate failed: Index: 0, Size: 0
  10. xmind-HTTP协议
  11. LeetCode 98. 验证二叉搜索树(中序遍历)
  12. 安装引导黑屏_给电脑安装系统老是装不上,重启就黑屏,原来是这项设置在作怪!...
  13. 通过分析nginx的日志来过滤出访问过于频繁的IP地址,然后添加到nginx的blockip.conf,并重启nginx...
  14. pandas 菜鸟_再见Numpy,Pandas!又一个数据分析神器横空出现!
  15. php常用函数字符串操作回顾
  16. Http请求头+请求方式+状态码
  17. 一起谈.NET技术,关于Expression Tree和IL Emit的所谓的quot;性能差别quot;
  18. mysql连接服务器教程_连接 MySQL 服务器
  19. .net中使用ckeditor4+ckfinder上传图片
  20. Android高德地图marker和InfoWindow的使用

热门文章

  1. 2020百度提前批面试
  2. SpringBoot整合es7.x启动报错:Rejecting mapping update to [AAA] as the final mapping would have more than 1
  3. 法坤老师:网盘资源销售系统搭建教程
  4. 人人网官方Android客户端源码分析(1)
  5. 2021年最后一天了,总得留下点什么
  6. 使用iptables实现主机防火墙隔离
  7. 安装在电脑上的网络测试软件,怎么测试电脑网速,教你网速测试的几个方法(图文)...
  8. Postman知识汇总
  9. 数据指标显示,目前还没到牛市顶点 2021-04-24
  10. JVM_内存模型详解