package crypto import ( "crypto/rand" "crypto/rsa" "crypto/sha512" "encoding/base64" "math/big" ) type RSAKey string func (key *RSAKey) Encrypt(data []byte) []byte { pk := key.PubFromBase64() encrypted, err := rsa.EncryptOAEP(sha512.New(), rand.Reader, &pk, data, nil) throw(err) return encrypted } func (key *RSAKey) Decrypt(data []byte) []byte { pk := key.PKFromBase64() decrypted, err := rsa.DecryptOAEP(sha512.New(), rand.Reader, &pk, data, nil) throw(err) return decrypted } func (key *RSAKey) EncryptToString(str string) string { return base64.StdEncoding.EncodeToString(key.Encrypt([]byte(str))) } func (key *RSAKey) DecryptToString(b64 string) string { raw, _ := base64.StdEncoding.DecodeString(b64) return string(key.Decrypt(raw)) } func (key *RSAKey) PubFromBase64() rsa.PublicKey { raw, err := base64.StdEncoding.DecodeString(string(*key)) throw(err) pk := rsa.PublicKey{ N: new(big.Int).SetBytes(raw), E: 65537, } return pk } func (key *RSAKey) PKFromBase64() rsa.PrivateKey { pk, err := Base64ToKeys(string(*key)) throw(err) return *pk }