蛋蛋星球-客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

75 lines
2.2 KiB

  1. package aes
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "encoding/base64"
  6. )
  7. // 加密
  8. func AesEncryptByECB(key, data string) string {
  9. // 判断key长度
  10. keyLenMap := map[int]struct{}{16: {}, 24: {}, 32: {}}
  11. if _, ok := keyLenMap[len(key)]; !ok {
  12. panic("key长度必须是 16、24、32 其中一个")
  13. }
  14. // 密钥和待加密数据转成[]byte
  15. originByte := []byte(data)
  16. keyByte := []byte(key)
  17. // 创建密码组,长度只能是16、24、32 字节
  18. block, _ := aes.NewCipher(keyByte)
  19. // 获取密钥长度
  20. blockSize := block.BlockSize()
  21. // 补码
  22. originByte = PKCS7Padding(originByte, blockSize)
  23. // 创建保存加密变量
  24. encryptResult := make([]byte, len(originByte))
  25. // CEB是把整个明文分成若干段相同的小段,然后对每一小段进行加密
  26. for bs, be := 0, blockSize; bs < len(originByte); bs, be = bs+blockSize, be+blockSize {
  27. block.Encrypt(encryptResult[bs:be], originByte[bs:be])
  28. }
  29. res := base64.StdEncoding.EncodeToString(encryptResult)
  30. return res
  31. }
  32. // 补码
  33. func PKCS7Padding(originByte []byte, blockSize int) []byte {
  34. // 计算补码长度
  35. padding := blockSize - len(originByte)%blockSize
  36. // 生成补码
  37. padText := bytes.Repeat([]byte{byte(padding)}, padding)
  38. // 追加补码
  39. return append(originByte, padText...)
  40. }
  41. // 解密
  42. func AesDecryptByECB(key, data string) string {
  43. // 判断key长度
  44. keyLenMap := map[int]struct{}{16: {}, 24: {}, 32: {}}
  45. if _, ok := keyLenMap[len(key)]; !ok {
  46. panic("key长度必须是 16、24、32 其中一个")
  47. }
  48. // 反解密码base64
  49. originByte, _ := base64.StdEncoding.DecodeString(data)
  50. // 密钥和待加密数据转成[]byte
  51. keyByte := []byte(key)
  52. // 创建密码组,长度只能是16、24、32字节
  53. block, _ := aes.NewCipher(keyByte)
  54. // 获取密钥长度
  55. blockSize := block.BlockSize()
  56. // 创建保存解密变量
  57. decrypted := make([]byte, len(originByte))
  58. for bs, be := 0, blockSize; bs < len(originByte); bs, be = bs+blockSize, be+blockSize {
  59. block.Decrypt(decrypted[bs:be], originByte[bs:be])
  60. }
  61. // 解码
  62. return string(PKCS7UNPadding(decrypted))
  63. }
  64. // 解码
  65. func PKCS7UNPadding(originDataByte []byte) []byte {
  66. length := len(originDataByte)
  67. unpadding := int(originDataByte[length-1])
  68. return originDataByte[:(length - unpadding)]
  69. }