Go语言AES解密后含冗余字符,如何去除?
解决Go中AES-CBC解密后冗余字符问题
你的问题出在填充处理上:JavaScript(比如Node.js的crypto模块)默认使用PKCS7填充来满足AES-CBC的块大小要求,但Go标准库的CryptBlocks只负责解密数据,不会自动移除这些填充字节,所以解密后出现的冗余字符就是填充内容。
解决方案:手动移除PKCS7填充
添加一个PKCS7去填充的函数,解密后用它处理结果即可。
修改后的完整代码:
package main import ( "crypto/aes" "crypto/cipher" "encoding/hex" "errors" "fmt" ) // pkcs7Unpadding 移除PKCS7填充 func pkcs7Unpadding(data []byte) ([]byte, error) { length := len(data) if length == 0 { return nil, errors.New("加密数据为空") } // 获取填充的长度 paddingLen := int(data[length-1]) // 验证填充是否合法 if paddingLen > length || paddingLen == 0 { return nil, errors.New("无效的填充") } // 检查所有填充字节是否符合要求 for i := length - paddingLen; i < length; i++ { if data[i] != byte(paddingLen) { return nil, errors.New("填充验证失败") } } // 移除填充 return data[:length-paddingLen], nil } func main() { encKey := "c38036f65157cb6db0e8fd855aa28ada074be71917d1c8eedc2ae4d85e3c9da6" iv := "79b67e539e7fcaefa7abf167de5c06ed" cipherText := "c02eccfc514a0b7fae830586dd56e0fcebb81fc49f41fa6dedf099c3645793bef7ec7075eca30063f9c0ef395d5ee2d44e4f3490114280abb7cf86d6eb525e2ec9bd2b781388986480f8b3df95f7b10e" encKeyDecoded, err := hex.DecodeString(encKey) if err != nil { panic(err) } cipherTextDecoded, err := hex.DecodeString(cipherText) if err != nil { panic(err) } ivDecoded, err := hex.DecodeString(iv) if err != nil { panic(err) } block, err := aes.NewCipher(encKeyDecoded) if err != nil { panic(err) } mode := cipher.NewCBCDecrypter(block, ivDecoded) mode.CryptBlocks(cipherTextDecoded, cipherTextDecoded) // 移除PKCS7填充 plainText, err := pkcs7Unpadding(cipherTextDecoded) if err != nil { panic(err) } fmt.Println(string(plainText)) }
关键说明
pkcs7Unpadding函数会先验证填充的合法性(避免恶意数据或损坏数据导致错误),然后移除填充字节。- 执行后会输出干净的结果:
session={"user":{"email":"ishanjain28@gmail.com","username":"ishanjain28"}}
内容的提问来源于stack exchange,提问作者Chandrama Dessai
相关产品推荐
相关产品推荐

