package ncrypt import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "os" ) // GenerateRsaKey create rsa private and public pemo file. func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error { // private key privateKey, err := rsa.GenerateKey(rand.Reader, keySize) if err != nil { return err } derText := x509.MarshalPKCS1PrivateKey(privateKey) block := pem.Block{ Type: "rsa private key", Bytes: derText, } file, err := os.Create(priKeyFile) if err != nil { panic(err) } err = pem.Encode(file, &block) if err != nil { return err } file.Close() // public key publicKey := privateKey.PublicKey derpText, err := x509.MarshalPKIXPublicKey(&publicKey) if err != nil { return err } block = pem.Block{ Type: "rsa public key", Bytes: derpText, } file, err = os.Create(pubKeyFile) if err != nil { return err } err = pem.Encode(file, &block) if err != nil { return err } file.Close() return nil } // RsaEncrypt encrypt data with ras algorithm. func RsaEncrypt(data []byte, pubKeyFileName string) []byte { file, err := os.Open(pubKeyFileName) if err != nil { panic(err) } fileInfo, err := file.Stat() if err != nil { panic(err) } defer file.Close() buf := make([]byte, fileInfo.Size()) _, err = file.Read(buf) if err != nil { panic(err) } block, _ := pem.Decode(buf) pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { panic(err) } pubKey := pubInterface.(*rsa.PublicKey) cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, data) if err != nil { panic(err) } return cipherText } // RsaDecrypt decrypt data with ras algorithm. func RsaDecrypt(data []byte, privateKeyFileName string) []byte { file, err := os.Open(privateKeyFileName) if err != nil { panic(err) } fileInfo, err := file.Stat() if err != nil { panic(err) } buf := make([]byte, fileInfo.Size()) defer file.Close() _, err = file.Read(buf) if err != nil { panic(err) } block, _ := pem.Decode(buf) priKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { panic(err) } plainText, err := rsa.DecryptPKCS1v15(rand.Reader, priKey, data) if err != nil { panic(err) } return plainText }