package common import ( "crypto/aes" "crypto/cipher" "crypto/rand" "fmt" ) func DecryptAESGCM(data, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, fmt.Errorf("failed to create cipher: %v", err) } gcm, err := cipher.NewGCM(block) if err != nil { return nil, fmt.Errorf("failed to create gcm: %v", err) } nonceSize := gcm.NonceSize() if len(data) < nonceSize { return nil, fmt.Errorf("data is too short") } nonce, data := data[:nonceSize], data[nonceSize:] out, err := gcm.Open(nil, nonce, data, nil) if err != nil { return nil, fmt.Errorf("failed to decrypt: %v", err) } return out, nil } func EncryptAESGCM(plaintext, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, fmt.Errorf("failed to create cipher: %v", err) } gcm, err := cipher.NewGCM(block) if err != nil { return nil, fmt.Errorf("failed to create gcm: %v", err) } nonce := make([]byte, gcm.NonceSize()) if _, err = rand.Read(nonce); err != nil { return nil, fmt.Errorf("failed to read random data: %v", err) } out := gcm.Seal(nil, nonce, plaintext, nil) return append(nonce, out...), nil }