aes.go 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package utils
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "github.com/astaxie/beego"
  7. )
  8. // PKCS7Padding 填充序列的每个字节都填paddingSize
  9. func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
  10. padding := blockSize - len(ciphertext)%blockSize
  11. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  12. return append(ciphertext, padtext...)
  13. }
  14. // PKCS7UnPadding 取消填充序列的每个字节都填paddingSize
  15. func PKCS7UnPadding(origData []byte) []byte {
  16. length := len(origData)
  17. unpadding := int(origData[length-1])
  18. return origData[:(length - unpadding)]
  19. }
  20. // AesEncrypt 加密
  21. func AesEncrypt(origData, key []byte) ([]byte, error) {
  22. block, err := aes.NewCipher(key)
  23. if err != nil {
  24. return nil, err
  25. }
  26. blockSize := block.BlockSize()
  27. origData = PKCS7Padding(origData, blockSize)
  28. blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  29. crypted := make([]byte, len(origData))
  30. blockMode.CryptBlocks(crypted, origData)
  31. return crypted, nil
  32. }
  33. // AesDecrypt 解密
  34. func AesDecrypt(crypted, key []byte) ([]byte, error) {
  35. block, err := aes.NewCipher(key)
  36. if err != nil {
  37. beego.Error(err)
  38. return nil, err
  39. }
  40. blockSize := block.BlockSize()
  41. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  42. origData := make([]byte, len(crypted))
  43. beego.Error(origData)
  44. beego.Error(crypted)
  45. blockMode.CryptBlocks(origData, crypted)
  46. origData = PKCS7UnPadding(origData)
  47. return origData, nil
  48. }