程序使用了AES加密解密,如果加密后的字符串和密钥都不变的情况下,可以正常解密不会出错。
但是由于加密后的字符串是给前端的,很难保证前端不会被修改此加密的字符串。一但修改了
后台在解密的时候直接恐慌了,程序停止运行,这就有点尴尬了。
这应该怎么解决呢,如解密不成功返回个错误或是有什么函数可以判断字符串是不是AES加密的?
```
/**
* @描述: 加密
* @参数:orig:需要加密的字符串
* @参数:key:密钥
* @返回值:返回加密后的字符串值
**/
func GF_AesEncrypt(orig string, key string) string {
// 转成字节数组
origData := []byte(orig)
k := []byte(key)
// 分组秘钥
block, _ := aes.NewCipher(k)
// 获取秘钥块的长度
blockSize := block.BlockSize()
// 补全码
origData = pKCS7Padding(origData, blockSize)
// 加密模式
blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])
// 创建数组
cryted := make([]byte, len(origData))
// 加密
blockMode.CryptBlocks(cryted, origData)
return base64.StdEncoding.EncodeToString(cryted)
}
/**
* @描述: 解密(如果密钥或密文改变了,则解密结果会恐慌)
* @参数:cryted:需要解密的字符串
* @参数:key:密钥
* @返回值:返回解密后的字符串值
**/
func GF_AesDecrypt(cryted string, key string) string {
// 转成字节数组
crytedByte, _ := base64.StdEncoding.DecodeString(cryted)
k := []byte(key)
// 分组秘钥
block, _ := aes.NewCipher(k)
// 获取秘钥块的长度
blockSize := block.BlockSize()
// 加密模式
blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])
// 创建数组
orig := make([]byte, len(crytedByte))
// 解密
blockMode.CryptBlocks(orig, crytedByte)
// 去补全码
orig = pKCS7UnPadding(orig)
return string(orig)
}
// 补码
func pKCS7Padding(ciphertext []byte, blocksize int) []byte {
padding := blocksize - len(ciphertext)%blocksize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
// 去码
func pKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
```
更多评论
为什么你 用 _ 忽略了这么多err
正常情况下,哪怕密钥错了,Aes的解码也不会直接报错吧?
报错说明是数据格式错误,所有有错误直接按借口返回约定好的失败内容不就好了……
#1