aes.go 1.3KB

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