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