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 秘文的作用也就有限了。
没有评论