200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 生意参谋爬虫难点一 ——十六进制数据解密

生意参谋爬虫难点一 ——十六进制数据解密

时间:2020-11-20 16:02:01

相关推荐

生意参谋爬虫难点一 ——十六进制数据解密

前提

对于爬虫,首先第一步是分析网页,获知需求数据的来源。在chrome浏览器打开生意参谋,通过使用fiddler或者charle抓包工具抓包,发现很多数据都是十六进制数据,这很明显是加密过的。

思路

既然数据是加密过的,那可以通过js逆向寻找到对应js文件,再找加密的代码段。

F12打开开发者工具,选择sources,按照下图路径找到vendors.js并打开,然后点击左下角{}进行格式化。

Ctrl+F打开底下的搜索框,输入c.setPublicKey即可定位到目标信息。下图,定位到的是AES加密密码IV偏移量,说明使用了CBC模式的AES加密。再往下看,可以看到解密函数和加密函数。

通过函数可以看出加密思路:明文-->AES加密-->base64编码-->16进制编码-->16进制密文

而解密思路则是放过来:16进制密文--> 16进制编码-->base64编码-->AES加密-->明文

我们可以通过断点调试看看其解密过程:

找到解密关键代码行,在左侧对于行数点击一下,打个红点。然后在生意参谋页面操作一下,搜索或者点击,请求数据。

F8进行逐步执行,当执行到断点处,可以在控制台输出一些变量看看。

输入e,得到十六进制密文:

输入r.enc.Base64.stringify(r.enc.Hex.parase(e))

密文经过十六进制编码和base64编码,变成base64编码密文:

把这段密文复制,打开网址:/cryptaes

设置对应参数,即可解密获得明文。

也可以把十六进制的密文放进去解密,只需把base64换成hex就可以了

至此,解密思路已经清晰了。

python代码实现

1.使用某大佬提供的api ,可以不用了解解密原理,直接调用api,缺点是存在一定的网络延迟。

解密网站::8181/Sycm/Tools.html

API::8181/ajaxApi.ashx/@/dontlogin/sycm/decryptor

使用方法:

import requestsencrypt_data = {"data":"十六进制编码"} #密文url=':8181/ajaxApi.ashx/@/dontlogin/sycm/decryptor' #解密apiplaintext = requests.post(url=url,data=encrypt_data).json() #post 方法print(plaintext)

2.使用python标准密码库进行解密

标准密码库:Crypto

ACSII编码库:binascii/ base64编码库:base64

AES就在Crypto.Cipher 库中,加密后输出的是acsii码,其解密输入的也是acsii码,故需要用到acsii与十六进制的转换库,binascii和base64选择一个就可以了。

from Crypto.Cipher import AESfrom binascii import b2a_hex,a2b_hexfrom base64 import b16decode,b16encodeKEY = b"xxxxxxxxxxxxxxxx" # AES密码,长度必须为16的倍数IV = b"xxxxxxxxxxxxxxxx"# IV偏移量,长度必须为16的倍数# 解密aes_obj1 = AES.new(KEY, AES.MODE_CBC, IV) #CBC模式decrypt_data = b"yyyyyyyyyyyyyyyyyy" # 十六进制密文,长度必须为16的倍数acsii_data = a2b_hex(decrypt_data) # 十六进制转acsii# acsii_data = b16decode(decrypt_data) # 跟上面一样plaintext = aes_obj1.decrypt(acsii_data) # AES解密,其输出为byte类型print(plaintext)# 加密aes_obj2 = AES.new(KEY, AES.MODE_CBC, IV)encrypt_data = b"xxxxxxxxxxxxx"# 明文,长度必须为16的倍数,不足则需要补至为16的倍数encrypted_data = aes_obj2.encrypt(encrypt_data) # AES加密,输入为byte类型hex_data = b2a_hex(encrypted_data) # acsii转十六进制# hex_data = b16encode(encrypted_data)print(hex_data)

至此,结束!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。