Aes.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. }
  58. // 实现解密
  59. func AesDeCrypt(cypted []byte, key []byte) ([]byte, error) {
  60. //创建加密算法实例
  61. block, err := aes.NewCipher(key)
  62. if err != nil {
  63. return nil, err
  64. }
  65. //获取块大小
  66. blockSize := block.BlockSize()
  67. //创建加密客户端实例
  68. blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
  69. origData := make([]byte, len(cypted))
  70. //这个函数也可以用来解密
  71. blockMode.CryptBlocks(origData, cypted)
  72. //去除填充字符串
  73. origData = PKCS7UnPadding(origData)
  74. return origData, nil
  75. }