package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
"encoding/base64"
|
|
"fmt"
|
|
)
|
|
|
|
/**
|
|
AES加密解密
|
|
使用CBC模式+PKCS7 填充方式实现AES的加密和解密
|
|
*/
|
|
const key = "Al89RRSWdczx132"
|
|
|
|
// 校验密码
|
|
func CheckPWD(password, enPassword string) bool {
|
|
de := AESDecrypt(enPassword)
|
|
if password == de {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// -----------------------------------------------------------
|
|
// ----------------------- 解密 ------------------------------
|
|
// -----------------------------------------------------------
|
|
// 先base64转码,再解密
|
|
func AESDecrypt(baseStr string) string {
|
|
crypted, err := base64.StdEncoding.DecodeString(baseStr)
|
|
fmt.Println(crypted)
|
|
if err != nil {
|
|
fmt.Println("base64 encoding 错误")
|
|
}
|
|
|
|
block, _ := aes.NewCipher([]byte(key))
|
|
blockSize := block.BlockSize()
|
|
blockMode := cipher.NewCBCDecrypter(block, []byte(key)[:blockSize])
|
|
originPWD := make([]byte, len(crypted))
|
|
blockMode.CryptBlocks(originPWD, crypted)
|
|
originPWD = pkcs7_unPadding(originPWD)
|
|
return string(originPWD)
|
|
}
|
|
|
|
// 补码
|
|
func pkcs7_unPadding(origData []byte) []byte {
|
|
length := len(origData)
|
|
unpadding := int(origData[length-1])
|
|
return origData[:length-unpadding]
|
|
}
|
|
|
|
// -----------------------------------------------------------
|
|
// ----------------------- 加密 ------------------------------
|
|
// -----------------------------------------------------------
|
|
// 加密后再base64编码成string
|
|
func AESEncrypt(originPWD []byte) string {
|
|
//获取block块
|
|
block, _ := aes.NewCipher([]byte(key))
|
|
//补码
|
|
originPWD = pkcs7_padding(originPWD, block.BlockSize())
|
|
//加密模式,
|
|
blockMode := cipher.NewCBCEncrypter(block, []byte(key)[:block.BlockSize()])
|
|
//创建明文长度的数组
|
|
crypted := make([]byte, len(originPWD))
|
|
//加密明文
|
|
blockMode.CryptBlocks(crypted, originPWD)
|
|
|
|
return base64.StdEncoding.EncodeToString(crypted)
|
|
}
|
|
|
|
// 补码
|
|
func pkcs7_padding(origData []byte, blockSize int) []byte {
|
|
//计算需要补几位数
|
|
padding := blockSize - len(origData)%blockSize
|
|
//在切片后面追加char数量的byte(char)
|
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
|
return append(origData, padtext...)
|
|
}
|