AES 加密解密工具
专业级 AES 对称加密,支持 6 种加密模式和 5 种填充方式
加密配置
什么是 AES 加密?
AES(Advanced Encryption Standard,高级加密标准)是目前全球最广泛使用的对称加密算法,被美国国家安全局(NSA)批准用于保护绝密级信息。AES 由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的 Rijndael 算法演变而来,于 2001 年由美国国家标准与技术研究院(NIST)正式发布,用于替代已经不再安全的 DES 算法。 AES 采用分组加密方式,每组固定 128 位(16 字节),支持 128、192 和 256 位三种密钥长度,分别对应 AES-128、AES-192 和 AES-256 三个安全级别。密钥越长,安全性越高,但加解密速度会略有下降。作为对称加密算法,AES 使用相同的密钥进行加密和解密,这使得它在性能上远优于非对称加密算法。 AES 的应用场景非常广泛:在网络安全领域,TLS/SSL 协议使用 AES 保护网页浏览和电子邮件传输;在存储安全领域,BitLocker、FileVault 等磁盘加密工具采用 AES 加密用户数据;在数据库安全领域,许多数据库系统支持 AES 列级加密;在物联网领域,AES 也被广泛用于设备间的安全通信。本工具支持 AES 的全部 6 种加密模式(ECB、CBC、CFB、OFB、CTR、GCM)和 5 种填充方式,满足各种加密需求。
使用方法
使用步骤
- 选择加密模式(推荐使用 GCM,可同时加密并验证完整性)
- 选择填充方案(GCM/CFB/OFB/CTR 模式无需填充)
- 选择密钥长度(256 位安全性最高,128 位性能最佳)
- 输入密钥,或点击「生成随机密钥」自动创建
- 对于需要 IV 的模式,请输入或生成初始化向量
- 在左侧面板输入明文(加密时)或密文(解密时)
- 结果会自动显示在右侧面板
- 点击「复制」复制结果,或点击「交换」互换输入与输出
加密模式
- GCM — Galois/Counter 模式,推荐使用。同时提供加密与认证功能,无需填充,支持并行处理,适合网络传输和 TLS 场景
- CBC — 密码块链接模式,经典模式。加密前将每个明文块与前一个密文块进行异或,需要填充和 IV,安全性较好但不支持并行处理
- CFB — 密码反馈模式,流密码模式。可将分组密码转换为流密码,无需填充,适合流式数据,支持实时加密
- OFB — 输出反馈模式,与 CFB 类似但错误不会传播,适合噪声信道,无需填充
- CTR — 计数器模式。使用递增计数器生成密钥流,无需填充,支持完全并行加密,性能优异
- ECB — 电子密码本模式,不推荐使用。相同明文会产生相同密文,会泄露数据规律,仅适合加密单个数据块
填充方案
- PKCS7 — PKCS#7 填充,最常用且推荐。自动填充 N 字节,填充值为 N,解密时可准确去除,无歧义
- ZeroPadding — 零填充。使用 0x00 字节填充,实现简单,但当数据本身以 0x00 结尾时可能产生歧义
- NoPadding — 无填充。要求数据长度必须是 16 字节的整数倍,适合流模式或已知长度的数据
- ISO7859 — ISO/IEC 7816-4 填充。首个填充字节为 0x80,后续填充 0x00,广泛用于智能卡和金融行业
- ANSIX923 — ANSI X.923 填充。填充字节全为 0x00,最后一个字节表示填充长度,常用于金融数据交换
使用提示
- 建议使用密码学安全随机数生成密钥,避免使用易猜测的字符串
- 每次加密都应使用不同的随机 IV,切勿重复使用
- GCM 模式推荐使用 12 字节(96 位)的 IV,以获得最佳性能与安全性
- CTR 和 GCM 模式支持并行处理,可加速大数据加密
- 密钥和 IV 支持十六进制、文本或 Base64 格式输入
- 十六进制密钥长度:128 位 = 32 字符,192 位 = 48 字符,256 位 = 64 字符
使用场景
技术原理
AES(高级加密标准)由 NIST 于 2001 年 11 月以 FIPS 197 发布,经过 1997 年启动、历时五年的公开竞赛,从 15 个候选算法中选出。获胜者 Rijndael 由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计,击败了 Twofish、Serpent、RC6 和 Mars 等入围者。AES 取代了 DES(FIPS 46,2005 年撤回),如今是全球部署最广泛的对称分组密码:它运行在 TLS 1.2/1.3、IPsec、BitLocker、FileVault、OpenSSL 默认的 `aes-256-gcm`、Linux 内核的 dm-crypt、Apple 的 CryptoKit 和 Android 的 Keystore 中。NSA 于 2003 年批准 AES-256 用于绝密级信息保护(Suite A),使 AES 成为首个获批用于美国最高密级的公开密码算法。分组大小固定为 128 位(16 字节);密钥长度为 128、192 或 256 位,分别对应 10、12 或 14 轮。 每轮(最后一轮除外)对 4x4 字节状态执行四个操作:SubBytes 对状态的每个字节查固定的 16x16 S-Box(0x63 = 01100011 位于第 6 行第 3 列,S-Box 的构造方式是 GF(2^8) 上的乘法逆元加上仿射变换以破坏代数结构);ShiftRows 将第 0 行旋转 0 字节、第 1 行旋转 1 字节、第 2 行旋转 2 字节、第 3 行旋转 3 字节;MixColumns 在 GF(2^8) 上用固定的循环 MDS 矩阵(多项式 0x03 * x 的矩阵形式)乘以每一列;AddRoundKey 将状态与轮密钥进行异或。最后一轮跳过 MixColumns。轮密钥由 Rijndael 密钥调度生成:每轮 128 位的 11/13/15 个轮密钥,通过 RotWord(左旋 1 字节)、SubWord(查 S-Box)和与 Rcon[i] = [0x01, 0x02, 0x04, ..., 0x80, 0x1b, 0x36] *2^(i-1) 在 GF(2^8) 上异或来生成。页面的 `aes-js` 库用纯 JavaScript 执行全部四个步骤,输出与 OpenSSL 的 libcrypto 完全字节兼容。 页面提供五种分组模式。ECB 独立加密每个 16 字节块:相同的明文块产生相同的密文块,会泄露数据结构(著名的 ECB 企鹅图像在加密后仍保留像素图案的轮廓)。CBC 在加密前将每个明文块与前一个密文块异或;第一个块与 IV 异或。CTR 通过加密递增计数器(nonce || counter,均为 128 位块的 64 位半部分)并将密钥流与明文异或,将 AES 变为流密码——支持随机访问和并行加密。GCM 是 CTR 加上 GHASH(基于 GF(2^128) 的通用哈希认证器),产生 16 字节认证标签追加在密文之后。GCM 是 TLS 1.3(RFC 8446)和大多数现代 API(Node `crypto.createCipheriv('aes-256-gcm', ...)`)中的默认 AEAD。CFB 和 OFB 是为了兼容性保留的较老流密码模式。 IV 重用是最常见的生产环境 bug。GCM 使用 96 位(12 字节)IV 是 NIST 推荐的配置(RFC 5288,NIST SP 800-38D §5.2.1.1):12 字节 IV 被视为计数器,GHASH 在 J0 = IV || 0x00000001 上计算。在 CTR 模式下重用同一密钥的 IV 会泄露明文异或值(C1 XOR C2 = P1 XOR P2,一次选择明文攻击即可恢复两条消息)。在 GCM 中重用 IV 更严重:攻击者可以恢复认证子密钥 H 并伪造任意消息的标签(该攻击见 Joux 2006,也是 NIST 禁止使用随机 96 位 IV 而不要求严格唯一性的原因)。页面使用 `crypto.getRandomValues(new Uint8Array(12))` 为 GCM 生成 12 字节 IV,为 CBC/CFB/OFB 生成 16 字节 IV,随机密钥按钮使用相同的 CSPRNG,确保每次加密都使用全新材料。 本工具完全在浏览器中使用 aes-js(纯 JavaScript AES 实现)完成加解密。不存在 Web Crypto / SubtleCrypto 回退路径——无论负载大小,所有运算都通过 aes-js。
- AES 是 FIPS 197(2001 年),通过 NIST 公开竞赛从 15 个候选算法中选出;Rijndael 击败了 Twofish、Serpent、RC6 和 Mars。分组大小始终为 128 位;密钥长度 128/192/256 位分别运行 10/12/14 轮。页面通过 aes-js 的 AES_128、AES_192 和 AES_256 构造函数支持全部三种。
- 四步轮函数:SubBytes(256 字节 S-Box,GF(2^8) 逆元加仿射变换)、ShiftRows(行分别移动 0/1/2/3 字节)、MixColumns(GF(2^8) 上 0x03 多项式的 MDS 矩阵乘法)、AddRoundKey(与轮密钥异或)。最后一轮跳过 MixColumns。相同算法 + 相同密钥 = 相同密文——AES 是确定性的。
- ECB 不安全,因为相同明文块产生相同密文块(著名的'ECB 企鹅'图像保留了轮廓)。CBC 是经典安全模式;CTR 增加并行性;GCM 增加认证功能,是 TLS 1.3 的默认模式(RFC 8446)。CFB 和 OFB 是为兼容性保留的流密码模式。
- PKCS#7 填充:差 1 字节 → 15 字节的 0x0f + 1 字节的 0x10;差 2 字节 → 14 字节的 0x0e + 2 字节的 0x0f,以此类推。最后一个字节的值就是填充长度,因此去填充是明确的。流模式(CTR/CFB/OFB/GCM)完全跳过填充。ZeroPadding 在数据以 0x00 结尾时存在歧义——不要使用。
- GCM 是 AEAD:密文加 16 字节认证标签,通过 GF(2^128) 上的 GHASH 使用 H = AES_K(0^128) 计算。AAD(附加认证数据)覆盖头部但不加密。96 位 IV(RFC 5288)被视为计数器;128 位 IV 经过 GHASH 派生 J0——安全性相同,速度略慢。
- IV 重用是灾难性的。CTR IV 重用泄露 P1 XOR P2(两次一密)。GCM IV 重用(Joux 2006)让攻击者恢复 H 并伪造标签。页面使用 `crypto.getRandomValues`(CSPRNG)生成 IV,会话内不会重用,并将 IV 前置在密文前,使解密端无需带外状态即可恢复。
- AES 密钥生成:本工具的「生成随机密钥」按钮使用浏览器提供的 `crypto.getRandomValues`(CSPRNG)。AES 轮函数计算通过 aes-js(纯 JavaScript 实现)完成,在相同密钥、IV、填充设置下与 OpenSSL libcrypto 字节级一致。
- 侧信道现实:纯 JS 的 AES 不是常数时间的(S-Box 数组索引会泄露时序)。Web Crypto 的 AES 在原生代码中运行且是常数时间的。对于高安全工作负载(HSM、服务端 KDF)优先使用原生路径;对于浏览器内学习工具,aes-js 足够,因为输入已经在页面内存中。迁移路径:哈希从 SHA-1 到 SHA-256,密码从 DES 到 AES,模式从 ECB 到 GCM。
示例
AES-128-CBC 加密
明文: Hello, World!
密钥: 0123456789abcdef0123456789abcdef (32 个十六进制字符 = 128 位)
IV: fedcba9876543210fedcba9876543210 (32 个十六进制字符 = 128 位)
模式: CBC / PKCS#7 / 128 位
页面会在输出面板中给出密文(Base64 和 Hex 两种形式)。
点击「复制」可以拿走结果,点击「交换」则把密文还原为明文。
PKCS#7 填充会追加 3 个字节 (0x03 0x03 0x03),让填充后的明文
刚好填满一个 AES 块。
FIPS: AES 由 FIPS 197 定义,CBC 模式由 NIST SP 800-38A 定义AES-256-GCM 认证加密
明文: sensitive data payload
密钥: 6f8a3b2c1d9e7f5a4b8c0d2e1f3a5b7c9d1e3f5a7b9c1d3e5f7a9b1c3d5e7f9a (64 个十六进制字符 = 256 位)
IV: 1a2b3c4d5e6f708192a3b4c5 (24 个十六进制字符 = 12 字节,GCM 推荐长度)
模式: GCM / NoPadding / 256 位 / AAD 为空
输出格式: IV (12B) || 密文 || 认证标签 AuthTag (16B)
FIPS: NIST SP 800-38D 定义 GCM 模式;其中 96 位 IV 会被当作计数器使用AES-128-ECB(FIPS 197 附录 B 测试向量)
密钥: 2b7e151628aed2a6abf7158809cf4f3c (128 位)
明文: 3243f6a8885a308d313198a2e0370734
密文 (Hex): 3925841d02dc09fbdc118597196a0b32
模式: ECB / 128 位
说明: ECB 对每个 16 字节块独立加密,相同的明文块永远会产生相同的密文块。
FIPS: FIPS 197 附录 B 提供了这一组标准测试向量AES 各种模式的安全性对比
ECB: 无 IV,确定性输出,会泄露数据规律 — 生产环境千万不要用
CBC: 随机 IV,只有解密能并行,需要额外配合 HMAC 才能保证完整性
CTR: 计数器作为 IV,加解密都能并行,但需要额外的 MAC
GCM: 随机 IV,可并行,自带认证标签
新系统建议直接用 AES-256-GCM:
- 256 位密钥可以抵御量子攻击(Grover 算法)
- GCM 一次操作就同时提供保密性和完整性
- TLS 1.3 强制要求使用 AES-GCM 这类 AEAD 算法
NIST: 上述模式都在 NIST SP 800-38A/D 中有详细规定常见问题
AES 是什么?支持哪些密钥长度?
AES(高级加密标准,FIPS 197)是当今 HTTPS、Wi-Fi WPA2 和磁盘加密广泛使用的对称加密算法。本页面支持 128、192 和 256 位密钥。AES-128 速度快、安全性足以应对绝大多数场景;只有需要长期抵御未来量子计算攻击时,才建议选择 AES-256。
ECB、CBC、CFB、OFB、CTR、GCM,到底该用哪种模式?
ECB 仅适合单块测试向量,其他场景都不安全(会泄露明文模式)。CBC 和 CTR 只提供机密性,需要额外的 MAC 才能保证完整性。GCM 是当下的首选——既加密又对密文做认证,HTTPS 用的就是它。除非要兼容老系统,否则一律用 GCM。
应该使用什么填充方式?
ECB 和 CBC 模式的标准填充是 PKCS#7(也叫 PKCS#5)。CTR、CFB、OFB、GCM 属于流式模式,不需要填充,本页面这些模式下会强制使用 NoPadding。如果解密时报错 "bad padding",最常见的原因是收发双方的密钥、IV 或填充方式不一致。
为什么同一段文本每次加密的结果都不一样?
除 ECB 外,其他模式都需要 IV(初始化向量),而 IV 每次加密都应当随机生成。相同明文 + 相同密钥 + 不同 IV → 密文不同。IV 不需要保密,可以直接拼接在密文前;但在 CTR 或 GCM 模式下,重复使用同一个 IV+密钥组合会带来灾难性后果,加密强度会被完全破坏。
AES 能抵抗量子计算吗?
在足够大的量子计算机上运行 Grover 算法时,AES-128 的有效安全强度会降至约 64 位,AES-256 降至 128 位。因此对于需要保密数十年的数据,AES-256 是更稳妥的选择。相比 RSA/ECC,对称加密的 AES 受量子计算冲击要小得多。
加密是在我的浏览器里完成的吗?
是的。本页面使用 aes-js(纯 JavaScript AES 实现)在浏览器本地执行加解密,明文、密钥和 IV 不会离开你的设备。可以打开浏览器的 Network 面板自行验证。
怎样才能安全地共享密钥?
千万不要把生产环境的真实密钥贴到任何网页里,包括本工具。本页面只适合学习和验证测试向量。要在真实场景下交换密钥,请使用非对称方案(RSA-OAEP、ECDH/X25519)、基于口令派生的密钥(PBKDF2/Argon2 + 盐值),或托管的 KMS 服务,绝不能 "在聊天软件里发一下密钥"。