椭圆曲线签名认证(ecdsa) ---(golang)

package main

import (
	"crypto/ecdsa"
	"crypto/elliptic"
	"crypto/rand"
	"crypto/x509"
	"encoding/pem"
	"os"
	"crypto/sha1"
	"math/big"
	"fmt"
)

func main() {
	privateKeyFilePath := "E:/go/src/ecc/eccprivateKey.pem"
	publicKeyFilePath := "E:/go/src/ecc/eccpublicKey.pem"
	sourceData := []byte("测试加密数据")
	r, s := EccSignature(sourceData, privateKeyFilePath)
	res := EccVerify(r, s, sourceData, publicKeyFilePath)
	if res {
		fmt.Println("认证成功")
	}
}

//生成密钥对
func GenerateEccKey() error {
	//使用ecdsa生成密钥对
	privateKey, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
	if err != nil {
		return err
	}
	//使用509
	private, err := x509.MarshalECPrivateKey(privateKey) //此处
	if err != nil {
		return err
	}
	//pem
	block := pem.Block{
		Type:  "esdsa private key",
		Bytes: private,
	}
	file, err := os.Create("E:/go/src/ecc/eccprivateKey.pem")
	if err != nil {
		return err
	}
	err = pem.Encode(file, &block)
	if err != nil {
		return err
	}
	file.Close()

	//处理公钥
	public := privateKey.PublicKey

	//x509序列化
	publicKey, err := x509.MarshalPKIXPublicKey(&public)
	if err != nil {
		return err
	}
	//pem
	public_block := pem.Block{
		Type:  "ecdsa public key",
		Bytes: publicKey,
	}
	file, err = os.Create("E:/go/src/ecc/eccpublicKey.pem")
	if err != nil {
		return err
	}
	//pem编码
	err = pem.Encode(file, &public_block)
	if err != nil {
		return err
	}
	return nil
}

//ecc签名--私钥
func EccSignature(sourceData []byte, privateKeyFilePath string) ([]byte, []byte) {
	//1,打开私钥文件,读出内容
	file, err := os.Open(privateKeyFilePath)
	if err != nil {
		panic(err)
	}
	info, err := file.Stat()
	buf := make([]byte, info.Size())
	file.Read(buf)
	//2,pem解密
	block, _ := pem.Decode(buf)
	//x509解密
	privateKey, err := x509.ParseECPrivateKey(block.Bytes)
	if err != nil {
		panic(err)
	}
	//哈希运算
	hashText := sha1.Sum(sourceData)
	//数字签名
	r, s, err := ecdsa.Sign(rand.Reader, privateKey, hashText[:])
	if err != nil {
		panic(err)
	}
	rText, err := r.MarshalText()
	if err != nil {
		panic(err)
	}
	sText, err := s.MarshalText()
	if err != nil {
		panic(err)
	}
	defer file.Close()
	return rText, sText
}

//ecc认证

func EccVerify(rText, sText, sourceData []byte, publicKeyFilePath string) bool {
	//读取公钥文件
	file, err := os.Open(publicKeyFilePath)
	if err != nil {
		panic(err)
	}
	info, err := file.Stat()
	if err != nil {
		panic(err)
	}
	buf := make([]byte, info.Size())
	file.Read(buf)
	//pem解码
	block, _ := pem.Decode(buf)

	//x509
	publicStream, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		panic(err)
	}
	//接口转换成公钥
	publicKey := publicStream.(*ecdsa.PublicKey)
	hashText := sha1.Sum(sourceData)
	var r, s big.Int
	r.UnmarshalText(rText)
	s.UnmarshalText(sText)
	//认证
	res := ecdsa.Verify(publicKey, hashText[:], &r, &s)
	defer file.Close()
	return res
}

欢迎加微信一起学习:13671593005

如有错误,敬请留言指点,我立马改正,以免误导他人~谢谢!

EIP-2771,也称为ERC-2771,是关于去中心化应用程序(DApp)中的安全代币标准。在Go语言中实现EIP-2771签名通常涉及到使用加密算法来签署交易,确保其来源的真实性。以下是一个简单的示例,展示如何使用`secp256k1`库来进行ECDSA椭圆曲线数字签名算法)签名,这是Ethereum中最常用的签名方案: ```go package main import ( "crypto/ecdsa" "crypto/hmac" "crypto/sha256" "encoding/hex" ) type EIP2771Signer struct { privateKey *ecdsa.PrivateKey } func (s *EIP2771Signer) Sign(message []byte) ([]byte, error) { hashedMessage := sha256.Sum256(message) signatureR, signatureS, err := ecdsa.Sign(rand.Reader, s.privateKey, hashedMessage[:]) if err != nil { return nil, err } // 将Signature转换为字节并追加0x01前缀(因为EIP-2771使用little-endian编码) rBytes := make([]byte, len(signatureR)) for i, b := range signatureR { rBytes[i] = byte(b) } sBytes := make([]byte, len(signatureS)) for i, b := range signatureS { sBytes[i] = byte(b) } return append(rBytes, sBytes...), nil } func main() { // 创建私钥(这里仅作示例,实际应用应妥善保管私钥) priv, _ := ecdsa.GenerateKey(secp256k1Curve, rand.Reader) .signer := &EIP2771Signer{privateKey: priv} message := []byte("Your message here") signature, err := signer.Sign(message) if err != nil { panic(err) } // 现在你可以将signature用于发送到区块链 encodedSignature := hex.EncodeToString(signature) println("Encoded Signature:", encodedSignature) } ``` 这个例子假设你已经有一个随机数生成器`rand.Reader`和`secp256k1Curve`,这通常是`github.com/btcsuite/btcd/math/ecdsa`包的一部分。记得在实际项目中,你需要处理好密钥的安全性和消息的完整性和哈希计算。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值