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

Yuan_sr

数字签名的流程

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)
}
阅读 528
13 声望
5 粉丝
0 条评论
13 声望
5 粉丝
文章目录
宣传栏