encoding.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package utils
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "encoding/base64"
  7. )
  8. func AESEncrypt(originData string, key string) (string, error) {
  9. keyBytes := []byte(key)
  10. block, err := aes.NewCipher(keyBytes)
  11. if err != nil {
  12. return "", err
  13. }
  14. originDataBytes := []byte(originData)
  15. blockSize := block.BlockSize()
  16. originDataBytes = pkcs7Padding(originDataBytes, blockSize)
  17. blockMode := cipher.NewCBCEncrypter(block, keyBytes[:blockSize])
  18. encrypted := make([]byte, len(originDataBytes))
  19. blockMode.CryptBlocks(encrypted, originDataBytes)
  20. return base64.StdEncoding.EncodeToString(encrypted), nil
  21. }
  22. func AESDecrypt(encrypted string, key string) (string, error) {
  23. keyBytes := []byte(key)
  24. block, err := aes.NewCipher(keyBytes)
  25. if err != nil {
  26. return "", err
  27. }
  28. decoded, err := base64.StdEncoding.DecodeString(encrypted)
  29. if err != nil {
  30. return "", err
  31. }
  32. blockSize := block.BlockSize()
  33. blockMode := cipher.NewCBCDecrypter(block, keyBytes[:blockSize])
  34. originData := make([]byte, len(decoded))
  35. blockMode.CryptBlocks(originData, decoded)
  36. originData = pkcs7UnPadding(originData)
  37. return string(originData), nil
  38. }
  39. func pkcs7Padding(ciphertext []byte, blockSize int) []byte {
  40. padding := blockSize - len(ciphertext)%blockSize
  41. padText := bytes.Repeat([]byte{byte(padding)}, padding)
  42. return append(ciphertext, padText...)
  43. }
  44. func pkcs7UnPadding(originData []byte) []byte {
  45. length := len(originData)
  46. unPadding := int(originData[length-1])
  47. return originData[:(length - unPadding)]
  48. }