Python 爬虫实战:手把手破解 AES 加密接口
在做爬虫开发时,我们经常会遇到一种情况:接口返回的数据不是常见的 JSON,而是一串看似无意义的加密字符串。
如果你尝试过解析,会发现这些数据通常是 AES 加密 的结果。
很多新手到这里就卡住了,其实破解 AES 接口并不复杂——只要搞清楚 加密模式、密钥(Key)和初始向量(IV),就能顺利还原明文。
本文将结合实例,带你一步一步完成从 抓包分析 → 找到加密逻辑 → Python 解密实现 → 整合到爬虫 的完整流程。
一、AES 加密与爬虫的“对抗”
-
AES(Advanced Encryption Standard) 是一种对称加密算法,加密与解密使用同一把密钥。
-
常见模式:
-
ECB:每个分组独立加密,不安全;
-
CBC:需要密钥(Key)+ 初始向量(IV),更安全,也是最常见的模式。
-
在实际爬虫场景中,如果接口返回的数据通过 AES 加密,我们就需要找到对应的 Key 与 IV,再用 Python 解密。
二、环境准备
推荐使用以下 Python 库:
pip install requests pycryptodome
-
requests:用于发送 HTTP 请求
-
pycryptodome:支持 AES 加解密
👉 注意:Key 长度必须为 16/24/32 字节,分别对应 AES-128/192/256。
IV 一般固定为 16 字节。
三、破解 AES 接口的一般流程
-
抓包分析
使用浏览器开发者工具、Fiddler、Charles 等工具,找到目标接口。 -
识别加密特征
如果返回数据是 Base64 编码且长度为 16 的倍数,大概率是 AES 加密结果。 -
查找加密逻辑
在前端源码里搜索CryptoJS、AES.encrypt等关键词,找到加密代码及 Key、IV 的来源。 -
Python 解密实现
使用pycryptodome还原解密逻辑,得到明文数据。
四、Python 实现 AES 解密
下面给出一个简单的 AES-CBC 解密函数:
from Crypto.Cipher import AES
import base64
def decrypt_aes(ciphertext, key, iv):
# 创建 AES 解密器
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
# Base64 解码 + AES 解密
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
# 去掉填充字符(此处假设使用 \x00 填充)
return decrypted.rstrip(b'\x00').decode('utf-8')
# 示例
cipher_text = "fYJ0ZQ0w1A5A+Q5ZVJ6jhw=="
key = "1234567890abcdef"
iv = "abcdef1234567890"
print(decrypt_aes(cipher_text, key, iv))
运行后即可得到解密结果。
五、处理动态密钥与 IV
在实战中,密钥往往不是写死的,而是 动态生成 的,这时需要进一步处理:
-
JS 逆向获取
在前端代码中找到生成密钥/IV 的逻辑,可以使用PyExecJS调用 JS。 -
请求中提取
有些系统会把 Key 或 IV 放在 请求参数 或 Cookie 中。
示例(执行前端 JS 获取密钥):
import execjs
js_code = """
function getKey(){
return "1234567890abcdef";
}
"""
ctx = execjs.***pile(js_code)
key = ctx.call("getKey")
print(key)
六、完整案例演示
以某个接口为例,破解过程如下:
-
抓包发现返回数据为 AES-CBC 加密;
-
在
app.js中找到key = "1234567890abcdef",iv = "abcdef1234567890"; -
使用 Python 解密,成功还原明文数据;
-
将解密逻辑整合到爬虫中,实现自动解密与数据采集。
七、进阶技巧与优化
-
动态密钥模拟:分析 JS 逻辑,用 Python 重写;
-
混淆代码处理:借助 Node.js 或第三方工具反混淆;
-
反爬机制应对:结合代理 IP、随机 User-Agent、请求延时。
八、注意事项与最佳实践
-
合法合规:请仅在授权范围内使用,避免违法爬取;
-
程序健壮性:加上异常捕获、重试机制,保证爬虫稳定运行;
-
性能优化:避免高频访问,保护目标网站。
九、常见问题 FAQ
Q1:解密后乱码怎么办?
👉 可能是填充方式不同,常见有 PKCS7Padding、\x00 填充。可以尝试手动去除或修改解密函数。
Q2:为什么报错“ValueError: Incorrect AES key length”?
👉 AES 密钥长度必须为 16/24/32 字节,检查是否长度错误或编码问题。
Q3:如何判断 IV?
👉 一般在前端代码或请求参数中可以找到,长度固定 16 字节。
Q4:密钥是动态的怎么办?
👉 逆向前端 JS,或使用 execjs 在 Python 里运行 JS 来获取密钥。
十、总结
破解 AES 加密接口的核心在于:
👉 抓包分析 → 识别加密 → 找到 Key/IV → Python 解密 → 整合到爬虫流程
通过以上方法,你就能高效地处理大多数 AES 加密接口。
✍️ 如果文章对你有帮助,欢迎点赞 + 收藏!
💬 有更复杂的加密案例(比如动态密钥、混淆 JS),可以留言,我会写进后续教程。