package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha512"
"crypto/x509"
"encoding/pem"
"fmt"
"os"
)
func main() {
src := []byte("這里是七號(hào)公園,哈哈")
signText := SignatureRSA(src,"private.pem")
bl := VerifyRSA(src,signText,"public.pem")
fmt.Println(bl)
}
// rsa私鑰簽名
func SignatureRSA(plainText []byte,fileName string) []byte {
// 1 打開(kāi)私鑰文件
file,err := os.Open(fileName)
if err != nil {
panic(err)
}
fileInfo,err := file.Stat()
buf := make([]byte,fileInfo.Size())
// 2 將私鑰文件內(nèi)容讀取出來(lái)
file.Read(buf)
file.Close()
// 3 使用pem對(duì)讀取的內(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)建一個(gè)hash對(duì)象
myhash := sha512.New()
// 6 給hash對(duì)象添加數(shù)據(jù)
myhash.Write(plainText)
// 7 計(jì)算hash值
hashText := myhash.Sum(nil)
// 8 使用rsa函數(shù)對(duì)散列值簽名
signText,err := rsa.SignPKCS1v15(rand.Reader,privateKey,crypto.SHA512,hashText)
if err != nil {
panic(err)
}
return signText
}
// rsa簽名認(rèn)證
func VerifyRSA(plainText,signText []byte,fileName string) bool {
// 1 打開(kāi)公鑰文件,將內(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 接口進(jìn)行類(lèi)型斷言得到公鑰結(jié)構(gòu)體
publicKey := pubInterface.(*rsa.PublicKey)
// 5 對(duì)原始明文進(jìn)行hash運(yùn)算得到散列值
hashText := sha512.Sum512(plainText)
// 6 簽名認(rèn)證
err = rsa.VerifyPKCS1v15(publicKey,crypto.SHA512,hashText[:],signText)
if err == nil {
return true
}
return false
}
Go語(yǔ)言使用RSA進(jìn)行數(shù)字簽名
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 話(huà)不多說(shuō)直接上代碼: 運(yùn)行結(jié)果:
- go語(yǔ)言RSA API使用示例 第零步: 常用的包 第一步:生成RSA密鑰對(duì), 包括private和public ...
- 一 有次周末在家打掃衛(wèi)生,清理到書(shū)房時(shí),我嚇了一跳。這倒不是因?yàn)闀?shū)房有多臟,而是我發(fā)現(xiàn)原本占了半面墻的書(shū)柜,竟然已...