132 lines
2.7 KiB
Go
132 lines
2.7 KiB
Go
|
package rsa
|
||
|
|
||
|
import (
|
||
|
"crypto/rand"
|
||
|
"crypto/rsa"
|
||
|
"crypto/x509"
|
||
|
"encoding/base64"
|
||
|
"encoding/pem"
|
||
|
)
|
||
|
|
||
|
var _ Public = (*rsaPub)(nil)
|
||
|
var _ Private = (*rsaPri)(nil)
|
||
|
|
||
|
type Public interface {
|
||
|
i()
|
||
|
EncryptURLEncoding(encryptStr string) (string, error)
|
||
|
Encrypt(encryptStr string) (string, error)
|
||
|
}
|
||
|
|
||
|
type Private interface {
|
||
|
i()
|
||
|
|
||
|
Decrypt(decryptStr string) (string, error)
|
||
|
DecryptURLEncoding(decryptStr string) (string, error)
|
||
|
}
|
||
|
|
||
|
type rsaPub struct {
|
||
|
PublicKey string
|
||
|
}
|
||
|
|
||
|
type rsaPri struct {
|
||
|
PrivateKey string
|
||
|
}
|
||
|
|
||
|
func NewPublic(publicKey string) Public {
|
||
|
return &rsaPub{
|
||
|
PublicKey: publicKey,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func NewPrivate(privateKey string) Private {
|
||
|
return &rsaPri{
|
||
|
PrivateKey: privateKey,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (pub *rsaPub) i() {}
|
||
|
|
||
|
func (pub *rsaPub) Encrypt(encryptStr string) (string, error) {
|
||
|
// pem 解码
|
||
|
block, _ := pem.Decode([]byte(pub.PublicKey))
|
||
|
|
||
|
// x509 解码
|
||
|
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
// 类型断言
|
||
|
publicKey := publicKeyInterface.(*rsa.PublicKey)
|
||
|
|
||
|
//对明文进行加密
|
||
|
encryptedStr, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, []byte(encryptStr))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
//返回密文
|
||
|
return base64.StdEncoding.EncodeToString(encryptedStr), nil
|
||
|
}
|
||
|
|
||
|
func (pub *rsaPub) EncryptURLEncoding(encryptStr string) (string, error) {
|
||
|
// pem 解码
|
||
|
block, _ := pem.Decode([]byte(pub.PublicKey))
|
||
|
|
||
|
// x509 解码
|
||
|
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
// 类型断言
|
||
|
publicKey := publicKeyInterface.(*rsa.PublicKey)
|
||
|
|
||
|
//对明文进行加密
|
||
|
encryptedStr, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, []byte(encryptStr))
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
//返回密文
|
||
|
return base64.URLEncoding.EncodeToString(encryptedStr), nil
|
||
|
}
|
||
|
|
||
|
func (pri *rsaPri) i() {}
|
||
|
|
||
|
func (pri *rsaPri) Decrypt(decryptStr string) (string, error) {
|
||
|
// pem 解码
|
||
|
block, _ := pem.Decode([]byte(pri.PrivateKey))
|
||
|
|
||
|
// X509 解码
|
||
|
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
decryptBytes, err := base64.StdEncoding.DecodeString(decryptStr)
|
||
|
|
||
|
//对密文进行解密
|
||
|
decrypted, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, decryptBytes)
|
||
|
|
||
|
//返回明文
|
||
|
return string(decrypted), nil
|
||
|
}
|
||
|
|
||
|
func (pri *rsaPri) DecryptURLEncoding(decryptStr string) (string, error) {
|
||
|
// pem 解码
|
||
|
block, _ := pem.Decode([]byte(pri.PrivateKey))
|
||
|
|
||
|
// X509 解码
|
||
|
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr)
|
||
|
|
||
|
//对密文进行解密
|
||
|
decrypted, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, decryptBytes)
|
||
|
|
||
|
//返回明文
|
||
|
return string(decrypted), nil
|
||
|
}
|