AES 解密工具 — 兼容 OpenSSL 与 CryptoJS
在线解密 AES —— 支持 GCM/CBC/CTR、口令或原始密钥,自动识别 OpenSSL 与 CryptoJS 的 "U2FsdGVkX1" 格式。100% 浏览器本地运行,密钥永不离开页面。
高级选项
绝不要对同一密钥重复使用 IV。留空则会生成一个安全的随机 IV。
AES 解密的工作原理
AES 解密是加密的精确逆过程:加密时用来打乱数据的同一个对称密钥,会以相反的顺序执行密码的各轮运算,从而还原出原始字节。由于 AES 是对称的,并不存在单独的「解密密钥」—— 你必须提供与加密时完全相同的密钥或口令、模式和 IV。参数都对,明文就会逐字节原样还原;只要错一个,得到的就是错误或乱码。
要正确解密,有四样东西必须与加密时完全一致:密钥(或口令及其密钥派生设置)、工作模式(GCM、CBC 或 CTR)、IV 或 nonce,以及 —— 对 GCM 而言 —— 认证标签。少了任何一个,结果要么是明确的错误(GCM 认证失败、CBC 填充失败),要么是无声的乱码(CTR,或 IV 错误的 CBC)。当盐、IV 和标签都打包在密文中时,本工具会替你读取它们;当某处对不上时,它也会诊断出失败原因。
密文会以几种不同的形态出现,本工具能识别其中三种。格式 1 是我们的自包含口令布局:16 字节的盐,然后是 IV,然后是密文(GCM 模式下末尾还附有 GCM 标签)—— 只需口令即可解密。格式 2 是原始密钥布局:IV 拼接在密文前面,或者是「裸」密文,需要你单独提供 IV。格式 3 是 OpenSSL 布局,由 openssl enc 命令和 CryptoJS 生成。
这种 OpenSSL 格式值得一眼认出。它以 8 个 ASCII 字节 Salted__ 开头,接着是 8 字节的盐,再然后是密文,当整体被 Base64 编码后,开头的字节总是呈现为前缀 U2FsdGVkX1。因此,如果你拿到的密文以 U2FsdGVkX1 开头,它几乎肯定是由 openssl enc 或 CryptoJS 的 AES.encrypt(text, passphrase) 调用生成的。CryptoJS 用传统的 EVP_BytesToKey 函数、通过单次 MD5 派生密钥,而现代 openssl 使用 PBKDF2 —— 这也是为什么解密这些密文时,选对密钥派生函数是重中之重。如果你的输入是 Base64 而你只是想看看原始字节,我们的Base64 解码器可以显示它们。要生成这些格式的密文,请使用AES 加密工具。
// AES-256-GCM decrypt with a passphrase (PBKDF2-HMAC-SHA256, 600,000 iterations).
// Identical code runs in the browser and in Node.js 20+ via Web Crypto.
async function aesGcmDecrypt(base64, passphrase) {
const enc = new TextEncoder();
const packed = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
const salt = packed.slice(0, 16), iv = packed.slice(16, 28); // salt(16) | iv(12)
const ct = packed.slice(28); // ciphertext + tag
const baseKey = await crypto.subtle.importKey(
'raw', enc.encode(passphrase), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 600000, hash: 'SHA-256' },
baseKey, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
const plain = await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv }, key, ct); // throws if the tag fails
return new TextDecoder().decode(plain); // recovered plaintext
} 核心特性
自动识别 OpenSSL 与 CryptoJS 输出
粘贴以 U2FsdGVkX1 开头的密文,工具会识别出 Salted__ 格式,并提供一键切换到匹配解密流程的选项,让你不再被死胡同般的错误困扰。
三种密钥派生函数
可解密 openssl enc 格式的各个世代:带自定义迭代次数的 PBKDF2、使用 SHA-256 的 EVP_BytesToKey,或 CryptoJS 使用的传统单次 MD5。
解释解密失败的原因
你得到的不是笼统的错误,而是具体诊断:密钥错误还是 IV 错误、GCM 认证失败、CBC 填充错误、Base64 污染,或者「这看起来是 MD5 时代的密文,请尝试 EVP-MD5」。
实时显示等效的 openssl 命令
查看在命令行中复现这次解密的确切 openssl enc -d 命令,包括迭代次数在内,方便你在浏览器之外验证结果。
口令或原始密钥,GCM/CBC/CTR 全支持
支持自包含的口令密文、带前缀或单独提供 IV 的原始密钥密文,以及全部三种 Web Crypto 模式。
100% 在你的浏览器中运行
密文和密钥都通过 Web Crypto API 在本地处理,永不上传 —— 你可以通过「网络」面板或断网来验证这一点。
AES 解密示例
解密自包含的口令密文(GCM)
盐(16) ‖ iv(12) ‖ 密文 ‖ 标签(16),Base64 —— 来自加密页面
The quick brown fox jumps over the lazy dog.
这是加密页面 GCM 示例的逆过程。把它为口令 hunter2 生成的自包含 Base64 字符串取来,粘贴到这里,模式选 GCM、密钥长度选 256、密钥类型选「口令」,口令同样是 hunter2,原始那句话就会还原出来。你不需要单独输入盐或 IV —— 工具会从字符串开头读取 16 字节的盐和 12 字节的 IV,用 PBKDF2-HMAC-SHA256(600,000 次迭代)派生密钥,并在返回任何文本之前验证末尾附加的 128 位 GCM 标签。在加密页面点击「加载示例」即可生成一个新的字符串,然后回到这里解密它。
解密真实的 OpenSSL / PBKDF2 输出
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=
Attack at dawn!
这是真实的 openssl enc 输出。把它粘贴进去,切换到 OpenSSL 模式(模式选 CBC,密钥类型选「口令」),输入口令 correct-horse,选择 PBKDF2 密钥派生函数,并将迭代次数设为 10,000 —— 明文就是 Attack at dawn!。U2FsdGVkX1 前缀告诉工具这是 Salted__ 格式,而 8 字节的盐就紧跟在 Base64 内该头部之后。你可以在命令行精确复现这次解密:echo 'U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=' | openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:correct-horse -base64 -A。如果类似的密文用 PBKDF2 解密失败,它很可能是 CryptoJS 生成的 —— 把 KDF 切换到 EVP-MD5 再试一次。点击「加载 OpenSSL 示例」即可自动填入这些值。
如何解密 AES 密文
- 1
粘贴密文
把你的 Base64 或 Hex 密文放进输入框。如果它以 U2FsdGVkX1 开头,工具会将其标记为 OpenSSL/CryptoJS 格式,并提供切换到正确模式的选项。
- 2
设置格式和模式
对于本工具生成的自包含字符串,保持「口令」模式和匹配的 GCM/CBC/CTR。对于 OpenSSL/CryptoJS 输出,接受切换建议(CBC + 口令)。对于原始密钥数据,选择「原始密钥」和对应编码,如果 IV 没有拼接在密文前面,需另行提供。
- 3
选择密钥派生函数
在 OpenSSL 模式下,选择 PBKDF2(及其迭代次数)、EVP-SHA256 或 EVP-MD5,以匹配密钥当时的派生方式。EVP-MD5 是 CryptoJS 使用的那种。
- 4
输入口令或密钥
输入确切的口令,或以十六进制或 Base64 粘贴确切的原始密钥。一旦所有设置都匹配,明文就会出现在右侧。
- 5
如果失败,请阅读诊断信息
如果解密出错,面板会指出可能的原因 —— IV 错误、密钥错误、填充错误、Base64 污染,或 KDF 不匹配 —— 这样你就可以逐项调整设置,而不必凭猜测。
AES 解密失败的原因及修复方法
GCM 认证失败
如果标签验证不通过,GCM 会拒绝返回明文。原因可能是口令或密钥错误、模式错误、IV 错误,或密文被改动/截断 —— GCM 无法告诉你具体是哪一种。请逐一对照数据加密时的设置重新检查。
mode: CBC // but the data was encrypted with GCM => Authentication failed
mode: GCM, same passphrase and key size as encryption => plaintext
CBC:第一个分组乱码意味着 IV 错误
在 CBC 中,IV 只影响第一个 16 字节的分组。如果第一个分组是乱码,其余部分能正常解码,说明你的 IV 错了;如果全部都是乱码,说明密钥错了。
iv: 00000000000000000000000000000000 (wrong IV) => first block corrupt, rest readable
iv: (the exact IV used to encrypt) => Attack at dawn!
CBC / PKCS#7 填充错误
填充错误几乎总是意味着密钥错误;也可能是密文已损坏、被截断,或本来就没有做 PKCS#7 填充。请确认完整地复制了密文,并且口令和 KDF 都匹配。
passphrase: hunter3 // one character off => padding error
passphrase: hunter2 // exact => plaintext
Base64(或 hex)污染
随密文一起粘贴进来的换行、空格或弯引号会破坏解码。工具会自动去除空白字符,但缺失或多余的字符依然会导致失败。
“U2FsdGVkX1...” (curly quotes and trailing junk copied in)
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ= (clean Base64)
检测到 U2FsdGVkX1 但 OpenSSL 模式未开启
如果输入以 U2FsdGVkX1 开头,你面对的就是 OpenSSL/CryptoJS 的 Salted__ 输出,它无法当作普通的口令字符串解密。工具会显示一个提示条;点击「切换到 OpenSSL 模式」并选择 KDF。
OpenSSL compatible: off input: U2FsdGVkX1... => cannot parse
OpenSSL compatible: on, KDF chosen => plaintext
KDF 不匹配(CryptoJS 陷阱)
如果一段密文用 PBKDF2 或 SHA-256 解密失败,却能用 EVP-MD5 解密成功,说明它是由 CryptoJS 或 OpenSSL 1.0.2 及更早版本生成的。在命令行中,这些密文需要加上 -md md5。
KDF: PBKDF2 // CryptoJS ciphertext => padding error
KDF: EVP-MD5 // matches CryptoJS => plaintext
AES 解密能做什么
- 解密 openssl enc 输出
- 无需打开终端即可读取由 openssl enc -aes-256-cbc 生成的 Salted__ 数据块:粘贴 Base64、输入口令、选择 KDF,即可得到明文。
- 解密 CryptoJS 密文
- 从使用 CryptoJS AES.encrypt(text, passphrase) 的旧应用中恢复数据。选择 EVP-MD5 以匹配它的单次 MD5 密钥派生 —— 这是大多数人会漏掉的一步。
- 调试一直失败的解密
- 当你自己的代码无法解密某段内容时,把它粘贴到这里,借助诊断面板确定问题出在密钥、IV、模式、编码还是 KDF 上。
- 验证加密的往返正确性
- 确认来自 AES 加密页面或你自己应用的密文,能准确解密回原始字节。
- 理解一段未知的密文
- 根据密文的形态识别其格式 —— U2FsdGVkX1 前缀,或看起来像 IV 的定长前缀 —— 在尝试密钥之前先弄清楚它是如何生成的。
AES 解密的内部机制与格式
- GCM 解密 —— 带认证
- GCM 会对密文重新计算 128 位标签并进行比对,然后才会返回任何明文;不匹配时会抛出错误,而不是泄露损坏的数据。它使用拼接在前面的 96 位 IV。GCM 失败意味着密钥、模式、IV 或密文有误 —— 密码算法无法告诉你具体是哪一个,只能说明认证失败了。
- CBC 解密 —— 留意第一个分组和填充
- CBC 有两种明显不同的失败特征。如果只有第一个 16 字节的分组是乱码,其余部分看起来正常,说明 IV 错了。如果每个分组都是乱码,说明密钥错了。PKCS#7 填充错误通常意味着密钥错误,或密文已损坏或被截断。CBC 没有标签(不像 HMAC 这样的认证构造),因此密钥错误时甚至可能解密出看起来合理的字节。
- CTR 解密 —— 出错时悄无声息
- CTR 永远不会抛出错误:密钥错误只会产生乱码,通常会在把字节解码为文本时表现为「不是有效的 UTF-8」错误。请确保计数器/IV 完全匹配。由于没有完整性校验,对任何未单独认证的 CTR 输出都应保持怀疑。
- 密文布局(F1 / F2 / F3)
- 格式 1(口令)是 盐(16) 然后 IV 然后密文,GCM 模式下末尾还附有 16 字节的 GCM 标签。格式 2(原始密钥)是 IV 然后密文,或者是需要单独提供 IV 的裸密文。格式 3(OpenSSL)是 ASCII 头部 Salted__,然后是 8 字节的盐,再然后是密文。知道自己拿到的是哪种布局,就能告诉工具盐和 IV 在哪里;而原始密钥本身应该来自 CSPRNG —— 参见密钥生成器。
- 密钥派生:匹配加密数据时使用的方式
- 对于自包含的口令密文,本工具使用 PBKDF2-HMAC-SHA256,迭代 600,000 次。对于 OpenSSL/CryptoJS 密文,你必须选择当时使用的 KDF:PBKDF2(openssl -pbkdf2 的默认迭代次数是 10,000 —— 请设置精确的次数)、使用 SHA-256 的 EVP_BytesToKey(没有 -pbkdf2 的 OpenSSL 1.1+),或使用 MD5 且只迭代一次的 EVP_BytesToKey(CryptoJS 和 OpenSSL 1.0.2 及更早版本)。经典的「解密不了」问题就是用 SHA-256 去尝试 CryptoJS 或旧版 openssl 的密文 —— 切换到 EVP-MD5 就能解决。
AES 解密最佳实践
- 先识别密文的格式
- 在调整任何设置之前,先看一眼密文。U2FsdGVkX1 前缀意味着 OpenSSL/CryptoJS;本工具生成的自包含字符串是口令格式;裸数据块通常需要原始密钥和单独提供的 IV。
- 精确匹配密钥派生函数
- 对 OpenSSL/CryptoJS 密文来说,KDF 和口令同样重要。如果 PBKDF2 失败,请尝试 EVP-MD5(CryptoJS、旧版 openssl);不仅算法要匹配,迭代次数也必须一致。
- 干净地粘贴密文
- 复制时带入的多余换行或空格会破坏 Base64。本工具会自动去除空白字符,但如果解码仍然失败,请检查是否混入了弯引号、缺失字符,或复制不完整。我们的 Base64 工具可以帮你检查一段可疑的字符串。
- 诚实对待密钥错误的结果
- 使用 CTR 或 CBC 时,密钥错误可能会产生字节而不是报错。如果输出看起来像乱码,或未通过 UTF-8 检查,说明密钥或 IV 错了 —— 不要相信看起来「部分正确」的输出。
- 绝不要把机密密文或密钥发送到服务器
- 在浏览器中解密的意义就在于没有任何东西会离开页面。请避开会上传数据的工具;本工具在本地使用 Web Crypto,你可以通过「网络」面板或断网来验证这一点。AES-256 是强健的 —— 已获 CNSA 2.0 批准用于「绝密」级别 —— 所以如果解密不了,问题出在参数上,而不是密码算法本身。
AES 解密常见问题
没有密钥能解密 AES 吗?
我该如何解密 openssl enc 的输出?
密文开头的 U2FsdGVkX1 是什么意思?
我该如何解密 CryptoJS 密文?
GCM 与 CBC —— 为什么我的密文这样解密可以、那样却不行?
在这里解密时,我的密文或密钥会被上传吗?
解密时口令和原始密钥有什么区别?
相关工具
查看所有工具 →AES 加密工具 — GCM、CBC 与 CTR 模式
安全工具
免费在线 AES 加密工具 — 支持 AES-128/192/256、GCM/CBC/CTR 模式,可用口令(PBKDF2)或原始密钥。100% 浏览器本地运行,不上传任何数据。
Bcrypt 哈希生成器与验证器
安全工具
在线生成并验证 bcrypt 密码哈希——可调成本因子,支持 $2b$/$2a$/$2y$ 前缀。100% 在浏览器中运行,密码绝不上传。
HMAC 生成器与签名校验工具
安全工具
免费在线 HMAC 生成与校验工具。支持文本、Hex 或 Base64 密钥计算 HMAC-SHA256/SHA1/SHA384/SHA512,输出 Hex/Base64/Base64URL。100% 在浏览器中运行 —— 密钥永不离开页面。
JWT 解码器 · 在线解码工具
安全工具
免费 JWT 解码器,在线即时解码 JWT 令牌。查看头部、载荷、签名以及过期时间、算法和声明详情。100% 浏览器本地运行——令牌绝不离开你的设备。无需注册、无跟踪。
JWT 编码器与生成器
安全工具
免费在线 JWT 生成器与编码器。构建头部和载荷,使用 HS256、RS256 或 ES256 即时签名。100% 浏览器本地运行——你的密钥和私钥绝不离开设备。
免费 JWT 密钥生成器 — HS256/384/512
安全工具
为 HS256/384/512 生成强壮、符合 RFC 规范的 JWT 密钥——100% 在浏览器中运行,绝不发往服务器。支持 base64url、base64 或 hex,可复制到 .env。