本文通过一个完整、可运行的示例,演示如何在Python 中使用 execjs 调用 CryptoJS 实现 AES 解密。
适合:接口逆向、数据采集、前端加密分析等场景。
一、最终效果说明
我们要实现的效果是:
- 前端(JS)用CryptoJS AES-CBC加密 JSON
- Python 通过execjs 调用 JS 解密
- 最终在 Python 中拿到原始 JSON 数据
二、准备环境
1️⃣ 安装 Node.js
node-v如果没有:
sudoaptinstallnodejsnpm2️⃣ 安装 Python 依赖
pipinstallPyExecJS3️⃣ 安装 CryptoJS(JS 依赖)
在项目目录下执行:
npminit -ynpminstallcrypto-js三、项目目录结构
aes-demo/ ├── encrypt.js # (模拟前端)AES 加密 ├── decrypt.js # CryptoJS 解密函数 ├── decrypt.py # Python 调用 execjs └── cipher.txt # AES 密文四、模拟前端 AES 加密(encrypt.js)
这一步是为了生成真实密文,方便你测试
实际项目中,这一步通常是网站前端完成的
constCryptoJS=require("crypto-js");constkey="1234567890abcdef";// 16 字节constiv="abcdef1234567890";// 16 字节constdata={user:"admin",age:18,role:"tester"};constplaintext=JSON.stringify(data);constencrypted=CryptoJS.AES.encrypt(plaintext,CryptoJS.enc.Utf8.parse(key),{iv:CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString();console.log(encrypted);运行:
nodeencrypt.js>cipher.txt此时cipher.txt中就是 AES 密文。
五、CryptoJS 解密函数(decrypt.js)
⚠️execjs 只能调用全局函数
constCryptoJS=require("crypto-js");functiondecryptData(key,iv,ciphertext){constdecrypted=CryptoJS.AES.decrypt(ciphertext,CryptoJS.enc.Utf8.parse(key),{iv:CryptoJS.enc.Utf8.parse(iv),mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7});returndecrypted.toString(CryptoJS.enc.Utf8);}六、Python 调用 JS 解密(decrypt.py)
这是核心代码👇
importexecjsimportjsondefaes_decrypt(ciphertext):key="1234567890abcdef"iv="abcdef1234567890"withopen("decrypt.js","r",encoding="utf-8")asf:js_code=f.read()ctx=execjs.compile(js_code)plaintext=ctx.call("decryptData",key,iv,ciphertext)returnplaintextif__name__=="__main__":# 读取密文withopen("cipher.txt","r",encoding="utf-8")asf:cipher=f.read().strip()result=aes_decrypt(cipher)print("解密后的字符串:")print(result)print("\n解析为 JSON:")data=json.loads(result)print(data)七、运行结果示例
解密后的字符串: {"user":"admin","age":18,"role":"tester"} 解析为 JSON: {'user': 'admin', 'age': 18, 'role': 'tester'}✅解密成功
八、关键点总结(一定要看)
🔹 1. key / iv / mode / padding 必须一致
任何一个不一致,都会:
- 解密为空字符串
- JSON 解析失败
🔹 2. execjs 本质是「Python → Node」
所以:
- Node.js 必须可用
- crypto-js 必须能被
require
🔹 3. 解密失败先不要json.loads
先:
print(result)九、常见问题速查
❌ 解密结果为空
✔ key / iv 错
✔ AES 模式不一致
✔ padding 不一致
❌ 报错 Cannot find module ‘crypto-js’
npminstallcrypto-js❌ execjs 报 RuntimeUnavailableError
说明Node.js 没装或不可用
十、适用场景
这个方案非常适合:
- Web 接口 AES 逆向
- 前端加密参数分析
- Python 自动化解密
- 不想手写 AES 算法