AES-256 在线加密解密

支持 AES-256-GCM / CBC 模式,口令派生或十六进制密钥,Base64 / Hex 输出;所有计算在浏览器本地完成,明文与密钥不会发送到服务器。

密钥方式
密钥仅保存在当前浏览器,下次打开自动填入;清空输入框即可删除缓存。
加密模式
密文格式
使用方式:
  • 加密:左侧输入明文,选择密钥方式并填写密钥,点击「AES 加密」;
  • 解密:右侧粘贴密文,密钥方式、密钥与加密模式需和加密时保持一致,点击「AES 解密」;
  • 密文已包含随机盐(口令模式)与 IV,无需另行保存;每次加密结果不同属正常现象。

什么是 AES-256

AES(Advanced Encryption Standard)是目前应用最广泛的对称加密算法,分组长度固定 128 位,密钥长度可选 128/192/256 位,AES-256 即使用 256 位(32 字节)密钥,加解密使用同一把密钥。

本工具支持两种工作模式:GCM 在加密的同时生成认证标签,能发现密文被篡改,是目前的推荐选择;CBC 只提供机密性,主要用于兼容历史系统。ECB 模式因相同明文块会产生相同密文块,不安全,本工具不提供。

密文格式说明

为了让密文可以独立解密,加密结果按如下顺序拼接后再整体编码为 Base64 或 Hex:

  • 口令模式:盐(16字节) + IV + 密文,盐用于 PBKDF2-SHA256(10 万次迭代)派生 256 位密钥;
  • 十六进制密钥模式:IV + 密文;
  • IV 长度:GCM 为 12 字节,CBC 为 16 字节;GCM 密文末尾另有 16 字节认证标签。

与其他系统对接时按上述顺序拆解即可;解密方需要知道密钥方式、模式和编码格式。

Go 对接示例(GCM)

key, _ := hex.DecodeString("64位十六进制密钥")
block, _ := aes.NewCipher(key)
gcm, _ := cipher.NewGCM(block)
nonce := make([]byte, gcm.NonceSize()) // 12 字节
rand.Read(nonce)
// 输出格式与本工具一致:IV + 密文
out := gcm.Seal(nonce, nonce, plaintext, nil)

相关工具:Hex 编解码、Base64 编解码

常见问题

为什么每次加密结果都不一样?
加密时会生成随机 IV(口令模式还有随机盐),同一明文同一密钥每次密文都不同,这正是安全性的来源之一,不影响解密。
GCM 和 CBC 怎么选?
新项目选 GCM:它自带完整性认证,密文被篡改会解密失败。只有对接只支持 CBC 的老系统时才选 CBC。
加密后长度会变多少?
密文总是比明文长。AES 按固定 128 位(16 字节)分组处理数据:CBC 模式必须把明文用 PKCS#7 方式填充到 16 字节的整数倍(不足一字节也补一整块,所以最多多 16 字节);GCM 是流式模式,密文与明文等长,不填充。在密文之外还要附带固定开销:IV(GCM 12 字节、CBC 16 字节)、口令模式额外 16 字节盐、GCM 额外 16 字节认证标签。最后编码为 Base64 会再放大约 4/3 倍(Hex 约 2 倍)。例如口令模式 + GCM + Base64 加密 10 个字符的中文(UTF-8 为 30 字节):30 明文字节 + 16 盐 + 12 IV + 30 密文字节 + 16 标签 = 104 字节,Base64 编码后为 140 字符。
AES 能分块并行加解密吗?
取决于工作模式。AES 本身是逐个 16 字节分组加密的基本块,能否并行由外层分组模式决定:GCM 内部基于 CTR 模式,每个分组的计数器(IV + 分组序号)互相独立、共同依赖同一个密钥和 IV,因此加密解密都可以对任意一个分组独立计算,完全可并行(CUDA/GPU 加速 AES 就是利用这一点);CBC 的加密因为每个分组的输入依赖上一个分组的密文输出,只能串行,而解密时先独立解密所有分组再做 XOR,是可以并行的。若要对超大文件跨机器分布式加密,则建议自行切分成块,为每块独立生成 IV 后分别加密再拼接。
解密提示失败怎么办?
依次检查:密钥方式与密钥是否和加密时完全一致、加密模式(GCM/CBC)是否一致、密文格式(Base64/Hex)是否选对、密文是否完整没有缺字符。
我的密钥和明文会被上传吗?
不会。本页使用浏览器内置的 Web Crypto API 在本地完成全部计算,没有任何数据发送到服务器。

Feedback