密码技术--RSA数字签名及Go语言应用

651 阅读3分钟

数字签名的流程

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)
}