AES 加解密教程

ECB 模式加密的图片还看得出原图轮廓,这不是传说。讲清块与模式的区别、CBC 与 GCM 的取舍、密钥不能硬编码,以及解密失败先查哪三样。

加密过的图片,还看得出是企鹅

用 ECB 模式加密一张纯色背景的位图,加密后打开,色块轮廓原样保留,连形状都认得出来。有人以为是工具出了 bug,其实是 ECB 的必然结果:同样的明文块算出同样的密文块,图案被整块搬了过去。

块、密钥、模式,三个词先分清

AES 每次处理固定 16 字节一块,密钥有 128、192、256 位三档,模式决定块与块之间怎么串。128 位密钥到今天依然够用,256 位更保守、稍微慢一点。1000×1000 的图约 300 万字节,切成 187500 个块——块数一多,ECB 的重复特征就藏不住了。

ECB 的翻车现场,和它的替代

  • ECB:相同明文块出相同密文块,图案泄露,别用
  • CBC:上一块密文混进下一块,图案打散,但不带完整性校验,密文被改未必发现
  • GCM:带认证标签,密文被动过就报错,新项目首选

密钥别写死在代码里

硬编码的密钥等于把钥匙贴在门上:代码一开源、镜像一公开,密钥跟着走。放环境变量或密钥管理服务,别提交进仓库。这一点我见过真翻车的项目,改起来要重新加密历史数据,代价很大。

解密失败先查这三样

  • 模式对不上:加密用 CBC 解密选了 ECB,必然出乱码
  • IV 丢了或每次不同:CBC 的 IV 必须随密文一起保存
  • 填充或认证标签不匹配:GCM 报错通常是密文被截断或密钥不对

常见问题

128 位密钥是不是不够
够用。真正的风险常在密钥管理和实现细节上,不在 128 与 256 的差距。
能在浏览器里加密吗
可以,Web Crypto API 支持 AES-GCM,密钥别放前端代码里。
加密后体积会变大吗
分块加密本身不膨胀,Base64 输出约涨三分之一,GCM 还要加 16 字节标签。
同一明文两次加密结果不同正常吗
正常,IV 随机导致。去掉 IV 就解不回来。

相关阅读

非对称那一路看 RSA 加密;消息签名看 HMAC;文件完整性校验看 SHA-256 校验和。工具在 AES 加解密。

去使用 AES 加解密工具