Skip to main content

code ecdsa 签名算法特点结合Paillier

好的,我们可以通过详细推导来解释为什么 P1 和 P2 能够在不暴露各自私钥份额的情况下完成 ECDSA 签名。

ECDSA 签名算法回顾

  1. 密钥生成

    • 私钥 xx
    • 公钥 Q=xGQ = xG
  2. 签名生成(这里,与下文 Paillier 推论一致)

    • 选择随机数 kk
    • 计算 R=kGR = kG,其中 R=(Rx,Ry)R = (R_x, R_y)
    • 计算 r=Rxmodqr = R_x \mod q
    • 计算消息哈希 h=H(m)h = H(m)
    • 计算 s=k1(h+xr)modqs = k^{-1} (h + xr) \mod q
    • 签名为 (r,s)(r, s)

多方计算 ECDSA 签名推导

私钥分割

假设私钥 xx 被分割成两部分,分别由 P1 和 P2 持有:

  • P1 持有 x1x_1
  • P2 持有 x2x_2
  • 满足 x=x1+x2x = x_1 + x_2

随机数生成

P1 和 P2 各自生成一个随机数:

  • P1 生成 k1k_1
  • P2 生成 k2k_2

计算相应的公钥点:

  • P1 计算 R1=k1GR_1 = k_1 G
  • P2 计算 R2=k2GR_2 = k_2 G

最终的 RR 为:

R=R1+R2=k1G+k2G=(k1+k2)GR = R_1 + R_2 = k_1 G + k_2 G = (k_1 + k_2) G

R=(Rx,Ry)R = (R_x, R_y),则 r=Rxmodqr = R_x \mod q

消息哈希和中间值计算

P2 计算消息哈希 hh 和中间值 xrxrh=H(m)h = H(m)

xr=xr=(x1+x2)r=x1r+x2rxr = x r = (x_1 + x_2) r = x_1 r + x_2 r

同态加密保护私钥份额

P2 计算:

intermediate=h+x2r\text{intermediate} = h + x_2 r

然后计算:

k21intermediate=k21(h+x2r)k_2^{-1} \text{intermediate} = k_2^{-1} (h + x_2 r)

P2 使用 P1 的 Paillier 公钥加密这个值,得到 Ek21(h+x2r)E_{k_2^{-1} (h + x_2 r)}

解密和签名计算

P1 解密 Ek21(h+x2r)E_{k_2^{-1} (h + x_2 r)},得到:

k21(h+x2r)k_2^{-1} (h + x_2 r)

然后计算:

s=k11k21(h+x2r+x1r)modqs = k_1^{-1} k_2^{-1} (h + x_2 r + x_1 r) \mod q

由于 x=x1+x2x = x_1 + x_2,所以:

s=k11k21(h+xr)modqs = k_1^{-1} k_2^{-1} (h + x r) \mod q

签名验证

签名 (r,s)(r, s) 可以通过以下方式验证:

s=k1(h+xr)modqs = k^{-1} (h + xr) \mod q

其中 k=k1+k2k = k_1 + k_2,所以:

s=(k1+k2)1(h+xr)modqs = (k_1 + k_2)^{-1} (h + x r) \mod q

详细推导步骤

  1. P1 生成承诺

    • P1 生成随机数 k1k_1,计算 R1=k1GR_1 = k_1 G,并发送给 P2。
  2. P2 生成 k2k_2R2R_2

    • P2 生成随机数 k2k_2,计算 R2=k2GR_2 = k_2 G,并发送给 P1。
  3. P1 和 P2 计算 RR

    • R=R1+R2=k1G+k2GR = R_1 + R_2 = k_1 G + k_2 G
    • r=Rxmodqr = R_x \mod q
  4. P2 计算中间值并加密

    • h=H(m)h = H(m)
    • xr=x2rxr = x_2 r
    • intermediate=h+x2r\text{intermediate} = h + x_2 r
    • k21intermediate=k21(h+x2r)k_2^{-1} \text{intermediate} = k_2^{-1} (h + x_2 r)
    • 加密 Ek21(h+x2r)E_{k_2^{-1} (h + x_2 r)},并发送给 P1。
  5. P1 解密并计算签名

    • 解密 Ek21(h+x2r)E_{k_2^{-1} (h + x_2 r)},得到 k21(h+x2r)k_2^{-1} (h + x_2 r)
    • 计算 s=k11k21(h+x2r+x1r)modqs = k_1^{-1} k_2^{-1} (h + x_2 r + x_1 r) \mod q
    • 简化为 s=(k1+k2)1(h+xr)modqs = (k_1 + k_2)^{-1} (h + x r) \mod q
    • 其中 k=k1+k2k = k_1 + k_2,所以:
s=(k1+k2)1(h+xr)modq=(k)1(h+xr)modqs = (k_1 + k_2)^{-1} (h + x r) \mod q = (k)^{-1} (h + x r) \mod q

通过上述步骤,P1 和 P2 在不暴露各自私钥份额的情况下,安全地计算出有效的 ECDSA 签名。这种分布式计算方法确保了签名过程的安全性和隐私性。

与上文一致

alt text