Rsa go
Jump to navigation
Jump to search
https://medium.com/@rafaelescrich/modern-cryptography-using-go-50e85f0f65af
package main import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt" "io" "os" ) // RSA const ( rsaKeySize = 2048 ) type keypair struct { priv *rsa.PrivateKey pub *rsa.PublicKey } var kp keypair var ciphertext, signedMessage []byte var rng io.Reader func generateKeypair() error { var err error kp.priv, err = rsa.GenerateKey(rand.Reader, rsaKeySize) if err != nil { return err } kp.pub = &kp.priv.PublicKey return nil } func encrypt() { var err error secretMessage := []byte("This is the plaintext to be encrypted") label := []byte("mediumpost") ciphertext, err = rsa.EncryptOAEP(sha256.New(), rng, kp.pub, secretMessage, label) if err != nil { fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err) return } // Since encryption is a randomized function, ciphertext will be // different each time. fmt.Printf("Ciphertext: %x\n", ciphertext) } func decrypt() { label := []byte("mediumpost") plaintext, err := rsa.DecryptOAEP(sha256.New(), rng, kp.priv, ciphertext, label) if err != nil { fmt.Fprintf(os.Stderr, "Error from decryption: %s\n", err) return } fmt.Printf("Plaintext: %s\n", string(plaintext)) } func sign() { var err error message := []byte("This is the plaintext to be signed") signedMessage, err = rsa.EncryptPKCS1v15(rng, kp.pub, message) if err != nil { fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err) return } fmt.Printf("Signed Message: %x\n", signedMessage) } func verify() { msgVerified, err := rsa.DecryptPKCS1v15(rng, kp.priv, signedMessage) if err != nil { fmt.Fprintf(os.Stderr, "Error from decryption: %s\n", err) return } fmt.Printf("Verified Message: %s\n", string(msgVerified)) } func main() { // crypto/rand.Reader is a good source of entropy for randomizing // encryption function. rng = rand.Reader // generates pair of keys generateKeypair() // encrypt message encrypt() // decrypt message decrypt() // sign message sign() // verify message verify() }