专栏首页Python绿色通道Python爬虫进阶必备 | 一个典型的 AES 加密在爬虫中的应用案例

Python爬虫进阶必备 | 一个典型的 AES 加密在爬虫中的应用案例

以下文章来源于咸鱼学Python,作者煌金的咸鱼

一个典型的AES案例

AES 的案例之前有推荐大家关于 AES 加密的案例文章,不少朋友问我加密解决了有什么用?

最大的用途当然就是不用模拟请求,大大提高了爬取效率。

可能之前举例都是使用的 AES 加密的密码,所以不少朋友只关注了加密没注意实现后的用途,所以这次再写一个其他的 AES 加密作为示例。

这个例子来自 JS 逆向课程的预售群,偶然看到有群友提问,这里简单分析一下。

分析加密

抓包可以看到这里 data 部分是加密的。【图1-1】

图1-1

直接搜索 data 这个加密参数可以看到有很多的相关项【图1-2】

图1-2

那么如何快速定位这个加密内容解密的地方呢?

我们把请求返回的内容先美化一下,看看有没有什么点可以追踪一下。

可以看到在返回内容里和加密相关的字段有一个 isEncrypt 通过参数的名字我们可以猜测这个字段是用来标识内容是否加密。【图1-3】

我们检索这个字段看看有什么样的结果。【图1-4】

图1-4

可以看到只有两个相关的内容,我们在第一个找到了解密相关的内容。【图1-5】

图1-5

接下来就可以参考我前面的文章套路直接把关键的解密代码套进去就可以解密了。

可以直接套用 JS 的解密代码,也可以参考我们文章举例的 Python 代码

Python 复写加密

我们先把上次的 Python 代码 CV 过来。

import base64
from Crypto.Cipher import AES
import random


def pkcs7padding(text):
    """
    明文使用PKCS7填充
    最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
    :param text: 待加密内容(明文)
    :return:
    """
    bs = AES.block_size  # 16
    length = len(text)
    bytes_length = len(bytes(text, encoding='utf-8'))
    # tips:utf-8编码时,英文占1个byte,而中文占3个byte
    padding_size = length if(bytes_length == length) else bytes_length
    padding = bs - padding_size % bs
    # tips:chr(padding)看与其它语言的约定,有的会使用'\0'
    padding_text = chr(padding) * padding
    return text + padding_text


def pkcs7unpadding(text):
    """
    处理使用PKCS7填充过的数据
    :param text: 解密后的字符串
    :return:
    """
    length = len(text)
    unpadding = ord(text[length-1])
    return text[0:length-unpadding]


def encrypt(key, content):
    """
    AES加密
    key,iv使用同一个
    模式cbc
    填充pkcs7
    :param key: 密钥
    :param content: 加密内容
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # 处理明文
    content_padding = pkcs7padding(content)
    # 加密
    encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新编码
    result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
    return result


def decrypt(key, content):
    """
    AES解密
     key,iv使用同一个
    模式cbc
    去填充pkcs7
    :param key:
    :param content:
    :return:
    """
    key_bytes = bytes(key, encoding='utf-8')
    iv = key_bytes
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # base64解码
    encrypt_bytes = base64.b64decode(content)
    # 解密
    decrypt_bytes = cipher.decrypt(encrypt_bytes)
    # 重新编码
    result = str(decrypt_bytes, encoding='utf-8')
    # 去除填充内容
    result = pkcs7unpadding(result)
    return result


def get_key(n):
    """
    获取密钥 n 密钥长度
    :return:
    """
    c_length = int(n)
    source = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
    length = len(source) - 1
    result = ''
    for i in range(c_length):
        result += source[random.randint(0, length)]
    return result

按照代码上的注释,我们找找这里我们 key 和 iv 是怎么生成的。【图2-1】

图2-1

参考【图1-3】这个 lastFetchTime 就是请求返回的值。

所以我们按照 JS 逻辑直接把加密内容和 key 传入即可。

data = 'WPZVRdF+hMHReWs0rgM+SR+uV3TjVPhsVKOCrW+cOF8jfhT/JL/faU3tYyBVPkyJsV+P6ReJ46/Pi0...'
encrypt_en = decrypt('1572353144793000',data)
print(encrypt_en)

解密的结果如下:【图2-2】

以上就是 AES 加密的另一种在爬虫中的运用了。

EOF

本文分享自微信公众号 - Python绿色通道(Python_channel)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫进阶必备 | 关于AES 的案例分析与总结

    可以看到这里 password、email 是加密的结果,_token 的值可以直接在页面里找到。

    叫我龙总
  • Python爬虫进阶必备 | X笔网密码加密分析

    有读者朋友纠结于搜索password = or password:这样需要搜索两遍是不是浪费时间了,不如直接搜索password来的方便快捷。

    叫我龙总
  • Scrapy实战6:CSS选择器实战训练

    上一篇文章Scrapy实战5:Xpath实战训练中给大家讲解并带着大家实战训练了Xpath,爬取了伯乐在线文章的基本信息,并且介绍scrapy里的shell调试...

    叫我龙总
  • Python爬虫进阶必备 | 一个典型的 AES 加密在爬虫中的应用案例

    AES 的案例之前有推荐大家关于 AES 加密的案例文章,不少朋友问我加密解决了有什么用?

    咸鱼学Python
  • 业界 | 抓捕美国“金州杀手”的新DNA匹配技术比你想象的强大

    今年4月,警方用一种以前未使用过的DNA技术解决了几十年前的谜团 ,金州杀手的身份。

    大数据文摘
  • Nature:2014年度十大科学人物

    大数据文摘
  • 使用DiffBind进行peak 差异分析

    DiffBind是一个用于peak差异分析的R包,源代码保存在Bioconductor上,链接如下

    生信修炼手册
  • 把EmEditor改造成简单的Word

    希望能够在EmEditor中进行文章的编辑,但纯文本的样式实在看着难受,可以通过下面的改动进行一些改造: 一、自动折叠 用正则表达式定义一级和二级标题 ^[一二...

    用户1075292
  • python笔记43-加解密AES/CBC/pkcs7padding

    有些公司对接口的安全要求比较高,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回。

    上海-悠悠
  • 你真的知道如何连接mysql么

    可以在my.cnf配置文件的[client]标签下增加用户信息处理。但是,该方式默认使用的/etc/my.cnf配置文件下的信息,因此需要调整该目录下的对应标签...

    July

扫码关注云+社区

领取腾讯云代金券