美文网首页
Go语言使用RSA进行数字签名

Go语言使用RSA进行数字签名

作者: realguan | 来源:发表于2019-11-24 11:45 被阅读0次
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
}

相关文章

网友评论

      本文标题:Go语言使用RSA进行数字签名

      本文链接:https://www.haomeiwen.com/subject/tnkhwctx.html