aes.go 1.1 KB

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