密码技术--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语言应用的主要内容,如果未能解决你的问题,请参考以下文章

密码技术--国密SM2椭圆曲线公钥密码算法及Go语言应用

密码技术--对称加密算法及Go语言应用

密码技术--椭圆曲线EDCSA数字签名及Go语言应用

密码技术--国密SM3哈希算法及Go语言应用

密码技术应用--RSA文件签名验签

密码技术--国密SM4分组密码算法及Go语言应用