package response import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/base64" "math/rand" "strings" "time" ) var ( isDebug bool encryptKey string ) // Init 初始化响应加密相关配置(对应旧项目 base.is_debug / encrypt.encrypt_key) func Init(debug bool, key string) { isDebug = debug encryptKey = key } func GetConfigBool(key string) bool { if key == "base.is_debug" { return isDebug } return false } func GetConfigString(key string) string { if key == "encrypt.encrypt_key" { return encryptKey } return "" } func GetEncrypt(key string, nums ...int8) string { original := GetConfigString(key) str := original //TODO 后台切换到新版时开启 //for _, num := range nums { // str = str[num:] + str[:num] //} return str } // GetRandString 取得随机字符串:使用字符串拼接 func GetRandString(length int) string { if length < 1 { return "" } char := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" charArr := strings.Split(char, "") charlen := len(charArr) ran := rand.New(rand.NewSource(time.Now().Unix())) var rchar string = "" for i := 1; i <= length; i++ { rchar = rchar + charArr[ran.Intn(charlen)] } return rchar } type Crypto struct{} // EncryptKey 加密 func (c Crypto) EncryptKey(data []byte, key string) (map[string]string, Error) { info, err := c.aesCBCEncryptKey(data, key) if err != nil { return nil, err } return info, nil } func (c Crypto) aesCBCEncryptKey(data []byte, key string) (map[string]string, Error) { k := []byte(key) iv := GetRandString(NumberSixteen) // 分组密钥 block, err := aes.NewCipher(k) if err != nil { return nil, ErrorEncryptAesKeyError } // 获取密钥块的长度 blockSize := block.BlockSize() // 补充码 data = c.pKCS7Padding(data, blockSize) // 加密模式 blockMode := cipher.NewCBCEncrypter(block, []byte(iv)) // 创建数组 crypted := make([]byte, len(data)) // 加密 blockMode.CryptBlocks(crypted, data) return map[string]string{ "data": base64.StdEncoding.EncodeToString(crypted), "iv": iv, }, nil } func (c Crypto) pKCS7Padding(ciphertext []byte, blockSize int) []byte { // 判断缺少几位长度,最少为 1,最多为 blockSize padding := blockSize - len(ciphertext)%blockSize // 补足位数,把切片 []byte{byte(padding)} 复制 padding 个 padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(ciphertext, padtext...) }