aes.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package crypto
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "fmt"
  7. )
  8. func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
  9. m := blockSize - len(ciphertext)%blockSize
  10. n := bytes.Repeat([]byte{byte(m)}, m)
  11. return append(ciphertext, n...)
  12. }
  13. func PKCS7UnPadding(origData []byte) []byte {
  14. m := len(origData)
  15. n := int(origData[m-1])
  16. if m > n {
  17. return origData[:(m - n)]
  18. } else {
  19. return origData
  20. }
  21. }
  22. func AesEncrypt(buf, key []byte) ([]byte, error) {
  23. block, err := aes.NewCipher(key)
  24. if err != nil {
  25. return nil, err
  26. }
  27. defer func() {
  28. if v := recover(); v != nil {
  29. err = fmt.Errorf("decrypt error %v", v)
  30. }
  31. }()
  32. blockSize := block.BlockSize()
  33. buf = PKCS7Padding(buf, blockSize)
  34. blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  35. tmp := make([]byte, len(buf))
  36. blockMode.CryptBlocks(tmp, buf)
  37. return tmp, nil
  38. }
  39. func AesDecrypt(buf, key []byte) ([]byte, error) {
  40. block, err := aes.NewCipher(key)
  41. if err != nil {
  42. return nil, err
  43. }
  44. defer func() {
  45. if v := recover(); v != nil {
  46. err = fmt.Errorf("decrypt error %v", v)
  47. }
  48. }()
  49. blockSize := block.BlockSize()
  50. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  51. origData := make([]byte, len(buf))
  52. blockMode.CryptBlocks(origData, buf)
  53. origData = PKCS7UnPadding(origData)
  54. return origData, nil
  55. }