code ecdsa sign TestTwoSign
流程图

根据测试代码,我们可以看到整个两方 ECDSA 签名方案的执行过程。以下是对代码的详细分析和步骤分解:
初始化阶段
-
定义椭圆曲线和消息哈希
N := curve.N
hash := sha256.New()
hash.Write([]byte("hello"))
message := hash.Sum(nil) -
生成私钥片段和公钥 当前测试用例无 DKG, 两个私钥放在一起
x1 := crypto.RandomNum(N)
x2 := crypto.RandomNum(N)
_, publicKey := secp256k1.PrivKeyFromBytes(new(big.Int).Add(x1, x2).Bytes()) -
生成 Paillier 公私钥对
paiPri, paiPub, _ := paillier.NewKeyPair(8) -
初始化 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))
签名生成阶段
-
P1 执行第一步:生成承诺
commit, _ := p1.Step1() -
P2 执行第一步:生成 Schnorr 证明和 R2
bobProof, R2, _ := p2.Step1(commit)
签名交换阶段
-
P1 执行第二步:验证 P2 的 Schnorr 证明,并生成自己的 Schnorr 证明
proof, cmtD, _ := p1.Step2(bobProof, R2) -
P2 执行第二步:验证 P1 的承诺和 Schnorr 证明,计算并返回加密的 (h + xr)/k2
E_k2_h_xr, _ := p2.Step2(cmtD, proof)
签名验证阶段
-
P1 执行第三步:解密 (h + xr)/k2,计算最终的签名 (r, s)
r, s, _ := p1.Step3(E_k2_h_xr) -
验证签名
valid := ecdsa.Verify(publicKey.ToECDSA(), message, r, s)
fmt.Println("Signature valid:", valid)
详细分析
-
P1Context 和 P2Context 的初始化
P1Context和P2Context分别代表两方 P1 和 P2 的上下文,包含各自的私钥片段、会话 ID、公钥、消息等信息。
-
Paillier 加密系统的应用
- P1 使用 Paillier 公 钥加密私钥片段
x1,生成E_x1,并传递给 P2。
- P1 使用 Paillier 公 钥加密私钥片段
-
承诺和 Schnorr 证明
- P1 生成承诺
commit,并传递给 P2。 - P2 生成 Schnorr 证明
bobProof和点R2,并传递给 P1。 - P1 验证
bobProof,生成自己的 Schnorr 证明proof,并传递给 P2。 - P2 验证
proof,计算并返回加密的(h + xr)/k2。
- P1 生成承诺
-
签名计算和验证
- P1 解密
(h + xr)/k2,计算最终的签名(r, s)。 - 最后,使用
ecdsa.Verify函数验证签名的有效性。
- P1 解密
总结
该代码展示了一个安全的两方 ECDSA 签名方案,使用了 Paillier 加密和 Schnorr 证明来确保各方私钥的隐私和签名的有效性。整个过程通过生成和交换承诺、验证 Schnorr 证明、计算签名 (r, s),并最终验证签名的有效性来实现。
流程图
好的,以下是基于你提供的代码的两方 ECDSA 签名方案的流程图。
解释流程图
-
生成私钥片段和公钥
- P1 和 P2 分别生成各自的私钥片段
x1和x2。 - P1 通过
x1和x2生成公钥。
- P1 和 P2 分别生成各自的私钥片段
-
生成 Paillier 公私钥对
- P1 生成 Paillier 公私钥对,并将 Paillier 公钥传递给 P2。
-
初始化上下文
- P1 和 P2 分别初始化各自的上下文
P1Context和P2Context。
- P1 和 P2 分别初始化各自的上下文
-
生成承诺和 Schnorr 证明
- P1 生成承诺
commit并传递给 P2。 - P2 生成 Schnorr 证明
bobProof和点R2,并传递给 P1。
- P1 生成承诺
-
验证和交换 Schnorr 证明
- P1 验证
bobProof,生成自己的 Schnorr 证明proof和cmtD,并传递给 P2。 - P2 验证
commit和proof,计算并返回加密的(h + xr)/k2。
- P1 验证
-
计算和验证签名
- P1 解密
(h + xr)/k2,计算最终的签名(r, s),并进行签名验证。 - P1 将签名结果
(r, s)传递给 P2,P2 也进行签名验证。
- P1 解密
通过这个流程图,可以更直观地理解两方 ECDSA 签名的整个过程。