python - execjs使用crypto-js

发布时间 2023-06-09 12:42:04作者: wstong

最近在研究一个网站发现网站使用了des加密,觉得使用python调用js可读性比较高,所以使用了以下方法来实现该网站的内容解密

1. 安装PyExecJS

pip3 install PyExecJs

2. 安装node.js

https://nodejs.org/en/download

3. node安装jsdom,crypto-js

可以到py文件目录在运行npm,方便调用

npm install jsdom
npm install crypto-js

4. 自定义js

var CryptoJS = require('crypto-js')

function decrypt(word) {
    var key = CryptoJS.enc.Utf8.parse("密钥")
    var iv = CryptoJS.enc.Utf8.parse("偏移量")
    var decrypt = CryptoJS.DES.decrypt(
    {
        ciphertext: CryptoJS.enc.Hex.parse(word)
    }, 
    key,
    {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
    var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr;
}

5. 异常

在调用编写的js函数出现了异常 'NoneType' object has no attribute 'replace,解决办法,在import execjs前先加入以下代码,例如:

import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')

import execjs

6. 最终代码

import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
import os
import execjs

os.environ["EXECJS_RUNTIME"] = "Node"
with open(r"des.js", 'r', encoding='utf-8') as f:
    context = execjs.compile(f.read(),cwd=r'./node_modules')

res = context.call("decrypt", '解密内容')