Aes.go 1.7 KB

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