AES解密失败后要怎么处理

yz23je · 2022-02-14 12:04:44 · 1304 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-02-14 12:04:44 的主题,其中的信息可能已经有所发展或是发生改变。

程序使用了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)]
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1304 次点击  
加入收藏 微博
6 回复  |  直到 2022-02-14 15:24:36
pluszero1982
pluszero1982 · #1 · 3年之前

为什么你 用 _ 忽略了这么多err

正常情况下,哪怕密钥错了,Aes的解码也不会直接报错吧?

报错说明是数据格式错误,所有有错误直接按借口返回约定好的失败内容不就好了……

GO_go_GO1
GO_go_GO1 · #2 · 3年之前

如果忽略错误,你可以用 recover

lywoody
lywoody · #3 · 3年之前

后台在解密的时候直接恐慌了.. panic 不试一下使用recover?

yz23je
yz23je · #4 · 3年之前
pluszero1982pluszero1982 #1 回复

为什么你 用 _ 忽略了这么多err 正常情况下,哪怕密钥错了,Aes的解码也不会直接报错吧? 报错说明是数据格式错误,所有有错误直接按借口返回约定好的失败内容不就好了……

代码是网上找到,你不说我都没注意看前面有忽略错误,大意了,大意了。谢谢啊。

yz23je
yz23je · #5 · 3年之前
GO_go_GO1GO_go_GO1 #2 回复

如果忽略错误,你可以用 recover

谢谢,问题解决

yz23je
yz23je · #6 · 3年之前
lywoodylywoody #3 回复

后台在解密的时候直接恐慌了.. panic 不试一下使用recover?

谢谢,问题解决

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传