CMP20 Schnorr:https://aping-dev.com/index.php/archives/535/

FROST Schnorr:https://aping-dev.com/index.php/archives/700/

EdDSA 签名与 Schnorr 签名类似,不同之处在于

  • EdDSA 用密钥和消息确定性地生成 nonce,确保了只要消息不同,生成的 nonce 不同,避免了两次签名因 nonce 相同而导致密钥泄露
  • 签名者的公钥包含在挑战值中

实际的实现中,FROST 的 keygen 仍然用的 CMP20 协议的,所以这部分的安全性和 CMP20 一样。

FROST 和 CMP20 的 EdDSA 算法的最大区别是签名时是否用到了 pailler 密钥,FROST 没有用到,而 CMP20 用到了。因为 FROST 没有用到 pailler 密钥,所以签名时计算效率比较高,轮数更少,也不需要 auxiliary 步骤。

EdDSA 签名算法

签名 $s = k + c \cdot x$,其中

  • $k$ 是随机秘密值,不可泄漏
  • $c = H(R, X, m)$ 是挑战值,可公开,其中

    • $H$ 是哈希函数
    • $R = g^k$ 是 $k$ 的公钥
    • $X$ 是公钥
    • $m$ 是被签名消息
  • $x$ 是私钥

CMP20 EdDSA 签名中 paillier 密钥的作用

有两种用途:

  • 在不泄露 $k$ 的情况下,证明它属于某个范围。因为 $k$ 范围太小就会导致 $R$ 集中在曲线的小阶子群中,增加碰撞攻击风险
  • 在不泄露 $k$ 的情况下,证明 $R=g^k$

FROST EdDSA 签名中用什么替代 paillier 密钥

  • FROST EdDSA 中,$k = d + e \cdot \rho $,其中

    • $d, e$ 是 $Z_q^*$ 上的随机值,会把 $d, e$ 的公钥 $D=g^d, E=g^e$ 发送给验签者。
    • $\rho = H(m, D, E)$ 是消息 $m$ 的绑定值,避免 $k$ 重复,$H$ 是哈希函数,输出结果属于 $Z_q^*$,验签者也可算出。

    哈希函数和模数约束确保 $k$ 也属于 $Z_q^*$,是一个比较大的范围。

  • 在验证签名分片合法性时,会验证 $R=g^k = g^{d + e \cdot \rho} = D \cdot E^{\rho}$,具体如下

    签名 $s = k + c \cdot x = d + e \cdot \rho + c \cdot x $

    会验证该式是否满足:$g^s = R \cdot X^{c}$

    推导:$g^s = g^{d + e \cdot \rho + c \cdot x} = D \cdot E^{\rho} \cdot X^c = R \cdot X^c$

CMP20 EdDSA 签名使用 paillier 密钥的原因

CMP20 EdDSA 算法之所以用了 paiilier 密钥,是受了 CMP20 ECDSA 启发,而 CMP20 ECDSA 使用 paillier 密钥是因为 $k$ 的 paillier 秘文还用于 mta(乘性份额转加性份额)。CMP20 论文没有详细说明 mta,不过 gg18 的论文有相关描述。而 EdDSA 不需要 mta,paillier 秘文的作用也就有限了。