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}")
相关推荐
“AI国潮设计-小江”4 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
沙蒿同学4 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
Linux_cy4 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12034 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami4 小时前
【无标题】
开发语言·python
变与不变8065 小时前
jQuery细节以及使用应用场景
前端·javascript·jquery
CodeGL5 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer6 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
SailingCoder6 小时前
【封闭结束1】端到端交付:Agent 一次请求如何走完全链路
前端·安全·ai·面试·agent·harness
2601_967980117 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总