package custom_util
import (
"encoding/hex"
"encoding/json"
"fmt"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcec/v2/ecdsa"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"math/big"
)
func SignAndVerifyTest(reqBody json.RawMessage) bool {
priKeyStr := "55331231652752707450534414287730188629145955228891758798201450763340552825166"
priKey10Bigint := new(big.Int)
priKey10Bigint.SetString(priKeyStr, 10)
priKeyByteArray := priKey10Bigint.Bytes()
pubKeyStr := "11798277315441798127238305597212517654332197982978466864717364245859439644690363141941628373531488122609933560694747426926865495896421628851963848417303440"
pubKey10Bigint := new(big.Int)
pubKey10Bigint.SetString(pubKeyStr, 10)
pubKeyHex := hex.EncodeToString(pubKey10Bigint.Bytes())
pubKeyHexStr := "04" + pubKeyHex
//2 内置的string工具包
fmt.Println("pubKey Hex String: ", pubKeyHexStr)
pubKeyByteArray, err := hex.DecodeString(pubKeyHexStr)
if err != nil {
fmt.Println("Unable to convert hex to byte. ", err)
}
// 使用私钥签名一些数据
msg := []byte(reqBody)
msgHash := chainhash.DoubleHashB(msg)
privKey, _ := btcec.PrivKeyFromBytes(priKeyByteArray)
msgSign := ecdsa.Sign(privKey, msgHash)
fmt.Printf("Signature: %x\n", msgSign.Serialize())
signByte := msgSign.Serialize()
fmt.Printf("signByte: %x\n", signByte)
// 拼接转换 []byte 到 string
sign := hex.EncodeToString(signByte)
fmt.Printf("signStr: " + sign)
// 验证签名
pubKey, err := btcec.ParsePubKey(pubKeyByteArray)
if err != nil {
fmt.Println(err)
return false
}
sigBytes, err := hex.DecodeString(sign)
if err != nil {
fmt.Println(err)
return false
}
fmt.Printf("hex ")
signature, err := ecdsa.ParseSignature(sigBytes)
if err != nil {
fmt.Println(err)
return false
}
ok := signature.Verify(msgHash, pubKey)
return ok
}
func Sign(reqBody json.RawMessage, priKeyStr string) string {
//priKeyStr := "55331231652752707450534414287730188629145955228891758798201450763340552825166"
priKey10Bigint := new(big.Int)
priKey10Bigint.SetString(priKeyStr, 10)
priKeyByteArray := priKey10Bigint.Bytes()
// 使用私钥签名一些数据
msg := []byte(reqBody)
msgHash := chainhash.DoubleHashB(msg)
privKey, _ := btcec.PrivKeyFromBytes(priKeyByteArray)
msgSign := ecdsa.Sign(privKey, msgHash)
fmt.Printf("Signature: %x\n", msgSign.Serialize())
signByte := msgSign.Serialize()
fmt.Printf("signByte: %x\n", signByte)
// 拼接转换 []byte 到 string
sign := hex.EncodeToString(signByte)
fmt.Printf("signStr: " + sign)
return sign
}
func VerifySignature(reqBody json.RawMessage, msgSignHex string, pubKeyStr string) bool {
//pubKeyStr := "11798277315441798127238305597212517654332197982978466864717364245859439644690363141941628373531488122609933560694747426926865495896421628851963848417303440"
pubKey10Bigint := new(big.Int)
pubKey10Bigint.SetString(pubKeyStr, 10)
pubKeyHex := hex.EncodeToString(pubKey10Bigint.Bytes())
pubKeyHexStr := "04" + pubKeyHex
//2 内置的string工具包
fmt.Println("pubKey Hex String: ", pubKeyHexStr)
pubKeyByteArray, err := hex.DecodeString(pubKeyHexStr)
if err != nil {
fmt.Println("Unable to convert hex to byte. ", err)
}
fmt.Printf("msgSignHex: " + msgSignHex)
// 验证签名
pubKey, err := btcec.ParsePubKey(pubKeyByteArray)
if err != nil {
fmt.Println(err)
return false
}
sigBytes, err := hex.DecodeString(msgSignHex)
if err != nil {
fmt.Println(err)
return false
}
fmt.Printf("hex ")
signature, err := ecdsa.ParseSignature(sigBytes)
if err != nil {
fmt.Println(err)
return false
}
msg := []byte(reqBody)
msgHash := chainhash.DoubleHashB(msg)
ok := signature.Verify(msgHash, pubKey)
return ok
}
secp256k1签名及验签 GO
最新推荐文章于 2024-07-18 11:18:19 发布