Go中AES加密需手动处理填充、IV和密钥长度CBC需PKCS#7填充与16字节随机IVGCM更安全内置认证且无需填充但须确保密钥长度合规、nonce不重复并严格校验错误。AES 加密在 Go 里不是调个 Encrypt() 就完事的——它默认不带填充、不处理 IV 生成、不校验密钥长度直接套用标准库容易解密失败或被攻击。为什么 crypto/aes crypto/cipher 组合老是 panic 或解密乱码Go 标准库的 aes.NewCipher 只负责构建分组密码实例不处理模式如 CBC、GCM、不自动补位PKCS#7、也不管理 IV。常见错误包括aes.NewCipher 传入 16 字节密钥却用 AES-256要求 32 字节直接 paniccrypto/aes: invalid key size 16CBC 模式下没给 IV 或 IV 长度不对必须 16 字节cipher.NewCBCEncrypter 会 panic明文长度不是 16 的倍数又没手动 PKCS#7 填充加密后解密时末尾字节错乱把 IV 当作固定值硬编码导致相同明文每次加密结果一样丧失语义安全用 crypto/cipher.BlockMode 做 CBC 加密必须自己填 PKCS#7CBC 是最常被问到的“兼容其他语言”的模式但 Go 不提供开箱即用的填充逻辑。你得手动补位再加密填充规则计算 pad : 16 - len(plaintext)%16然后追加 pad 个字节每个值为 byte(pad)解密后必须验证末尾字节是否合法再截掉——不能只截最后 pad 字节防止填充 oracle 攻击IV 必须随密文一起传输通常前置且每次加密随机生成别复用示例关键片段立即学习“go语言免费学习笔记深入” 知网AI智能写作 知网AI智能写作写文档、写报告如此简单