Go语言实现ECC数字签名
椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为 ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学。
在用于数字签名时,发送方通常先对消息生成散列值,再利用私钥对散列值进行签名,接收方收到消息及签名时,也先对消息生成散列值(与发送方使用同种单向散列函数),利用发送方发的公钥、签名以及自己生成的散列值进行签名验证。
实现代码如下:
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"os"
"crypto/x509"
"encoding/pem"
"crypto/sha256"
"math/big"
"fmt"
)
//生成ECC椭圆曲线密钥对,保存到文件
func GenerateECCKey() {
//生成密钥对
privateKey, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)
if err != nil {
panic(err)
}
//保存私钥
//生成文件
privatefile, err := os.Create("eccprivate.pem")
if err != nil {
panic(err)
}
//x509编码
eccPrivateKey, err := x509.MarshalECPrivateKey(privateKey)
if err != nil {
panic(err)
}
//pem编码
privateBlock := pem.Block{
Type: "ecc private key",
Bytes: eccPrivateKey,
}
pem.Encode(privatefile, &privateBlock)
//保存公钥
publicKey := privateKey.PublicKey