python爬虫加解密分析及实现

第一种:

1、找到加密的接口地址,通过加密的接口地址全局搜索

2、通过打断点的方式,操作页面,跑到断点处时,即可找到加密串,如图二;

3、找到用的是哪种加密方式,如: crypto-js提供的AES加/解密方法,ECB模式 ,找到对应方式的加密语言加解密即可。

第二个案例参考:

第二种:

除了加解密外,还有一些签名是不能找现成的对标语言的,需要引用他们自己写的JS,前提需要找到他们关联的JS文件,然后拉下来。

引用方法;

复制代码
#拉下来的sign.js文件如下:
function f(t) {
    for (var e = p ? "0123456789ABCDEF" : "0123456789abcdef", n = "", a = 0; a < 4 * t.length; a++)
        n += e.charAt(t[a >> 2] >> a % 4 * 8 + 4 & 15) + e.charAt(t[a >> 2] >> a % 4 * 8 & 15);
    return n
}
function hex_hmac_md5(t, e){
    return f(u(t, e))
}
function sign(t) {
    var i = hex_hmac_md5("GTO2OINTERFACE2017#@!%88", t);
    return i
}
复制代码
#如何加载JS文件: runjs.py
import execjs
 2 import sys
 3 import os
 4 
 5 curPath = os.path.abspath(os.path.dirname(__file__))
 6 rootPath = os.path.split(curPath)[0]
 7 sys.path.append(rootPath)
 8 # 运行js文件
 9 def js_from_file():
10     with open(os.path.join(os.path.abspath(".."), "JSConfig/des3.js"), "r", encoding="UTF-8") as file:
11         result = file.read()
12         context = execjs.compile(result)
13         return context
14 
15 def js_from_file1():
16     with open(os.path.join(os.path.abspath(".."), "JSConfig/sign.js"), "r", encoding="UTF-8") as file:
17         result = file.read()
18         context = execjs.compile(result)
19         return context
20 
21 def js_from_md():
22     with open("../jsConfig/md.js", "r", encoding="UTF-8") as file:
23         result = file.read()
24         context = execjs.compile(result)
25         return context
26 
27 
28 if __name__ == '__main__':
29     md = js_from_md().call("md")
30     print(md)
复制代码
 #request.py中通过加载JS的方法去调用JS文件中的方法获取签名。

# 获取签名
    def sign(self, request, requestType):
        data = XiangRuiBao().data(request, requestType)
        sign = js_from_file1().call("sign", data) #通过加载JS的方法去调用JS文件中的方法
        return sign

 # 定义加密方法
    def encrypt(self, data):
        bytes_str = str(data).encode('utf-8')  # 将data转换为字节
        bas = base64.b64encode(bytes_str).decode('ascii')
        request1 = '{"requestPayload":"' + bas + '"}'
        encrypted = js_from_file().call("encrypt", self.key, request1)  #通过加载JS的方法去调用JS文件中的方法
        return encrypted

参考链接:

https://blog.csdn.net/zhinian1204/article/details/124112512 加密文章

https://blog.csdn.net/cuilun000/article/details/125756232 加密文章

https://blog.csdn.net/qq_45664055/article/details/123348485?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169863513816800188585983%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D\&request_id=169863513816800188585983\&biz_id=0\&utm_medium=distribute.pc_search_result.none-task-blog-2\~all\~sobaiduend\~default-2-123348485-null-null.142\^v96\^pc_search_result_base9\&utm_term=python ECB解密\&spm=1018.2226.3001.4187 AES加解密代码

复制代码
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad


class EncryptDate:
    def __init__(self, key):
        # 初始化密钥
        self.key = key
        # 初始化数据块大小
        self.length = AES.block_size
        # 初始化AES,ECB模式的实例
        self.aes = AES.new(self.key.encode("utf-8"), AES.MODE_ECB)
        # 截断函数,去除填充的字符
        self.unpad = lambda date: date[0:-ord(date[-1])]

    def fill_method(self, aes_str):
        '''pkcs7补全'''
        pad_pkcs7 = pad(aes_str.encode('utf-8'), AES.block_size, style='pkcs7')

        return pad_pkcs7

    def encrypt(self, encrData):
        # 加密函数,使用pkcs7补全
        res = self.aes.encrypt(self.fill_method(encrData))
        # 转换为base64
        msg = str(base64.b64encode(res), encoding="utf-8")

        return msg

    def decrypt(self, decrData):
        # base64解码
        res = base64.decodebytes(decrData.encode("utf-8"))
        # 解密函数
        msg = self.aes.decrypt(res).decode("utf-8")

        return self.unpad(msg)


if __name__ == '__main__':
    # key的长度需要补长(16倍数),补全方式根据情况而定,未补齐会报错
    # key字符长度决定加密结果,长度16:加密结果AES(128),长度32:结果就是AES(256)
    eg = EncryptDate("asdfghjklqwertyu")
    # 加密字符串长同样需要16倍数:需注意,不过代码中pad()方法里,帮助实现了补全(补全方式就是pkcs7)
    en = eg.encrypt("测试数据")
    de = eg.decrypt(en)
    print(f"加密结果:{en}")
    print(f"解密结果:{de}")
相关推荐
大模型铲屎官1 分钟前
【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
开发语言·人工智能·pytorch·python·深度学习·大模型·字典
yunvwugua__3 分钟前
Python训练营打卡 Day27
开发语言·python
LuckyLay4 分钟前
Vue百日学习计划Day9-15天详细计划-Gemini版
前端·vue.js·学习
Stara05111 小时前
基于多头自注意力机制(MHSA)增强的YOLOv11主干网络—面向高精度目标检测的结构创新与性能优化
人工智能·python·深度学习·神经网络·目标检测·计算机视觉·yolov11
那雨倾城2 小时前
使用 OpenCV 将图像中标记特定颜色区域
人工智能·python·opencv·计算机视觉·视觉检测
weifont4 小时前
聊一聊Electron中Chromium多进程架构
javascript·架构·electron
大得3694 小时前
electron结合vue,直接访问静态文件如何跳转访问路径
javascript·vue.js·electron
LuckyTHP5 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
mahuifa6 小时前
(7)python开发经验
python·qt·pyside6·开发经验
水银嘻嘻6 小时前
12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建
运维·前端·自动化