密码技术--RSA数字签名及Go语言应用
Posted Yuan_sr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密码技术--RSA数字签名及Go语言应用相关的知识,希望对你有一定的参考价值。
数字签名的流程
1.打开磁盘的私钥文件
2.将私钥文件中的内容读出
3.使用pem对数据解码,得到pem.Block结构体变量
4.x509将数据解析成私钥结构体得到私钥
5.创建一个哈希对象
6.给哈希对象添加数据
7.计算哈希值
8.使用rsa中的函数对散列值签名
数字认证的流程
1.打开磁盘的公钥文件
2.使用pem解码得到pem.Block结构体变量
3.使用x509对pem.Block中的变量进行解析得到一个公钥接口
4.进行类型断言得到公钥结构体
5.对原始消息进行哈希运算(和签名算法使用的哈希算法一致)
- 创建哈希接口
- 添加数据
- 哈希运算
6.签名认证
数字签名go 中应用
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/pem"
"os"
)
//RSA 签名
func SignRSA(plainText []byte, priFileName string) []byte {
//1.打开磁盘的私钥文件
file, err := os.Open(priFileName)
if err != nil {
panic(err)
}
defer file.Close()
//2.将私钥文件中的内容读出
fileInfo, err := file.Stat()
if err != nil {
panic(err)
}
buf := make([]byte, fileInfo.Size())
_, err = file.Read(buf)
if err != nil {
panic(err)
}
//3.使用pem对数据解码,得到pem.Block结构体变量
block, _ := pem.Decode(buf)
//4.x509将数据解析成私钥结构体得到私钥
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
panic(err)
}
//5.创建一个哈希对象
hash := sha256.New()
//6.给哈希对象添加数据
_, err = hash.Write(plainText)
if err != nil {
panic(err)
}
//7.计算哈希值
hashed := hash.Sum(nil)
//8.使用rsa中的函数对散列值签名
signText, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed)
if err != nil {
panic(err)
}
return signText
}
func VerifyRSA(plainText, signText []byte, pubFileName string) bool {
//1.打开磁盘的公钥文件
file, err := os.Open(pubFileName)
if err != nil {
panic(err)
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
panic(err)
}
buf := make([]byte ,fileInfo.Size())
_, err = file.Read(buf)
if err != nil {
panic(err)
}
//2.使用pem解码得到pem.Block结构体变量
block, _ := pem.Decode(buf)
//3.使用x509对pem.Block中的变量进行解析得到一个公钥接口
pubKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
panic(err)
}
//4.进行类型断言得到公钥结构体
publicKey := pubKeyInterface.(*rsa.PublicKey)
//5.对原始消息进行哈希运算(和签名算法使用的哈希算法一致)
//
//* 创建哈希接口
hash := sha256.New()
//* 添加数据
hash.Write(plainText)
//* 哈希运算
hasded := hash.Sum(nil)
//
//6.签名认证
err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hasded, signText)
if err != nil {
return false
}
return true
}
func main (){
src := []byte("### 数字签名\\n\\n#### 数字签名的流程\\n\\n> 1.打开磁盘的私钥文件\\n> 2.将私钥文件中的内容读出\\n> 3.使用pem对数据解码,得到pem.Block结构体变量\\n> 4.x509将数据解析成私钥结构体得到私钥\\n> 5.创建一个哈希对象\\n> 6.给哈希对象添加数据\\n> 7.计算哈希值\\n> 8.使用rsa中的函数对散列值签名\\n\\n#### 数字认证的流程\\n\\n> 1.打开磁盘的公钥文件\\n> 2.使用pem解码得到pem.Block结构体变量\\n> 3.使用x509对pem.Block中的变量进行解析得到一个公钥接口\\n> 4.进行类型断言得到公钥结构体\\n> 5.对原始消息进行哈希运算(和签名算法使用的哈希算法一致)\\n>\\n> * 创建哈希接口\\n> * 添加数据\\n> * 哈希运算\\n>\\n> 6.签名认证")
signText := SignRSA(src, "private.pem")
flag := VerifyRSA(src, signText, "public.pem")
fmt.Println("签名验签结果:", flag)
}
以上是关于密码技术--RSA数字签名及Go语言应用的主要内容,如果未能解决你的问题,请参考以下文章