타원 곡선 서명 인증 (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
만약 잘못이 있으면 댓글로 지적해 주십시오. 제가 즉시 고쳐서 다른 사람을 오도하지 않도록 하겠습니다~ 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set container
There is no built-in set container in Go
How to implement Set
struct{} => type
struct{}{} => 0bytes
How to create
set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.