cryptaes.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // AeS加解密接口
  2. // 秒寻科技
  3. // 2024-02-18
  4. // 周涛
  5. package util
  6. import (
  7. "bytes"
  8. "crypto/aes"
  9. "crypto/cipher"
  10. "encoding/base64"
  11. "errors"
  12. )
  13. // 加密:先Aes加密,之后在base64加密
  14. // 三种密码标准:128 位、192 位和 256 位,分别对应key字符串位数 16、32、64
  15. func EncryptAes(data []byte) (string, error) {
  16. //获得密钥
  17. myViper := GetViper()
  18. aeskey := myViper.GetString("aeskey.key128")
  19. //aes加密
  20. res, err := aesEncrypt(data, []byte(aeskey))
  21. if err != nil {
  22. return "", err
  23. }
  24. return base64.StdEncoding.EncodeToString(res), nil
  25. }
  26. // 解密,先base64解密,之后再aes解密
  27. func DecryptAes(data string) (string, error) {
  28. //获得密钥
  29. myViper := GetViper()
  30. aeskey := myViper.GetString("aeskey.key128")
  31. //base64解码
  32. ciphertext, err := base64.StdEncoding.DecodeString(data)
  33. if err != nil {
  34. return "", err
  35. }
  36. //aes解密
  37. dataList, err := aesDecrypt(ciphertext, []byte(aeskey))
  38. if err != nil {
  39. return "", err
  40. }
  41. plaintext := string(dataList)
  42. return plaintext, nil
  43. }
  44. // 加密
  45. func aesEncrypt(data []byte, key []byte) ([]byte, error) {
  46. // 创建加密实例
  47. block, err := aes.NewCipher(key)
  48. if err != nil {
  49. return nil, err
  50. }
  51. // 判断加密快的大小
  52. blockSize := block.BlockSize()
  53. // 填充
  54. encryptBytes := pkcs7Padding(data, blockSize)
  55. // 初始化加密数据接收切片
  56. crypted := make([]byte, len(encryptBytes))
  57. // 使用cbc加密模式
  58. blockMode := cipher.NewCBCEncrypter(block, key) // Cipher Block Chaining:加密块链
  59. // 执行加密
  60. blockMode.CryptBlocks(crypted, encryptBytes)
  61. return crypted, nil
  62. }
  63. // 解密
  64. func aesDecrypt(data []byte, key []byte) ([]byte, error) {
  65. // 创建实例
  66. block, err := aes.NewCipher(key)
  67. if err != nil {
  68. return nil, err
  69. }
  70. // 获取块的大小
  71. //blockSize := block.BlockSize()
  72. // 使用cbc
  73. blockMode := cipher.NewCBCDecrypter(block, key) // Cipher Block Chaining:加密块链
  74. // 初始化解密数据接收切片
  75. crypted := make([]byte, len(data))
  76. // 执行解密
  77. blockMode.CryptBlocks(crypted, data)
  78. // 去除填充
  79. crypted, err = pkcs7UnPadding(crypted)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return crypted, nil
  84. }
  85. // pkcs7Padding 填充
  86. func pkcs7Padding(data []byte, blockSize int) []byte {
  87. // 判断缺少几位长度。最少1,最多 blockSize
  88. padding := blockSize - len(data)%blockSize
  89. // 补足位数。把切片[]byte{byte(padding)}复制padding个
  90. padText := bytes.Repeat([]byte{byte(padding)}, padding)
  91. return append(data, padText...)
  92. }
  93. // pkcs7UnPadding 填充的反向操作
  94. func pkcs7UnPadding(data []byte) ([]byte, error) {
  95. length := len(data)
  96. if length == 0 {
  97. return nil, errors.New("加密字符串错误!")
  98. }
  99. // 获取填充的个数
  100. unPadding := int(data[length-1])
  101. return data[:(length - unPadding)], nil
  102. }