aes.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package aes
  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 Encrypt(buf, key []byte) ([]byte, error) {
  23. var (
  24. err error
  25. blockSize int
  26. block cipher.Block
  27. )
  28. if block, err = aes.NewCipher(key); err != nil {
  29. return nil, err
  30. }
  31. defer func() {
  32. if v := recover(); v != nil {
  33. err = fmt.Errorf("decrypt error %v", v)
  34. }
  35. }()
  36. blockSize = block.BlockSize()
  37. buf = PKCS7Padding(buf, blockSize)
  38. blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  39. tmp := make([]byte, len(buf))
  40. blockMode.CryptBlocks(tmp, buf)
  41. return tmp, nil
  42. }
  43. func Decrypt(buf, key []byte) ([]byte, error) {
  44. var (
  45. err error
  46. blockSize int
  47. block cipher.Block
  48. )
  49. if block, err = aes.NewCipher(key); err != nil {
  50. return nil, err
  51. }
  52. defer func() {
  53. if v := recover(); v != nil {
  54. err = fmt.Errorf("decrypt error %v", v)
  55. }
  56. }()
  57. blockSize = block.BlockSize()
  58. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  59. origData := make([]byte, len(buf))
  60. blockMode.CryptBlocks(origData, buf)
  61. origData = PKCS7UnPadding(origData)
  62. return origData, nil
  63. }