71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package secrets
 | |
| 
 | |
| import (
 | |
| 	"crypto/aes"
 | |
| 	"crypto/cipher"
 | |
| 	"crypto/rand"
 | |
| 	"encoding/hex"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| )
 | |
| 
 | |
| // encrypt/decrypt functions are taken from https://www.melvinvivas.com/how-to-encrypt-and-decrypt-data-using-aes/
 | |
| 
 | |
| func encrypt(stringToEncrypt string, key []byte) (string, error) {
 | |
| 	plaintext := []byte(stringToEncrypt)
 | |
| 
 | |
| 	//Create a new Cipher Block from the key
 | |
| 	block, err := aes.NewCipher(key)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	//Create a new GCM - https://en.wikipedia.org/wiki/Galois/Counter_Mode
 | |
| 	//https://golang.org/pkg/crypto/cipher/#NewGCM
 | |
| 	aesGCM, err := cipher.NewGCM(block)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	//Create a nonce. Nonce should be from GCM
 | |
| 	nonce := make([]byte, aesGCM.NonceSize())
 | |
| 	if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	//Encrypt the data using aesGCM.Seal
 | |
| 	//Since we don't want to save the nonce somewhere else in this case, we add it as a prefix to the encrypted data. The first nonce argument in Seal is the prefix.
 | |
| 	ciphertext := aesGCM.Seal(nonce, nonce, plaintext, nil)
 | |
| 	return fmt.Sprintf("%x", ciphertext), nil
 | |
| }
 | |
| 
 | |
| func decrypt(encryptedString string, key []byte) (string, error) {
 | |
| 	enc, _ := hex.DecodeString(encryptedString)
 | |
| 
 | |
| 	//Create a new Cipher Block from the key
 | |
| 	block, err := aes.NewCipher(key)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	//Create a new GCM
 | |
| 	aesGCM, err := cipher.NewGCM(block)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	//Get the nonce size
 | |
| 	nonceSize := aesGCM.NonceSize()
 | |
| 
 | |
| 	//Extract the nonce from the encrypted data
 | |
| 	nonce, ciphertext := enc[:nonceSize], enc[nonceSize:]
 | |
| 
 | |
| 	//Decrypt the data
 | |
| 	plaintext, err := aesGCM.Open(nil, nonce, ciphertext, nil)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	return fmt.Sprintf("%s", plaintext), nil
 | |
| }
 |