Skip to main content

ed25519 不需要 paillier

Ed25519 是一种基于椭圆曲线的数字签名算法,而不是同态加密算法。尽管如此,Ed25519 的一些特性使得它在多方计算(MPC)场景中可以实现门限签名。要理解为什么可以将多个部分签名相加而不需要 Paillier 这样的同态加密机制,我们需要深入了解 Ed25519 和门限签名的基本原理。

Ed25519 签名原理

Ed25519 签名的基本形式是: s=r+kh s = r + k \cdot h 其中:

  • ss 是签名的一部分。
  • rr 是随机数的部分
  • kk 是私钥
  • hh 是消息的哈希值。

门限签名的基本思想

在门限签名中,私钥 kk 被分成多个部分,每个参与者持有一个私钥的部分。假设我们有两个参与者 P1P1P2P2,他们分别持有私钥的部分 k1k1k2k2,满足: k=k1+k2 k = k1 + k2

签名的生成过程如下:

  1. 每个参与者生成一个随机数 r1r1r2r2
  2. 计算 R=r1G+r2GR = r1 \cdot G + r2 \cdot G
  3. 计算哈希值 h=H(RM)h = H(R || M)
  4. 每个参与者计算部分签名 s1=r1+k1hs1 = r1 + k1 \cdot hs2=r2+k2hs2 = r2 + k2 \cdot h
  5. 最终签名 s=s1+s2s = s1 + s2

为什么可以直接相加

Ed25519 的签名公式具有线性特性,这使得多个部分签名可以直接相加得到完整签名。具体来说:

s=(r1+k1h)+(r2+k2h) s = (r1 + k1 \cdot h) + (r2 + k2 \cdot h)

s=(r1+r2)+(k1+k2)h s = (r1 + r2) + (k1 + k2) \cdot h , (r1 + r2) 两个随机数的和仍是随机数,验签是与随机数无关,直接替换成 kk

s=r+kh s = r + k \cdot h

这种线性特性允许我们在不需要同态加密的情况下实现门限签名。

代码实现中的关键步骤

在你提供的代码中,门限签名的实现主要通过以下步骤实现:

  1. 生成随机数和承诺: 每个参与者生成一个随机数 kiki 并计算其承诺 Ri=kiGRi = ki \cdot G

  2. 交换承诺和证明: 每个参与者交换承诺 RiRi 和零知识证明 proofproof,以证明他们确实拥有 kiki

  3. 计算总的 RR: 所有参与者的 RiRi 相加得到 RR

  4. 计算哈希值 hh: 计算 h=H(RPubM)h = H(R || Pub || M)

  5. 计算部分签名: 每个参与者计算部分签名 si=ri+hxisi = ri + h \cdot xi

  6. 聚合签名: 最终签名 ss 是所有部分签名 sisi 的和。

总结

Ed25519 不是同态加密算法,但它的线性特性使得它在多方计算场景中可以实现门限签名。通过将私钥分成多个部分,每个参与者计算自己的部分签名,然后将这些部分签名相加,可以得到完整的签名。这种方法不需要 Paillier 等同态加密机制,从而简化了实现。