最近在研究一个网站发现网站使用了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", '解密内容')