该加密算法是 DES,key 为密钥,没有偏移量 IV,ECB 模式,Pkcs7 填充方式,Python 在这方面能够直接调用的库比较少,据我所知只有 pyDes 和 Cryptodome 可以实现,pyDes 中 key 的长度要求是 8 位,你这个明显不符合,Cryptodome 不是很熟悉,可以自己搜一下,pyDes 代码示例如下:
import binascii
from pyDes import des, ECB, PAD_PKCS5
def des_encrypt(key, t, iv):
k = des(key, ECB, iv, pad=None, padmode=PAD_PKCS5)
en = k.encrypt(t, padmode=PAD_PKCS5)
return binascii.b2a_hex(en)
def des_decrypt(key, t, iv):
k = des(key, ECB, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(t), padmode=PAD_PKCS5)
return de
if __name__ == '__main__':
secret_key = '12345678' # 密钥
text = 'I love Python!' # 加密对象
iv = None # 偏移量
secret_str = des_encrypt(secret_key, text, iv)
print('加密字符串:', secret_str)
clear_str = des_decrypt(secret_key, secret_str, iv)
print('解密字符串:', clear_str)
据我经验来看,你应该是做爬虫 JS 逆向遇到了这种算法,通常情况下我们直接调用 nodejs 里面的 crypto-js 库来实现,不同语言不同库也有可能加密解密结果有不一致的情况,直接使用 nodejs 库来实现可以避免很多问题,而且 key 之类的也没有长度限制,nodejs 实现代码如下:
// 引用 crypto-js 加密模块
CryptoJS = require("crypto-js")
var key = CryptoJS.enc.Utf8.parse("MjBxZDAxNDQ=");
var iv = CryptoJS.enc.Utf8.parse("");
function desEncrypt(word) {
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.DES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
function desDecrypt(word) {
var srcs = word;
var decrypt = CryptoJS.DES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return decrypt.toString(CryptoJS.enc.Utf8);
}
console.log(desEncrypt("测试"))