其实 keygen 之后,可以不执行 refresh 的,作者写出 refresh 是为了方案的完备性的。

refresh 本应该在后台周期性执行,但是由于 refresh 中生成的 Paillier 和 ring-Pedersen 参数会被 presign 用到,所以 keygen 后必须执行 refresh 才能签名成功。

为了避免在签名前必须执行 refresh,可在 keygen 中生成 presign 用到的 Paillier 和 ring-Pedersen 参数:

  • round_1

    • 输入:(ssid,i)
    • 生成私钥分片 xiFq 和公钥分片Xi=gxi,其中 xiFq 是私钥分片
    • zk-schnorr 承诺: (Ai,τ)=M(com,sch),其中 Ai=gτ 是 proof,τ 是随机数
    • 生成随机数 sridi={0,1}k,ui={0,1}k
    • 生成 Paillier & ring-Pedersen

      • 生成 Paillier 公钥 Ni 和私钥 (pi,qi),其中 Ni=piqi
      • 生成 ring-Pedersen 公钥 (Ni,si,ti) 和私钥 λ,其中 si=tiλ mod Ni
    • 生成承诺 Vi=Hash(ssid,i,sridi,Xi,Ai,ui,Ni,si,ti)
    • 广播 Vi
  • round_2

    • 收到 PjVj 后,广播 (ssid,i,sridi,Xi,Ai,ui,Ni,si,ti)
  • round_3

    • 收到 Pj(ssid,j,sridj,Xj,Aj,uj,Ni,si,ti) 后,验证 H(ssid,j,sridj,Xj,Aj,uj,Ni,si,ti)=Vj
    • srid 设为所有其它 Pjsridj 的 xor:srid=jsridj
    • zk-schnorr 证明: ψi=M(prove,sch,(ssid,i,srid),Xi;xi,τ)证明知道私钥分片 xi

      其中,(ssid,i,srid) 用来生成挑战 cψi=τ+cxi

    • 生成 Paillier & ring-Pedersen 的 proof 

      • 生成 Ni 是 Paillier-Blum Modulus 的 zk-proof

        • 计算 ψi=M(prove,mod,(sid,i),Ni;pi,qi)
        • 计算 ψi=M(prove,mod,(sid,i,ψi),Ni;(pi,qi))
      • 生成 (Ni,si,ti) 是 ring-Pedersen param 的 zk-proof,即 si 属于 ti 生成的群中的元素,群的阶为 Ni

        • 计算 ψi=M(prove,prm,(sid,i),(Ni,si,ti);λ)
    • Pj 发送 (ssid,i,ψi,ψi,ψi)
  • final

    • 收到 Pj(ssid,j,ψj)
    • zk-schnorr 验证:M(vrfy,sch,(ssid,j,srid),Xj,ψj)=1
    •  验证 Paillier & ring-Pedersen 的 proof

      • 验证 M(vrfy,mod,(sid,j),Nj,ψj)=1
      • 验证 M(vrfy,mod,(sid,j,ψj),Nj,ψj)=1
      • 验证 M(vrfy,prm,(sid,j),(Nj,sj,tj,ρ),ψj)=1
    • 计算公钥X=jXj