GO实现数字签名公钥认证
私钥签名:
1. 提供私钥文件, 解析出私钥内容(decode, parse….)
2. 使用私钥进行数字签名
公钥认证
1. 提供公钥文件, 解析出公钥内容(decode, parse….)
2. 使用公钥进行数字签名认证
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
)
//数字签名验证
const PrivateKeyFile3 = "./keystudy/RsaPrivateKey.pem"
const PublicKeyFile3 = "./keystudy/RsaPublicKey.pem"
//私钥签名: 提供私钥,签名数据,得到数字签名
func rsaSignData(filename string,src []byte) ([]byte,error){
//通过私钥文件解析私钥内容
info,err := ioutil.ReadFile(filename)
if err != nil{
return nil,err
}
//pem decode
block,_ := pem.Decode(info)
//解码得到私钥
derText := block.Bytes
privateKey,err := x509.ParsePKCS1PrivateKey(derText)
if err != nil{
return nil,err
}
//对私钥进行数字签名
//获取原文的哈希值
hash := sha256.Sum256(src)
//签名
signature,err := rsa.SignPKCS1v15(rand.Reader,privateKey,crypto.SHA256,hash[:])
if err != nil{
return nil,err
}
return signature,nil
}
//公钥认证签名
func rsaVerifySignature(sign []byte,src []byte,filename string) error {
//读取公钥信息
info,err := ioutil.ReadFile(filename)
if err != nil{
return err
}
//pemdecode
block,_ := pem.Decode(info)
//解码得到公钥
derText := block.Bytes
publicKey,err := x509.ParsePKCS1PublicKey(derText)
if err != nil{
return err
}
//获取原文哈希
hash := sha256.Sum256(src)
//使用公钥对数字签名进行认证
err = rsa.VerifyPKCS1v15(publicKey,crypto.SHA256,hash[:],sign)
if err != nil{
return err
}
return nil
}
func main() {
src := []byte("hello")
sign,err := rsaSignData(PrivateKeyFile3,src)
if err != nil{
fmt.Println("私钥签名出错")
}
fmt.Printf("私钥签名%x\n",sign)
//srcmistake := []byte("hello2") //篡改签名后认证失败
//使用公钥认证签名
err = rsaVerifySignature(sign,src,PublicKeyFile3)
if err != nil{
fmt.Println("公钥认证失败 ERROR")
}else{
fmt.Println("公钥认证成功 SUCCESS")
}
}
