go RSA 加解密算法 && 数据签名验签

更新时间: 2022-03-04 16:14:26 go语言如何实现RSA加解密算法和数据签名验签呢?人狠话不多,直接上代码

package main

import (

"crypto"

"crypto/rand"

"crypto/rsa"

"crypto/sha256"

// "crypto/sha1"

"crypto/x509"

"encoding/base64"

"encoding/pem"

"errors"

// "flag"

"fmt"

)

/**

* @Creator:www

* @Date:2021/6/14 下午3:13

* RSA 公匙

*/

var publicKey = []byte(`-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3

6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6

Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw

oYi+1hqp1fIekaxsyQIDAQAB

-----END PUBLIC KEY-----`)

/**

* @Creator:www

* @Date:2021/6/14 下午3:14

* RSA 私匙

*/

var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY-----

MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF

NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F

UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB

AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA

QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK

kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg

f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u

412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc

mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7

kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA

gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW

G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI

7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==

-----END RSA PRIVATE KEY-----`)

/**

* @Creator:www

* @Date:2021/6/14 下午3:14

* RSA 公匙加密

*/

func RsaEncrypt(sgindata string, pubKey []byte) (string, error) {

origData := []byte(sgindata)

block, _ := pem.Decode(pubKey)

if block == nil {

return "", errors.New("public key error")

}

pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)

if err != nil {

return "", err

}

pub := pubInterface.(*rsa.PublicKey)

signbase,err := rsa.EncryptPKCS1v15(rand.Reader, pub, origData)

if err != nil {

return "", err

}

sign := base64.StdEncoding.EncodeToString(signbase)

return sign , nil

}

/**

* @Creator:www

* @Date:2021/6/14 下午3:15

* RSA 私匙解密

*/

func RsaDecrypt(ciphertext string, privKey []byte) ([]byte, error) {

data, err := base64.StdEncoding.DecodeString(ciphertext)

if err != nil {

return nil, err

}

block, _ := pem.Decode(privKey)

if block == nil {

return nil, errors.New("private key error!")

}

priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)

if err != nil {

return nil, err

}

return rsa.DecryptPKCS1v15(rand.Reader, priv, data)

}

/**

* @Creator:www

* @Date:2021/6/14 下午3:36

* Rsa 对数据签名 (不可逆)

*/

func RsaSign(data string,privKey []byte) (string, error) {

origData := []byte(data)

block, _ := pem.Decode(privKey)

if block == nil {

return "", errors.New("private key error!")

}

priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)

if err != nil {

return "", err

}

h := sha256.New()

h.Write(origData)

d := h.Sum(nil)

signbase,err := rsa.SignPKCS1v15(rand.Reader, priv, crypto.SHA256,d)

if err != nil {

return "", err

}

sign := base64.StdEncoding.EncodeToString(signbase)

return sign , nil

}

/**

* @Creator:www

* @Date:2021/6/14 下午3:37

* Rsa 签名校验

*/

func RsaVerify(data string,sign string,pubKey []byte) error {

ndata := []byte(data)

nsign, err := base64.StdEncoding.DecodeString(sign)

if err != nil {

return err

}

block, _ := pem.Decode(pubKey)

if block == nil {

return errors.New("public key error")

}

pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)

if err != nil {

return err

}

pub := pubInterface.(*rsa.PublicKey)

h := sha256.New()

h.Write(ndata)

d := h.Sum(nil)

return rsa.VerifyPKCS1v15(pub, crypto.SHA256, d, nsign)

}

func main() {

signda := "sfsdfdsffdsfsdfsdfsfsff"

//datas,_ := RsaEncrypt(signda,publicKey)

//fmt.Println(string(datas))

//origData, _ := RsaDecrypt(datas, privateKey)

//fmt.Println("rsa-------" + string(origData))

sign,err := RsaSign(signda,privateKey)

fmt.Println(err)

//signda = "kghsdfsfsdfsdf"

fmt.Println(sign)

fmt.Println(RsaVerify(signda,sign,publicKey))

}