Go语言使用RSA进行数字签名
2019-11-24 本文已影响0人
realguan
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha512"
"crypto/x509"
"encoding/pem"
"fmt"
"os"
)
func main() {
src := []byte("这里是七号公园,哈哈")
signText := SignatureRSA(src,"private.pem")
bl := VerifyRSA(src,signText,"public.pem")
fmt.Println(bl)
}
// rsa私钥签名
func SignatureRSA(plainText []byte,fileName string) []byte {
// 1 打开私钥文件
file,err := os.Open(fileName)
if err != nil {
panic(err)
}
fileInfo,err := file.Stat()
buf := make([]byte,fileInfo.Size())
// 2 将私钥文件内容读取出来
file.Read(buf)
file.Close()
// 3 使用pem对读取的内容解码得到block
block,_ := pem.Decode(buf)
// 4 x509将数据解析得到私钥结构体
privateKey,err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
panic(err)
}
// 5 创建一个hash对象
myhash := sha512.New()
// 6 给hash对象添加数据
myhash.Write(plainText)
// 7 计算hash值
hashText := myhash.Sum(nil)
// 8 使用rsa函数对散列值签名
signText,err := rsa.SignPKCS1v15(rand.Reader,privateKey,crypto.SHA512,hashText)
if err != nil {
panic(err)
}
return signText
}
// rsa签名认证
func VerifyRSA(plainText,signText []byte,fileName string) bool {
// 1 打开公钥文件,将内容读出
file,err := os.Open(fileName)
if err != nil {
panic(err)
}
fileInfo,err := file.Stat()
if err != nil {
panic(err)
}
buf := make([]byte,fileInfo.Size())
file.Read(buf)
file.Close()
// 2 pem解码得到block
block,_ := pem.Decode(buf)
// 3 x509解析得到接口
pubInterface,err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
panic(err)
}
// 4 接口进行类型断言得到公钥结构体
publicKey := pubInterface.(*rsa.PublicKey)
// 5 对原始明文进行hash运算得到散列值
hashText := sha512.Sum512(plainText)
// 6 签名认证
err = rsa.VerifyPKCS1v15(publicKey,crypto.SHA512,hashText[:],signText)
if err == nil {
return true
}
return false
}