Go語言使用RSA進行數(shù)字簽名

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 將私鑰文件內(nèi)容讀取出來
    file.Read(buf)
    file.Close()

    // 3 使用pem對讀取的內(nèi)容解碼得到block
    block,_ := pem.Decode(buf)
    // 4 x509將數(shù)據(jù)解析得到私鑰結(jié)構(gòu)體
    privateKey,err := x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        panic(err)
    }
    // 5 創(chuàng)建一個hash對象
    myhash := sha512.New()
    // 6 給hash對象添加數(shù)據(jù)
    myhash.Write(plainText)
    // 7 計算hash值
    hashText := myhash.Sum(nil)
    // 8 使用rsa函數(shù)對散列值簽名
    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 打開公鑰文件,將內(nèi)容讀出
    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 接口進行類型斷言得到公鑰結(jié)構(gòu)體
    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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容