Skip to main content

code ecdsa sign TestTwoSign

流程图

alt text

根据测试代码,我们可以看到整个两方 ECDSA 签名方案的执行过程。以下是对代码的详细分析和步骤分解:

初始化阶段

  1. 定义椭圆曲线和消息哈希

    N := curve.N
    hash := sha256.New()
    hash.Write([]byte("hello"))
    message := hash.Sum(nil)
  2. 生成私钥片段和公钥 当前测试用例无 DKG, 两个私钥放在一起

    x1 := crypto.RandomNum(N)
    x2 := crypto.RandomNum(N)
    _, publicKey := secp256k1.PrivKeyFromBytes(new(big.Int).Add(x1, x2).Bytes())
  3. 生成 Paillier 公私钥对

    paiPri, paiPub, _ := paillier.NewKeyPair(8)
  4. 初始化 P1 和 P2 的上下文

    p1 := NewP1(publicKey.ToECDSA(), hex.EncodeToString(message), paiPri)
    E_x1, _, _ := paiPub.Encrypt(x1)
    p2 := NewP2(x2, E_x1, publicKey.ToECDSA(), paiPub, hex.EncodeToString(message))

签名生成阶段

  1. P1 执行第一步:生成承诺

    commit, _ := p1.Step1()
  2. P2 执行第一步:生成 Schnorr 证明和 R2

    bobProof, R2, _ := p2.Step1(commit)

签名交换阶段

  1. P1 执行第二步:验证 P2 的 Schnorr 证明,并生成自己的 Schnorr 证明

    proof, cmtD, _ := p1.Step2(bobProof, R2)
  2. P2 执行第二步:验证 P1 的承诺和 Schnorr 证明,计算并返回加密的 (h + xr)/k2

    E_k2_h_xr, _ := p2.Step2(cmtD, proof)

签名验证阶段

  1. P1 执行第三步:解密 (h + xr)/k2,计算最终的签名 (r, s)

    r, s, _ := p1.Step3(E_k2_h_xr)
  2. 验证签名

    valid := ecdsa.Verify(publicKey.ToECDSA(), message, r, s)
    fmt.Println("Signature valid:", valid)

详细分析

  • P1Context 和 P2Context 的初始化

    • P1ContextP2Context 分别代表两方 P1 和 P2 的上下文,包含各自的私钥片段、会话 ID、公钥、消息等信息。
  • Paillier 加密系统的应用

    • P1 使用 Paillier 公钥加密私钥片段 x1,生成 E_x1,并传递给 P2。
  • 承诺和 Schnorr 证明

    • P1 生成承诺 commit,并传递给 P2。
    • P2 生成 Schnorr 证明 bobProof 和点 R2,并传递给 P1。
    • P1 验证 bobProof,生成自己的 Schnorr 证明 proof,并传递给 P2。
    • P2 验证 proof,计算并返回加密的 (h + xr)/k2
  • 签名计算和验证

    • P1 解密 (h + xr)/k2,计算最终的签名 (r, s)
    • 最后,使用 ecdsa.Verify 函数验证签名的有效性。

总结

该代码展示了一个安全的两方 ECDSA 签名方案,使用了 Paillier 加密和 Schnorr 证明来确保各方私钥的隐私和签名的有效性。整个过程通过生成和交换承诺、验证 Schnorr 证明、计算签名 (r, s),并最终验证签名的有效性来实现。

流程图

好的,以下是基于你提供的代码的两方 ECDSA 签名方案的流程图。

解释流程图

  1. 生成私钥片段和公钥

    • P1 和 P2 分别生成各自的私钥片段 x1x2
    • P1 通过 x1x2 生成公钥。
  2. 生成 Paillier 公私钥对

    • P1 生成 Paillier 公私钥对,并将 Paillier 公钥传递给 P2。
  3. 初始化上下文

    • P1 和 P2 分别初始化各自的上下文 P1ContextP2Context
  4. 生成承诺和 Schnorr 证明

    • P1 生成承诺 commit 并传递给 P2。
    • P2 生成 Schnorr 证明 bobProof 和点 R2,并传递给 P1。
  5. 验证和交换 Schnorr 证明

    • P1 验证 bobProof,生成自己的 Schnorr 证明 proofcmtD,并传递给 P2。
    • P2 验证 commitproof,计算并返回加密的 (h + xr)/k2
  6. 计算和验证签名

    • P1 解密 (h + xr)/k2,计算最终的签名 (r, s),并进行签名验证。
    • P1 将签名结果 (r, s) 传递给 P2,P2 也进行签名验证。

通过这个流程图,可以更直观地理解两方 ECDSA 签名的整个过程。