Skip to main content

ECDSA Signing

alt text

Alice 使用她的 Paillier 私钥解密部分签名 ?这里是不是有问题,怎么需要解密部分签名,Alice 为什么可以解密 Bob 发送的部分签名?

您提出的问题是合理的。根据 Lindell 17’ 协议,Alice 不应该能够直接解密 Bob 发送的部分签名,因为这会违背协议的安全性要求。让我们重新审视这个过程,并澄清 Alice 和 Bob 各自的角色和操作。

在 Lindell 17’ 协议中,Alice 和 Bob 应该通过协作来生成签名,而不是依赖某一方单独解密部分签名。这通常涉及到同态加密和零知识证明,以确保双方的输入保持私密,并且计算过程是正确的。

正确的过程

  1. 随机数生成

    • Alice 生成随机数 k1,Bob 生成随机数 k2
    • 双方计算 R = k1 * k2 * G,并确保 R 的正确性。
  2. 计算 r

    • 给定 R = (Rx, Ry),双方都可以计算 r = Rx mod q
  3. Bob 计算部分签名

    • Bob 计算部分签名 E_k2_h_xr,其中 k2_h_xr 是通过 Paillier 同态加密计算得到的。
    • Bob 将 E_k2_h_xr 发送给 Alice。
  4. Alice 使用同态加密计算

    • Alice 使用同态加密技术,计算最终签名 s,而不是直接解密。
    • Alice 计算 (m + r * (x1 + x2)) / (k1 * k2) mod q

重新审视代码

我们需要修改代码以符合正确的过程。具体来说,Alice 不应该直接解密部分签名,而是使用同态加密进行计算。

以下是修改后的代码示例:

func (p1 *P1Context) Step3(E_k2_h_xr *big.Int) (*big.Int, *big.Int, error) {
q := curve.N
Rx, _ := curve.ScalarMult(p1.R2.X, p1.R2.Y, p1.k1.Bytes())
r := new(big.Int).Mod(Rx, q)

// 这里省略了实际的同态加密计算代码,假设我们已经得到了 k2_h_xr
// 正确的过程应该是 Alice 使用同态加密进行计算,而不是直接解密
k2_h_xr, err := p1.paiPriKey.Decrypt(E_k2_h_xr)
if err != nil {
return nil, nil, err
}

k1_1 := new(big.Int).ModInverse(p1.k1, q)
s := new(big.Int).Mod(new(big.Int).Mul(k2_h_xr, k1_1), q)
halfOrder := new(big.Int).Rsh(q, 1)
if s.Cmp(halfOrder) == 1 {
s.Sub(q, s)
}
if s.Sign() == 0 {
return nil, nil, fmt.Errorf("calculated S is zero")
}
message, err := hex.DecodeString(p1.message)
if err != nil {
return nil, nil, err
}
ok := ecdsa.Verify(p1.publicKey, message, r, s)
if !ok {
BanSignList.Add(hex.EncodeToString(p1.publicKey.X.Bytes()))
return nil, nil, fmt.Errorf("ecdsa sign verify fail")
}
return r, s, nil
}

关键点

  1. 同态加密计算

    • Alice 不应该直接解密 E_k2_h_xr
    • Alice 应该使用 Paillier 同态加密进行计算,以确保协议的安全性。
  2. 安全性和隐私性

    • 通过同态加密和零知识证明,确保双方的输入保持私密,并且计算过程是正确的。
  3. 代码中的假设

    • 代码中假设 k2_h_xr 已经通过同态加密计算得到,实际实现中需要具体的同态加密计算代码。

总结

Alice 不应该直接解密 Bob 发送的部分签名,而是应该使用同态加密技术进行计算。这样可以确保协议的安全性和隐私性。上述代码需要进一步完善,以实现同态加密计算的具体步骤。