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.

76 lines
2.1 KiB

4 years ago
  1. package utils
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "encoding/base64"
  7. "fmt"
  8. )
  9. /**
  10. AES加密解密
  11. 使用CBC模式+PKCS7 填充方式实现AES的加密和解密
  12. */
  13. const key = "Al89RRSWdczx132"
  14. // 校验密码
  15. func CheckPWD(password, enPassword string) bool {
  16. de := AESDecrypt(enPassword)
  17. if (password == de) {
  18. return true
  19. }
  20. return false
  21. }
  22. // -----------------------------------------------------------
  23. // ----------------------- 解密 ------------------------------
  24. // -----------------------------------------------------------
  25. // 先base64转码,再解密
  26. func AESDecrypt(baseStr string) string {
  27. crypted, err := base64.StdEncoding.DecodeString(baseStr)
  28. fmt.Println(crypted)
  29. if (err != nil) {
  30. fmt.Println("base64 encoding 错误")
  31. }
  32. block,_ := aes.NewCipher([]byte(key))
  33. blockSize := block.BlockSize()
  34. blockMode := cipher.NewCBCDecrypter(block, []byte(key)[:blockSize])
  35. originPWD := make([]byte, len(crypted))
  36. blockMode.CryptBlocks(originPWD, crypted)
  37. originPWD = pkcs7_unPadding(originPWD)
  38. return string(originPWD)
  39. }
  40. // 补码
  41. func pkcs7_unPadding(origData []byte) []byte {
  42. length := len(origData)
  43. unpadding := int(origData[length-1])
  44. return origData[:length-unpadding]
  45. }
  46. // -----------------------------------------------------------
  47. // ----------------------- 加密 ------------------------------
  48. // -----------------------------------------------------------
  49. // 加密后再base64编码成string
  50. func AESEncrypt(originPWD []byte) string {
  51. //获取block块
  52. block,_ :=aes.NewCipher([]byte(key))
  53. //补码
  54. originPWD = pkcs7_padding(originPWD, block.BlockSize())
  55. //加密模式,
  56. blockMode := cipher.NewCBCEncrypter(block, []byte(key)[:block.BlockSize()])
  57. //创建明文长度的数组
  58. crypted := make([]byte,len(originPWD))
  59. //加密明文
  60. blockMode.CryptBlocks(crypted, originPWD)
  61. return base64.StdEncoding.EncodeToString(crypted)
  62. }
  63. // 补码
  64. func pkcs7_padding(origData []byte, blockSize int) []byte {
  65. //计算需要补几位数
  66. padding := blockSize-len(origData)%blockSize
  67. //在切片后面追加char数量的byte(char)
  68. padtext := bytes.Repeat([]byte{byte(padding)},padding)
  69. return append(origData,padtext...)
  70. }