symmetric.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package common
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "fmt"
  7. )
  8. func DecryptAESGCM(data, key []byte) ([]byte, error) {
  9. block, err := aes.NewCipher(key)
  10. if err != nil {
  11. return nil, fmt.Errorf("failed to create cipher: %v", err)
  12. }
  13. gcm, err := cipher.NewGCM(block)
  14. if err != nil {
  15. return nil, fmt.Errorf("failed to create gcm: %v", err)
  16. }
  17. nonceSize := gcm.NonceSize()
  18. if len(data) < nonceSize {
  19. return nil, fmt.Errorf("data is too short")
  20. }
  21. nonce, data := data[:nonceSize], data[nonceSize:]
  22. out, err := gcm.Open(nil, nonce, data, nil)
  23. if err != nil {
  24. return nil, fmt.Errorf("failed to decrypt: %v", err)
  25. }
  26. return out, nil
  27. }
  28. func EncryptAESGCM(plaintext, key []byte) ([]byte, error) {
  29. block, err := aes.NewCipher(key)
  30. if err != nil {
  31. return nil, fmt.Errorf("failed to create cipher: %v", err)
  32. }
  33. gcm, err := cipher.NewGCM(block)
  34. if err != nil {
  35. return nil, fmt.Errorf("failed to create gcm: %v", err)
  36. }
  37. nonce := make([]byte, gcm.NonceSize())
  38. if _, err = rand.Read(nonce); err != nil {
  39. return nil, fmt.Errorf("failed to read random data: %v", err)
  40. }
  41. out := gcm.Seal(nil, nonce, plaintext, nil)
  42. return append(nonce, out...), nil
  43. }