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") } }