Go语言btcec库中secp256k1签名的验证方法及示例
使用btcec库验证secp256k1签名
在btcec/v2库中,secp256k1签名的验证核心是Signature类型的Verify方法,配合PubKey公钥类型完成校验。该方法接收消息哈希值和对应公钥作为参数,返回布尔值表示签名是否有效。
完整代码示例
package main import ( "crypto/sha256" "fmt" "github.com/btcsuite/btcd/btcec/v2" ) func main() { // 生成测试密钥对(实际场景中公钥通常由外部提供) privateKey, err := btcec.NewPrivateKey() if err != nil { fmt.Printf("生成私钥失败: %v\n", err) return } publicKey := privateKey.PubKey() // 待签名消息,先做SHA-256哈希(secp256k1通常对消息哈希签名) message := []byte("测试secp256k1签名验证") msgHash := sha256.Sum256(message) // 生成签名 signature, err := privateKey.Sign(msgHash[:]) if err != nil { fmt.Printf("签名失败: %v\n", err) return } // 执行签名验证 isValid := signature.Verify(msgHash[:], publicKey) if isValid { fmt.Println("签名验证通过") } else { fmt.Println("签名验证失败") } }
常见场景补充
- 解析外部公钥
如果公钥是字节格式(比如压缩/非压缩格式),可以用btcec.ParsePubKey解析:
// 示例:解析压缩格式公钥字节 pubKeyBytes := publicKey.SerializeCompressed() parsedPubKey, err := btcec.ParsePubKey(pubKeyBytes) if err != nil { fmt.Printf("解析公钥失败: %v\n", err) return }
- 解析外部签名
如果签名是字节格式,用btcec.ParseSignature解析后再验证:
// 示例:解析签名字节 sigBytes := signature.Serialize() parsedSig, err := btcec.ParseSignature(sigBytes) if err != nil { fmt.Printf("解析签名失败: %v\n", err) return } // 验证解析后的签名 isValid = parsedSig.Verify(msgHash[:], publicKey)
内容的提问来源于stack exchange,提问作者xy01
相关产品推荐
相关产品推荐

