Aes.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package lib
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "encoding/base64"
  7. )
  8. func AesEncryptCBC(orig string, key string) string {
  9. // 转成字节数组
  10. origData := []byte(orig)
  11. k := []byte(key)
  12. // 分组秘钥
  13. // NewCipher该函数限制了输入k的长度必须为16, 24或者32
  14. block, _ := aes.NewCipher(k)
  15. // 获取秘钥块的长度
  16. blockSize := block.BlockSize()
  17. // 补全码
  18. origData = PKCS7Padding(origData, blockSize)
  19. // 加密模式
  20. blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])
  21. // 创建数组
  22. cryted := make([]byte, len(origData))
  23. // 加密
  24. blockMode.CryptBlocks(cryted, origData)
  25. return base64.StdEncoding.EncodeToString(cryted)
  26. }
  27. func AesDecryptCBC(cryted string, key string) string {
  28. // 转成字节数组
  29. crytedByte, _ := base64.StdEncoding.DecodeString(cryted)
  30. k := []byte(key)
  31. // 分组秘钥
  32. block, _ := aes.NewCipher(k)
  33. // 获取秘钥块的长度
  34. blockSize := block.BlockSize()
  35. // 加密模式
  36. blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])
  37. // 创建数组
  38. orig := make([]byte, len(crytedByte))
  39. // 解密
  40. blockMode.CryptBlocks(orig, crytedByte)
  41. // 去补全码
  42. orig = PKCS7UnPadding(orig)
  43. return string(orig)
  44. }
  45. // 补码
  46. // AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。
  47. func PKCS7Padding(ciphertext []byte, blocksize int) []byte {
  48. padding := blocksize - len(ciphertext)%blocksize
  49. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  50. return append(ciphertext, padtext...)
  51. }
  52. // 去码
  53. func PKCS7UnPadding(origData []byte) []byte {
  54. length := len(origData)
  55. unpadding := int(origData[length-1])
  56. return origData[:(length - unpadding)]
  57. }