私钥签名:
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")
	}

}