package utils import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/pem" "errors" ) // BytesToPrivateKey bytes to private key func BytesToPrivateKey(priv []byte) (*rsa.PrivateKey, error) { block, _ := pem.Decode(priv) enc := x509.IsEncryptedPEMBlock(block) b := block.Bytes var err error if enc { b, err = x509.DecryptPEMBlock(block, nil) if err != nil { return nil, err } } key, err := x509.ParsePKCS1PrivateKey(b) if err != nil { return nil, err } return key, nil } // BytesToPublicKey bytes to public key func BytesToPublicKey(pub []byte) (*rsa.PublicKey, error) { block, _ := pem.Decode(pub) enc := x509.IsEncryptedPEMBlock(block) b := block.Bytes var err error if enc { b, err = x509.DecryptPEMBlock(block, nil) if err != nil { return nil, err } } ifc, err := x509.ParsePKIXPublicKey(b) if err != nil { return nil, err } key, ok := ifc.(*rsa.PublicKey) if !ok { return nil, errors.New("not ok") } return key, nil } // EncryptWithPublicKey encrypts data with public key func EncryptWithPublicKey(msg []byte, pub *rsa.PublicKey) ([]byte, error) { hash := sha256.New() ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil) if err != nil { return nil, err } return ciphertext, nil } // DecryptWithPrivateKey decrypts data with private key func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) ([]byte, error) { hash := sha256.New() plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil) if err != nil { return nil, err } return plaintext, nil }