AES 解密工具
解密 AES-128/192/256 密文:OpenSSL 的 Salted__ 数据(U2FsdGVkX1…)、CryptoJS 输出,或十六进制原始密钥与 IV,支持 CBC、GCM、CTR、CFB、OFB 和 ECB 多种模式。
输出为 Base64 编码的 OpenSSL “Salted__” 格式:8 字节随机盐后接密文。密钥和 IV 由口令和盐派生,因此同一段文本每次加密结果都不同。等效命令:
openssl enc -aes-256-cbc -d -md md5 -a -A -k '…'完全在浏览器中运行,您的数据不会被上传。
什么是 AES 解密?
在浏览器中解密 AES 密文。它能读取由 openssl enc 和 CryptoJS.AES.encrypt(text, passphrase) 生成的 OpenSSL "Salted__" 格式(以 U2FsdGVkX1 开头的 Base64 字符串),也能处理使用十六进制密钥和 IV 的原始密文,模式可以是 CBC、CFB、CTR、OFB、ECB 或带认证的 GCM。工具会校验填充,因此密钥错误时会报错,而不是返回乱码。
如何使用 AES 解密
- 选择与加密时相同的密钥来源:对于
U2FsdGVkX1…("Salted__")数据选择口令(兼容 OpenSSL),对于原始密文选择原始密钥 + IV(十六进制)。 - 输入口令(以及相同的密钥派生方式),或输入十六进制密钥和 IV。
- 设置与发送方相同的模式和填充,并粘贴密文(Base64 或 Hex)。
- 点击解密。输出保持为文本 (UTF-8),如果明文是二进制,则切换为 Hex。
示例
U2FsdGVkX19HHh9Vv809WnL0M8IWPgnpihePLw8JpDQ= (passphrase "secret", AES-256, CBC, EVP_BytesToKey MD5)
Hello, World!
密文由 openssl enc -aes-256-cbc -md md5 -a -k secret 生成。
何时使用 AES 解密
用于读取 OpenSSL 或 CryptoJS 加密的数据、调试应用为何无法解密某些内容,或检查测试向量。你需要正确的口令或密钥——工具无法找回丢失的密钥,也无法破解 AES。如果密文来自其他产品(ZIP、数据库、密码管理器),它通常有自己的容器格式,无法在这里解密。
AES 解密 的工作原理
对于口令数据,前 16 字节必须是 Salted__ 加 8 字节盐。密钥和 IV 会用口令和盐,通过 EVP_BytesToKey(MD5)或带你所设迭代次数的 PBKDF2-HMAC-SHA256 重新派生,与 openssl enc -d 的做法完全一致,然后解密其余部分。使用原始密钥时,直接使用十六进制的密钥和 IV。CBC/ECB 解密后会逐字节检查 PKCS#7 填充——不匹配几乎总是意味着密钥、IV、模式或密钥长度错误。在 GCM 中,末尾的 16 字节标签会先由 Web Crypto 验证,然后才会显示任何明文。
常见用例
- 解密
openssl enc -aes-256-cbc -a生成的U2FsdGVkX1…字符串 - 检查 Web 应用中由
CryptoJS.AES.encrypt加密的值 - 验证后端生成的 AES-GCM 密文 + 标签
- 通过尝试可能的设置,找出使用了哪种密钥长度或模式
- 在 API 或集成调试期间解密测试数据
安全提示
解密在本地进行;口令和明文绝不会离开你的设备。只有 GCM 能证明数据未被修改。
常见问题
“填充无效”或“口令错误”是什么意思?
解密后的最后一个分组没有以有效的 PKCS#7 填充结尾。请检查口令、密钥长度(128/192/256)、模式和密钥派生方式(MD5 还是 PBKDF2 及其迭代次数)。OpenSSL 1.1+ 在不带 -pbkdf2 时默认使用 -md sha256,这里不支持——请用 -md md5 或 -pbkdf2 重新加密。
它能解密 CryptoJS 的输出吗?
可以。CryptoJS.AES.encrypt(text, "passphrase").toString() 使用相同的 Salted__ 格式,配合 AES-256-CBC 和 EVP_BytesToKey/MD5,这正是这里的默认设置。
我的密文不是以 U2FsdGVkX1 开头,怎么办?
那说明它是用原始密钥加密的。请把密钥来源切换为原始密钥 + IV(十六进制),并输入程序所用的密钥和 IV。有些程序会把 IV 放在密文前面;请把它拆出来,填入 IV 输入框。
为什么解密输出看起来是随机字符?
在流模式(CTR、CFB、OFB)下没有可校验的填充,所以密钥错误会产生随机字节。工具会把它们报告为无效的 UTF-8;如果你预期是二进制数据,请把输出切换为 Hex。