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
 | 
						|
}
 |