타원 곡선 서명 인증 (ecdsa) --- (golang)

2998 단어 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


만약 잘못이 있으면 댓글로 지적해 주십시오. 제가 즉시 고쳐서 다른 사람을 오도하지 않도록 하겠습니다~ 감사합니다!

좋은 웹페이지 즐겨찾기