diff --git a/utils/encrypted.go b/utils/encrypted.go new file mode 100644 index 0000000..81fbd17 --- /dev/null +++ b/utils/encrypted.go @@ -0,0 +1,57 @@ +package utils + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "errors" +) + +type Encrypt struct { + pubKey string + privKey string +} + +func NewEncrypt(pubKey, privKey string) *Encrypt { + return &Encrypt{pubKey: pubKey, privKey: privKey} +} + +func (e *Encrypt) EncryptStr(str string) (string, error) { + block, _ := pem.Decode([]byte(e.pubKey)) + if block == nil { + return "", errors.New("failed to parse PEM block containing the public key") + } + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return "", err + } + rsaPubKey, ok := pub.(*rsa.PublicKey) + if !ok { + return "", errors.New("failed to parse RSA public key") + } + + shifr, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPubKey, []byte(str)) + if err != nil { + return "", err + } + return string(shifr), nil +} + +func (e *Encrypt) DecryptStr(shifr string) (string, error) { + block, _ := pem.Decode([]byte(e.privKey)) + if block == nil { + return "", errors.New("failed to parse PEM block containing the private key") + } + + priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return "", err + } + + res, err := rsa.DecryptPKCS1v15(rand.Reader, priv, []byte(shifr)) + if err != nil { + return "", err + } + return string(res), nil +}