aes.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. return origData[:(m - n)]
  17. }
  18. func AesEncrypt(buf, key []byte) ([]byte, error) {
  19. block, err := aes.NewCipher(key)
  20. if err != nil {
  21. return nil, err
  22. }
  23. defer func() {
  24. if v := recover(); v != nil {
  25. err = fmt.Errorf("decrypt error %v", v)
  26. }
  27. }()
  28. blockSize := block.BlockSize()
  29. buf = PKCS7Padding(buf, blockSize)
  30. blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
  31. tmp := make([]byte, len(buf))
  32. blockMode.CryptBlocks(tmp, buf)
  33. return tmp, nil
  34. }
  35. func AesDecrypt(buf, key []byte) ([]byte, error) {
  36. block, err := aes.NewCipher(key)
  37. if err != nil {
  38. return nil, err
  39. }
  40. defer func() {
  41. if v := recover(); v != nil {
  42. err = fmt.Errorf("decrypt error %v", v)
  43. }
  44. }()
  45. blockSize := block.BlockSize()
  46. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  47. origData := make([]byte, len(buf))
  48. blockMode.CryptBlocks(origData, buf)
  49. origData = PKCS7UnPadding(origData)
  50. return origData, nil
  51. }