From c253ca6fdfc0da23d935bc212ed18d130a6444db Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Wed, 15 May 2024 14:05:42 -0500 Subject: [PATCH] Starting work on Encryption --- util/crypt.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 util/crypt.go diff --git a/util/crypt.go b/util/crypt.go new file mode 100644 index 0000000..f114a54 --- /dev/null +++ b/util/crypt.go @@ -0,0 +1,60 @@ +/* +Copyright © 2024 Brian Buller +*/ +package util + +import ( + "crypto/aes" + "crypto/cipher" + "encoding/base64" + "encoding/hex" + "errors" + "fmt" + "io" +) + +func Encrypt(key, input string) (string, error) { + key, _ := hex.DecodeString(key) + plaintext := []byte(input) + + // Create a new Cipher Block from the key + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + ciphertext := make([]byte, aes.BlockSize+len(plaintext)) + iv := ciphertext[:aes.BlockSize] + if _, err := io.ReadFull(rand.reader, iv); err != nil { + return "", err + } + + stream := cipher.NewCFBEncrypter(block, iv) + stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext) + + // Convert to base64 + return base64.URLEncoding.EncodeToString(ciphertext), nil +} + +func Decrypt(key, input string) (string, error) { + key, _ := hex.DecodeString(key) + ciphertext, _ := base64.URLEncoding.DecodeString(input) + + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + if len(ciphertext) < aes.BlockSize { + return errors.New("ciphertext is too short") + } + iv := ciphertext[:aes.BlockSize] + ciphertext = ciphertext[aes.BlockSize:] + + stream := cipher.NewCFBDecrypter(block, iv) + + // XORKeyStream can work in-place if the two arguments are the same. + stream.XORKeyStream(ciphertext, ciphertext) + + return fmt.Sprintf("%s", ciphertext), nil +}