区块链ecc签名算法讲解

以太坊(比特币)的签名算法都是使用的ecc签名,简单介绍一下ecc签名

一、ecc签名原理


ecc算法可以这样简单的理解一下即可编码了,还有很多细节不多介绍

需要理解的几个概念:

1.签名算法都有私钥、公钥的区别,ecc中d的值是私钥,Q的值是公钥,比rsa多了一个基点的概念,图中P为基点

2.私钥不可伪造,公钥用来验证该签名,验证通过即可证明是这个私钥持有者的签名,别人不可伪造

3.计算出的签名值为R、S两个值,简单的把R+S拼接在一起叫裸签名,区块链中采用的都是裸签

4.ecc在国内有个sm2变种,即国密算法,目前国内不支持ecc算法,只支持sm2算法


二、ecc签名go语言实现

package main


import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/md5"
"crypto/rand"
"fmt"
"hash"
"io"

"os"
)
 
func main() {


curve := elliptic.P256()  

privatekey := new(ecdsa.PrivateKey)
privatekey, err := ecdsa.GenerateKey(curve, rand.Reader) // this generates a public & private key pair


if err != nil {
fmt.Println(err)
os.Exit(1)
}


var pubkey ecdsa.PublicKey
pubkey = privatekey.PublicKey


fmt.Println("Private Key :")
fmt.Printf("%x \n", privatekey)


fmt.Println("Public Key :")
fmt.Printf("%x \n", pubkey)

fmt.Println("GX GY:")
fmt.Printf("%x \n", privatekey.Params().Gx)
fmt.Printf("%x \n", privatekey.Params().Gy)
fmt.Println("")
// Sign ecdsa style


var h hash.Hash
h = md5.New()
io.WriteString(h, "This is a message to be signed and verified by ECDSA!")
signhash := h.Sum(nil)


r, s, serr := ecdsa.Sign(rand.Reader, privatekey, signhash)
if serr != nil {
fmt.Println(err)
os.Exit(1)
}


// signature := r.Bytes()
// signature = append(signature, s.Bytes()...)
//
// fmt.Printf("Signature : %x\n", signature)

fmt.Printf("%x\n", r)
fmt.Printf("%x\n", s)


// Verify
verifystatus := ecdsa.Verify(&pubkey, signhash, r, s)
fmt.Println(verifystatus) // should be true
}

三、以太坊的应用

  以太坊把私钥存在在你的账户中,然后用你的密码做了个加密处理,每次交易时,把私钥拿出来做个签名,并把签名值附在交易的内容上,即r、s的值,用来保证交易的不可抵赖





猜你喜欢

转载自blog.csdn.net/mbcsdn/article/details/80226592