在线 AES 加解密工具:对称加密原理与实践
什么是 AES 加密
AES(Advanced Encryption Standard,高级加密标准)是目前最广泛使用的对称加密算法。2001 年被美国国家标准与技术研究院(NIST)采纳为标准,至今仍是全球政府、银行和企业系统的主流加密算法。
对称加密意味着加密和解密使用同一把密钥——拥有密钥的人可以加密和解密数据。想直接上手试试?用我们的免费 AES 加解密工具,完全在浏览器中运行 AES-GCM。
AES 的核心参数
| 参数 | 说明 | 常见值 |
|---|---|---|
| 密钥长度 | 决定安全性 | 128 / 192 / 256 位 |
| 分组大小 | 固定为 128 位 | 16 字节 |
| 加密模式 | 数据块的处理方式 | ECB / CBC / GCM / CTR |
| 填充方式 | 数据不足分组大小时的补充 | PKCS7 / Zero |
AES-GCM:推荐的加密模式
AES-GCM(Galois/Counter Mode)是目前推荐的 AES 模式,因为它提供认证加密(Authenticated Encryption):
- 保密性:加密后的数据无法被读取
- 完整性:数据被篡改会被检测到
- 认证性:验证数据来源的真实性
密文 = AES-GCM-Encrypt(密钥, 明文, IV, 认证附加数据)
明文 = AES-GCM-Decrypt(密钥, 密文, IV, 认证附加数据)
为什么不用 ECB 模式
ECB(Electronic Codebook)模式是最简单的加密方式,但存在严重安全缺陷:相同的明文块会加密成相同的密文块,保留了数据的模式信息。
ECB 模式加密的 Linux 企鹅图片(模式泄露):
[密文块A][密文块A][密文块B]
[密文块B][密文块C][密文块C]
GCM 模式加密的同一图片(模式隐藏):
[随机密文][随机密文][随机密文]
[随机密文][随机密文][随机密文]
GCM 的 nonce 重用陷阱
GCM 的安全性建立在「同一密钥 + 同一 nonce 绝不重复使用」这一前提上。一旦重用,攻击者可以伪造认证标签,后果比明文泄露更严重。实际部署中的规则:
- 随机 nonce 有生日界限:96 位随机 nonce 在加密约 40 亿条消息后碰撞概率显著上升,高吞吐系统应轮换密钥
- 确定性计数器 nonce 更安全:96 位 = 32 位设备前缀 + 64 位计数器,天然无碰撞
- 禁止跨系统共享密钥 + 各自随机 nonce:两个独立系统用同一密钥加密,随机 nonce 碰撞概率翻倍
NIST 建议同一 GCM 密钥最多加密 2^32 条消息,之后必须轮换。
PBKDF2 密钥派生
直接使用用户密码作为 AES 密钥是不安全的,因为密码通常不够随机。PBKDF2(Password-Based Key Derivation Function 2)通过以下步骤派生安全密钥:
- 密码 + 盐值(Salt):盐值是随机生成的,防止彩虹表攻击
- 多次迭代(如 100,000 次):增加暴力破解的成本
- 输出固定长度密钥:派生出 AES-256 所需的 256 位密钥
迭代次数怎么选
OWASP 2023 建议 PBKDF2-HMAC-SHA256 至少 310,000 次迭代。但迭代次数越高,派生越慢,移动端体验越差。常见取舍:
| 迭代次数 | 安全等级 | 桌面端耗时 | 移动端耗时 | 适用场景 |
|---|---|---|---|---|
| 100,000 | OWASP 基线 | ~0.1s | ~0.3s | 一般敏感数据 |
| 310,000 | OWASP 2023 推荐 | ~0.3s | ~1s | 高敏感数据 |
| 600,000 | 高安全 | ~0.6s | ~2s | 长期存储、合规要求 |
ToolVault 的 AES 工具默认使用 100,000 次(OWASP 基线),并提供三档可调:10 万 / 31 万 / 60 万。加密时迭代次数会嵌入密文头部(v2 格式),解密时自动识别,无需手动匹配。
密文格式
本工具输出 base64 编码的复合密文,有两种兼容格式:
- v1 格式(默认 10 万次迭代):
salt(16字节) | iv(12字节) | 密文+认证标签 - v2 格式(非默认迭代次数):
magic "TVA2"(4字节) | 迭代次数(4字节,大端) | salt(16) | iv(12) | 密文+标签
解密时自动识别格式,v1 密文始终可解。粘贴带换行或空格的密文也能正常解密,base64url 风格(-_ 代替 +/)同样兼容。
如何使用在线 AES 加解密工具
使用 ToolVault 工具匣 的 AES 加解密工具:
加密
- 输入明文数据
- 输入密码(Passphrase,建议 12+ 字符)
- 选择安全级别(PBKDF2 迭代次数:10 万 / 31 万 / 60 万)
- 点击 加密 按钮
- 复制生成的密文(Base64 编码)
解密
- 输入密文(Base64 编码,支持带换行/空格的粘贴)
- 输入密码
- 点击 解密 按钮(迭代次数自动从密文头识别,无需手动选择)
- 还原的明文出现在输出框
参数不匹配:AES 解密失败的头号原因
大多数「AES 解不开」的报告都是参数不匹配。加密和解密两侧必须完全一致的参数:
| 参数 | 合法值 | 不匹配症状 |
|---|---|---|
| 密钥长度 | 128/192/256 位 | 解密直接失败或输出乱码 |
| 加密模式 | GCM/CBC/CTR | 解密「成功」但明文错误 |
| IV/nonce 长度 | 12 字节(GCM 推荐) | GCM 拒绝或互操作失败 |
| 认证标签长度 | 128 位典型(GCM) | 解密时认证失败 |
| KDF + 迭代次数 | PBKDF2 + N 轮 | 派生密钥不同,静默失败 |
最危险的是静默失败——模式不匹配可能「解密」出乱码而不报错,这正是认证加密模式(GCM)的价值:篡改即报错,绝不静默。
编程语言中的 AES 加密
JavaScript / Web Crypto API
async function encrypt(data, password) {
const encoder = new TextEncoder();
const salt = crypto.getRandomValues(new Uint8Array(16));
const iv = crypto.getRandomValues(new Uint8Array(12));
// PBKDF2 派生密钥
const keyMaterial = await crypto.subtle.importKey(
'raw', encoder.encode(password),
'PBKDF2', false, ['deriveKey']
);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' },
keyMaterial,
{ name: 'AES-GCM', length: 256 },
false, ['encrypt']
);
// AES-GCM 加密
const ciphertext = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv },
key, encoder.encode(data)
);
return { ciphertext, salt, iv };
}
Python
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import os
def encrypt(plaintext: str, password: str) -> bytes:
salt = os.urandom(16)
iv = os.urandom(12)
# PBKDF2 派生密钥
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32,
salt=salt, iterations=100000)
key = kdf.derive(password.encode())
# AES-GCM 加密
aesgcm = AESGCM(key)
return aesgcm.encrypt(iv, plaintext.encode(), None)
安全实践建议
- 永远不要自己实现加密算法:使用经过审计的标准库(Web Crypto API、OpenSSL、BoringSSL)
- 每次加密使用随机 IV:即使加密相同内容,不同 IV 产生不同密文
- 密钥与密文分开存储:密钥放在密钥管理服务,密文放在数据库
- 使用认证加密:优先选择 AES-GCM 而非 AES-CBC
- 根据数据敏感度调整迭代次数:长期存储的数据用 31 万次以上
FAQ
AES-256 比 AES-128 安全多少?
从实际角度看,两者都足够安全。AES-128 的密钥空间为 2^128,暴力破解需要宇宙年龄级别的时间。AES-256 提供更大的安全余量,是政府级应用的常见选择。
在线 AES 工具安全吗?
ToolVault 工具匣 的 AES 加解密完全在浏览器端运行(Web Crypto API),密码和数据不离开设备。但请确保在安全的环境中使用,避免浏览器扩展窃取数据。
加密后数据体积会变大吗?
会略微变大。AES-GCM 输出包含密文 + 认证标签(16 字节)+ IV(12 字节)+ 盐值(16 字节)。v2 格式还会多 8 字节头部。对于小数据,开销比例较高;对于大数据,开销可忽略。
迭代次数越高越好吗?
不是。迭代次数增加暴力破解成本,但也增加合法用户的等待时间。100,000 次在桌面端几乎无感知,600,000 次在低端手机上可能需要 2 秒。选择原则是:数据敏感度越高、存储时间越长,迭代次数越高。
密文粘贴后有换行或空格怎么办?
本工具会自动剥离密文中的 ASCII 空白字符(空格、换行、制表符),也兼容 base64url 风格(-_ 代替 +/)。直接粘贴即可,无需手动清理。
排查注记
「参数不匹配」一节标成解密失败的头号原因,表里最危险的两行是模式不匹配「解密成功但明文错误」和 KDF 迭代次数不同导致的静默失败——这也是全文推荐 GCM 的落点:认证加密篡改即报错,绝不静默。工具把迭代次数嵌进密文头部(v2 格式)同样冲着这张表去:解密侧自动识别,消灭「KDF 参数靠人肉对齐」这一整类失败。迭代次数三档的取舍表把桌面端与移动端耗时并排摆出,选择原则就一句——数据敏感度越高、存储时间越长,迭代越高。
本文由 ToolVault 工具匣 提供。其他在线工具可在 首页 找到。
相关工具
相关文章
后量子迁移自查清单:从算法盘点到 hybrid TLS,2026 年该做完的 12 件事
后量子密码(PQC)迁移的实操自查框架:三张监管时刻表为什么让 2026 成为起点、算法盘点(CBOM)怎么做、按 HNDL 暴露度排优先级、X25519+ML-KEM 混合 TLS 怎么开,以及 crypto-agility 的工程落地。附 12 项可勾选 checklist。
Passkeys 完全指南:为什么服务器再也存不了你的密码副本
Passkey(WebAuthn/FIDO2)加深:注册与断言仪式、平台认证器与漫游密钥、同步通行密钥取舍、与密码/TOTP/JWT 的关系,以及 origin 绑定如何结构性抗钓鱼。服务器只存公钥;站内无独立 Passkey 工具页的说明。
ML-KEM 入门:Kyber 是怎么进到你的 TLS 握手里的
后量子密钥封装 ML-KEM(FIPS 203,前身 Kyber)的工程向解读:Kyber 到标准名的变迁、封装/解封装语义与 IND-CCA、三档参数尺寸、X25519+ML-KEM 与 TLS 1.3 HKDF 密钥调度的混合方式、ClientHello 膨胀中间盒坑、OpenSSL 3.5 / nginx 开法,以及浏览器侧实现边界。