aes.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package crypto
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "encoding/base64"
  7. "fmt"
  8. "github.com/0xJacky/Nginx-UI/settings"
  9. "github.com/pkg/errors"
  10. "io"
  11. )
  12. // AesEncrypt encrypts text and given key with AES.
  13. func AesEncrypt(text []byte) ([]byte, error) {
  14. if len(text) == 0 {
  15. return nil, errors.New("AesEncrypt text is empty")
  16. }
  17. block, err := aes.NewCipher(settings.CryptoSettings.GetSecretMd5())
  18. if err != nil {
  19. return nil, fmt.Errorf("AesEncrypt invalid key: %v", err)
  20. }
  21. b := base64.StdEncoding.EncodeToString(text)
  22. ciphertext := make([]byte, aes.BlockSize+len(b))
  23. iv := ciphertext[:aes.BlockSize]
  24. if _, err = io.ReadFull(rand.Reader, iv); err != nil {
  25. return nil, fmt.Errorf("AesEncrypt unable to read IV: %w", err)
  26. }
  27. cfb := cipher.NewCFBEncrypter(block, iv)
  28. cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))
  29. return ciphertext, nil
  30. }
  31. // AesDecrypt decrypts text and given key with AES.
  32. func AesDecrypt(text []byte) ([]byte, error) {
  33. block, err := aes.NewCipher(settings.CryptoSettings.GetSecretMd5())
  34. if err != nil {
  35. return nil, err
  36. }
  37. if len(text) < aes.BlockSize {
  38. return nil, errors.New("AesDecrypt ciphertext too short")
  39. }
  40. iv := text[:aes.BlockSize]
  41. text = text[aes.BlockSize:]
  42. cfb := cipher.NewCFBDecrypter(block, iv)
  43. cfb.XORKeyStream(text, text)
  44. data, err := base64.StdEncoding.DecodeString(string(text))
  45. if err != nil {
  46. return nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w", err)
  47. }
  48. return data, nil
  49. }