其实 keygen 之后,可以不执行 refresh 的,作者写出 refresh 是为了方案的完备性的。
refresh 本应该在后台周期性执行,但是由于 refresh 中生成的 Paillier 和 ring-Pedersen 参数会被 presign 用到,所以 keygen 后必须执行 refresh 才能签名成功。
为了避免在签名前必须执行 refresh,可在 keygen 中生成 presign 用到的 Paillier 和 ring-Pedersen 参数:
round_1
- 输入:$(ssid, i)$
- 生成私钥分片 $x_i \in F_q$ 和公钥分片:$X_i = g^{x_i}$,其中 $x_i \in F_q$ 是私钥分片
- zk-schnorr 承诺: $(A_i, \tau) = M(com, \prod^{sch})$,其中 $A_i = g^{\tau}$ 是 proof,$\tau$ 是随机数
- 生成随机数 $srid_i = \left\{0, 1\right\}^k, u_i = \left\{0, 1\right\}^k$
生成 Paillier & ring-Pedersen
- 生成 Paillier 公钥 $N_i$ 和私钥 $(p_i, q_i)$,其中 $N_i=p_i \cdot q_i$
- 生成 ring-Pedersen 公钥 $(N_i, s_i, t_i)$ 和私钥 $\lambda$,其中 $s_i=t_i^{\lambda}$ mod $N_i$
- 生成承诺 $V_i = Hash(ssid, i, srid_i, X_i, A_i, u_i, N_i, s_i, t_i)$
- 广播 $V_i$
round_2
- 收到 $P_j$ 的 $V_j$ 后,广播 $(ssid, i, srid_i, X_i, A_i, u_i, N_i, s_i, t_i)$
round_3
- 收到 $P_j$ 的 $(ssid, j, srid_j, X_j, A_j, u_j, N_i, s_i, t_i)$ 后,验证 $H(ssid, j, srid_j, X_j, A_j, u_j, N_i, s_i, t_i) = V_j$
- 将 $srid$ 设为所有其它 $P_j$ 的 $srid_j$ 的 xor:$srid = \bigoplus_jsrid_j$
zk-schnorr 证明: $\psi_i=M(prove, \prod^{sch}, (ssid, i, srid), X_i; x_i, \tau)$,证明知道私钥分片 $x_i$
其中,$(ssid, i, srid)$ 用来生成挑战 $c$,$\psi_i=\tau + c \cdot x_i$
生成 Paillier & ring-Pedersen 的 proof
生成 $N_i$ 是 Paillier-Blum Modulus 的 zk-proof
- 计算 $\psi_i=M(prove, \prod^{mod}, (sid, i), N_i; p_i, q_i)$
- 计算 $\psi'_i = M(prove, \prod^{mod}, (sid, i, \psi_i), N_i; (p_i, q_i))$
生成 $(N_i, s_i, t_i)$ 是 ring-Pedersen param 的 zk-proof,即 $s_i$ 属于 $t_i$ 生成的群中的元素,群的阶为 $N_i$
- 计算 $\psi''_i = M(prove, \prod^{prm}, (sid, i), (N_i, s_i, t_i); \lambda)$
- 向 $P_j$ 发送 $(ssid, i, \psi_i, \psi'_i, \psi''_i)$
final
- 收到 $P_j$ 的 $(ssid, j, \psi_j)$
- zk-schnorr 验证:$M(vrfy, \prod^{sch}, (ssid, j, srid), X_j, \psi_j) = 1$
验证 Paillier & ring-Pedersen 的 proof
- 验证 $M(vrfy, \prod^{mod}, (sid, j), N_j, \psi_j) = 1$
- 验证 $M(vrfy, \prod^{mod}, (sid, j, \psi_j), N_j, \psi_j') = 1$
- 验证 $M(vrfy, \prod^{prm}, (sid, j), (N_j, s_j, t_j, \rho), \psi_j'') = 1$
- 计算公钥:$X = \prod_jX_j$
没有评论