插件窝 干货文章 Python调用JavaScript解密报错:如何解决execjs与crypto-js的兼容性问题?

Python调用JavaScript解密报错:如何解决execjs与crypto-js的兼容性问题?

JavaScript execjs Node crypto 700    来源:    2025-03-19

在使用Python调用JavaScript进行解密时,可能会遇到execjscrypto-js的兼容性问题。以下是一些常见的解决方法:

1. 确保Node.js环境正确安装

execjs依赖于Node.js环境来执行JavaScript代码。首先,确保你的系统上已经正确安装了Node.js,并且可以通过命令行访问。

node -v
npm -v

如果未安装,可以从Node.js官网下载并安装。

2. 安装crypto-js

在Node.js环境中,确保crypto-js库已经安装。可以通过以下命令安装:

npm install crypto-js

3. 使用execjs调用JavaScript代码

在Python中,使用execjs调用JavaScript代码时,确保JavaScript代码是正确的,并且crypto-js库被正确引入。

import execjs

# 加载JavaScript代码
with open('decrypt.js', 'r') as f:
    js_code = f.read()

# 创建execjs上下文
ctx = execjs.compile(js_code)

# 调用JavaScript函数
result = ctx.call('decryptFunction', 'encryptedData')
print(result)

4. 检查JavaScript代码

确保你的JavaScript代码正确引入了crypto-js库,并且解密函数能够正常工作。例如:

// decrypt.js
const CryptoJS = require("crypto-js");

function decryptFunction(encryptedData) {
    const key = CryptoJS.enc.Utf8.parse("your-secret-key");
    const decrypted = CryptoJS.AES.decrypt(encryptedData, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

5. 处理execjscrypto-js的兼容性问题

如果你仍然遇到兼容性问题,可以尝试以下方法:

  • 使用node作为execjs的运行时:默认情况下,execjs可能会使用其他JavaScript运行时(如PyV8),你可以显式指定使用node
import execjs

# 指定使用node作为运行时
execjs.get().name  # 确保返回的是'Node.js (V8)'
  • 更新execjscrypto-js:确保你使用的是最新版本的execjscrypto-js库。
pip install --upgrade PyExecJS
npm install crypto-js@latest
  • 使用subprocess直接调用Node.js:如果execjs仍然无法正常工作,可以考虑使用Python的subprocess模块直接调用Node.js执行JavaScript文件。
import subprocess

# 调用Node.js执行JavaScript文件
result = subprocess.run(['node', 'decrypt.js', 'encryptedData'], capture_output=True, text=True)
print(result.stdout)

6. 调试与日志

如果问题仍然存在,可以在JavaScript代码中添加调试日志,查看具体的错误信息。

console.log("Decrypting data:", encryptedData);

然后在Node.js环境中直接运行JavaScript文件,查看输出和错误信息。

node decrypt.js

通过这些步骤,你应该能够解决execjscrypto-js的兼容性问题,并成功在Python中调用JavaScript进行解密。