crypto.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package utils
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "encoding/hex"
  7. "errors"
  8. "fmt"
  9. "io"
  10. )
  11. func AESEncrypt(plaintext string, key *[32]byte) (ciphertext string, err error) {
  12. block, err := aes.NewCipher(key[:])
  13. if err != nil {
  14. return "", err
  15. }
  16. gcm, err := cipher.NewGCM(block)
  17. if err != nil {
  18. return "", err
  19. }
  20. nonce := make([]byte, gcm.NonceSize())
  21. _, err = io.ReadFull(rand.Reader, nonce)
  22. if err != nil {
  23. return "", err
  24. }
  25. cypher := gcm.Seal(nonce, nonce, []byte(plaintext), nil)
  26. cyp := fmt.Sprintf("%x", cypher)
  27. return cyp, nil
  28. }
  29. func AESDecrypt(text string, key *[32]byte) (plaintext string, err error) {
  30. ciphertext, _ := hex.DecodeString(text)
  31. block, err := aes.NewCipher(key[:])
  32. if err != nil {
  33. return "", err
  34. }
  35. gcm, err := cipher.NewGCM(block)
  36. if err != nil {
  37. return "", err
  38. }
  39. if len(ciphertext) < gcm.NonceSize() {
  40. return "", errors.New("malformed ciphertext")
  41. }
  42. decodedtext, err := gcm.Open(nil,
  43. ciphertext[:gcm.NonceSize()],
  44. ciphertext[gcm.NonceSize():],
  45. nil,
  46. )
  47. if err != nil {
  48. return "", err
  49. }
  50. return string(decodedtext), err
  51. }