![](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 加密的案例文章,很多朋友問我加密解決了有什麼用?數組
最大的用途固然就是不用模擬請求,大大提升了爬取效率。dom
可能以前舉例都是使用的 AES 加密的密碼,因此很多朋友只關注了加密沒注意實現後的用途,因此此次再寫一個其餘的 AES 加密做爲示例。ide
這個例子來自 JS 逆向課程的預售羣,偶然看到有羣友提問,這裏簡單分析一下。編碼
抓包能夠看到這裏 data 部分是加密的。【圖1-1】加密
圖1-1code
直接搜索 data 這個加密參數能夠看到有不少的相關項【圖1-2】
blog
圖1-2ip
那麼如何快速定位這個加密內容解密的地方呢?utf-8
咱們把請求返回的內容先美化一下,看看有沒有什麼點能夠追蹤一下。ci
能夠看到在返回內容裏和加密相關的字段有一個 isEncrypt 經過參數的名字咱們能夠猜想這個字段是用來標識內容是否加密。【圖1-3】
咱們檢索這個字段看看有什麼樣的結果。【圖1-4】
圖1-4
能夠看到只有兩個相關的內容,咱們在第一個找到了解密相關的內容。【圖1-5】
圖1-5
接下來就能夠參考我前面的文章套路直接把關鍵的解密代碼套進去就能夠解密了。
能夠直接套用 JS 的解密代碼,也能夠參考咱們文章舉例的 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