yolk/crypt/rsa.go

100 lines
2.8 KiB
Go

/*
* @Date: 2021-03-11 17:51:14
* @LastEditors: viletyy
* @LastEditTime: 2021-04-26 23:11:30
* @FilePath: /yolk/crypt/rsa.go
*/
package crypt
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"errors"
)
// 私钥生成
//openssl genrsa -out rsa_private_key.pem 1024
var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQC1mv515+z3BQYim0nKZPrYm94fPoX0Ew/AJggSdnA2shRsJdMk
AWretmVVej0AH3mBJ1+6tBXXB8+d+7ffNeHWJYrzoh7gPompQWEIvnArcwnhvTA+
8xtdd82GWDKC46pNSqhUGEG/oEqq8Y7C3YoReppJWX7M7xut+YHI+m1hhwIDAQAB
AoGBAIO5WLjM8OR7kGepm2xislBLPmILR74x1UraSyCZJ+uEX6vSA8QqAwpn4jiN
4ZElQ0ya8qTJ2s2NrNo6qrQMsTEaLKYrombAkZbghRYjeAhVCAnIFdchLpV/BG7n
NqxdzV8p1iZeK7qGQm9SWWzS60eO+5RCeUWRB9l3VKai242BAkEA32iXN6bZAIeW
wUIr5GiOV8l6Puw8Or/nRMISHqo4qpbZu2btUTmOuHbLNMo+vVIxCtem2QYGsgMj
9P44fVwJtQJBANAZObuBUkbsqbX/CA+ikDKDtN6wET6S1KaKTU0P5XhxIWeBE8at
EQNqzqaTZ+IMeohjDxTzFlFb3VhHFi2cU8sCQQDM5tSqijDFN5ahMdun5e2HvpaM
V4b2K0Ql4AlWbrECZNDV/JT0xmGL9ghyJnxcj6HDW/7/VXOWmSLFdNTCxUNxAkEA
i8hGBXOKxuV14jBbQ9VYsvXRarwt+TA781p3Lkp9Q3gKjjIgDJZ4FSmLgk0FvMvR
CwgvO01GMoRYnFGzzhNyHQJBALy1gjYLIwHwZYb5ul0s1KJGbY+Tw1qabyQ6lm6A
n5sq4iney5DPUjKcxcP17XvlD9lx7GOS8/ZVWx4krPkydOg=
-----END RSA PRIVATE KEY-----
`)
// 公钥: 根据私钥生成
//openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1mv515+z3BQYim0nKZPrYm94f
PoX0Ew/AJggSdnA2shRsJdMkAWretmVVej0AH3mBJ1+6tBXXB8+d+7ffNeHWJYrz
oh7gPompQWEIvnArcwnhvTA+8xtdd82GWDKC46pNSqhUGEG/oEqq8Y7C3YoReppJ
WX7M7xut+YHI+m1hhwIDAQAB
-----END PUBLIC KEY-----
`)
type RsaCrypt struct {
PublicKey []byte
PrivateKey []byte
}
func NewRsaCrypt(key ...[][]byte) *RsaCrypt {
if len(key) > 0 {
if len(key[0]) > 0 {
privateKey = key[0][0]
publicKey = key[0][1]
}
}
return &RsaCrypt{
PrivateKey: privateKey,
PublicKey: publicKey,
}
}
// 加密
// 这里最后的结果需要用 base64.StdEncoding.EncodeToString(data)
func (crypt *RsaCrypt) Encrypt(origData []byte) ([]byte, error) {
//解密pem格式的公钥
block, _ := pem.Decode(crypt.PublicKey)
if block == nil {
return nil, errors.New("public key error")
}
// 解析公钥
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
// 类型断言
pub := pubInterface.(*rsa.PublicKey)
//加密
return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}
// 解密
func (crypt *RsaCrypt) Decrypt(ciphertext []byte) ([]byte, error) {
//解密
block, _ := pem.Decode(crypt.PrivateKey)
if block == nil {
return nil, errors.New("private key error!")
}
//解析PKCS1格式的私钥
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
// 解密
return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}