Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例

![](https://s4.51cto.com/images/blog/202101/02/a5387851f3295569eae7ea7801394242.bmp?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

一個典型的AES案例


AES 的案例以前有推薦你們關於 AES 加密的案例文章,很多朋友問我加密解決了有什麼用?數組

最大的用途固然就是不用模擬請求,大大提升了爬取效率。dom

可能以前舉例都是使用的 AES 加密的密碼,因此很多朋友只關注了加密沒注意實現後的用途,因此此次再寫一個其餘的 AES 加密做爲示例。ide

這個例子來自 JS 逆向課程的預售羣,偶然看到有羣友提問,這裏簡單分析一下。編碼

分析加密


抓包能夠看到這裏 data 部分是加密的。【圖1-1】加密

Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例

圖1-1code

直接搜索 data 這個加密參數能夠看到有不少的相關項【圖1-2】
Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例blog

圖1-2ip

那麼如何快速定位這個加密內容解密的地方呢?utf-8

咱們把請求返回的內容先美化一下,看看有沒有什麼點能夠追蹤一下。ci

能夠看到在返回內容裏和加密相關的字段有一個 isEncrypt 經過參數的名字咱們能夠猜想這個字段是用來標識內容是否加密。【圖1-3】

Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例

咱們檢索這個字段看看有什麼樣的結果。【圖1-4】

Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例
圖1-4

能夠看到只有兩個相關的內容,咱們在第一個找到了解密相關的內容。【圖1-5】

Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例

圖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】

Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例

圖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】

Python爬蟲進階必備 | 一個典型的 AES 加密在爬蟲中的應用案例

以上就是 AES 加密的另外一種在爬蟲中的運用了。

EOF

相關文章
相關標籤/搜索