You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("签名验证失败")
	}
}

常见场景补充

  1. 解析外部公钥
    如果公钥是字节格式(比如压缩/非压缩格式),可以用btcec.ParsePubKey解析:
// 示例:解析压缩格式公钥字节
pubKeyBytes := publicKey.SerializeCompressed()
parsedPubKey, err := btcec.ParsePubKey(pubKeyBytes)
if err != nil {
	fmt.Printf("解析公钥失败: %v\n", err)
	return
}
  1. 解析外部签名
    如果签名是字节格式,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:47:44