From 63446e91f1598d92da85dd1be041854953af9808 Mon Sep 17 00:00:00 2001 From: Zeev Diukman Date: Tue, 10 Sep 2024 02:46:01 +0000 Subject: [PATCH] f --- go.work | 2 +- pkg/crypto/go.mod | 3 +++ pkg/crypto/sketch.go | 63 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 pkg/crypto/go.mod create mode 100644 pkg/crypto/sketch.go diff --git a/go.work b/go.work index 7cc8b6a..26913a8 100644 --- a/go.work +++ b/go.work @@ -2,5 +2,5 @@ go 1.23.0 use ( ./ - + ./pkg/crypto ) diff --git a/pkg/crypto/go.mod b/pkg/crypto/go.mod new file mode 100644 index 0000000..605e88e --- /dev/null +++ b/pkg/crypto/go.mod @@ -0,0 +1,3 @@ +module github.com/zeevdiukman/z/crypto + +go 1.23.0 diff --git a/pkg/crypto/sketch.go b/pkg/crypto/sketch.go new file mode 100644 index 0000000..c54f0d8 --- /dev/null +++ b/pkg/crypto/sketch.go @@ -0,0 +1,63 @@ +package sketch + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" +) + +func Encrypt(plaintext string, key []byte) (string, error) { + // Create a new AES cipher + c, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + // Generate a random nonce + nonce := make([]byte, 12) + if _, err := rand.Read(nonce); err != nil { + return "", err + } + + // Create a GCM cipher + gcm, err := cipher.NewGCM(c) + if err != nil { + return "", err + } + + // Encrypt the plaintext + ciphertext := gcm.Seal(nonce, nonce, []byte(plaintext), nil) + + // Encode the ciphertext to base64 + return base64.StdEncoding.EncodeToString(ciphertext), nil +} + +func Decrypt(ciphertext string, key []byte) (string, error) { + // Decode the ciphertext from base64 + ciphertextBytes, err := base64.StdEncoding.DecodeString(ciphertext) + if err != nil { + return "", err + } + + // Create a new AES cipher + c, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + // Create a GCM cipher + gcm, err := cipher.NewGCM(c) + if err != nil { + return "", err + } + + // Decrypt the ciphertext + nonce := ciphertextBytes[:12] + plaintext, err := gcm.Open(nil, nonce, ciphertextBytes[12:], nil) + if err != nil { + return "", err + } + + return string(plaintext), nil +}