目标网站:闪职——登录
模拟登录
以后碰到RSA加密的:
setPublicKey ---> RSA
encrypt decrypt --> DES/AES
在爬取的时候 不一定要知道具体的加密算法
具体步骤:

找到表单数据 ,发现password被加密
然后取源代码看看看,发现有公钥pk,所以用RSA加密算法重构(encrypto)

具体代码:
闪职.py
- import requests
- from lxml import etree
- from python重构RAS加密算法 import encrypto
-
- header = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
- 'Cookie': 'shanzhi_kmer=h9wm0ptr9kcuza527as3a43a6zuwzsid; csrftoken=yHdq0AaPEO1pyiC2zji4MmeyLRNcXVcZLNoHCT3izQ52lwvASvHv0jgsGG9kEXUN'
- }
-
- def get_data():
- # 目标url
- url = 'http://shanzhi.spbeen.com/login/'
- # 请求头
-
- res = requests.get(url,headers=header)
- data = res.text
- return data
-
-
- def deal_data(text):
- tree = etree.HTML(text)
-
- # 获取csrfmiddlewaretoken
- csrfmiddlewaretoken = tree.xpath('//input[@name="csrfmiddlewaretoken"]/@value')[0]
-
- # 取pk
- pk = tree.xpath('//input[@id = "pk"]/@value')[0]
-
- return csrfmiddlewaretoken,pk
-
- def rebuilt(pk,csrfmiddlewaretoken):
-
- # 老密码
- old_pwd = 'logic_00'
- # 加密后的密码
- new_pwd = encrypto(pk,old_pwd)
-
- # 构造表单数据
- data_dict = {
- "username":'logic_00',
- "password": new_pwd,
- "csrfmiddlewaretoken":csrfmiddlewaretoken
- }
-
-
- url = 'http://shanzhi.spbeen.com/login/'
- res = requests.post(url,data=data_dict,headers=header)
- print(res.text)
-
-
- if __name__ == '__main__':
- text = get_data()
- csrfmiddlewaretoken, pk = deal_data(text)
- rebuilt(pk,csrfmiddlewaretoken)
python重构RAS加密算法.py
- # pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
- from Crypto.PublicKey import RSA
- from Crypto.Cipher import PKCS1_v1_5 as cry_pksc1_v1_5
- import base64
-
- def encrypto(pk, password):
- """
- 使用公钥对密码进行加密处理
- :param pk: 公钥
- :param password: 明文密码
- :return: RAS加密之后的密码
- """
- public_key = "-----BEGIN PUBLIC KEY-----\n{}\n-----END PUBLIC KEY-----".format(pk)
- # 导入公钥 返回一个RSA秘钥对象
- rsakey = RSA.importKey(public_key)
- # 对需要加密的内容进行PKCS#1 v1.5加密
- cipher = cry_pksc1_v1_5.new(rsakey)
- # 使用公钥加密密码 密码必须是二进制
- miwen_encode = cipher.encrypt(password.encode())
- # 再使用Base64对类似字节的对象进行编码
- cipher_text = base64.b64encode(miwen_encode).decode()
- return cipher_text
-
-
- if __name__ == '__main__':
- pk = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaP" \
- "+rYm6rqTMP565UmMU6YXq46KtAN3zwDSO8LNa15p0lJfsaY8jXY7iLsZqQZrGYr2Aayp6hYZy+Q+AMB" \
- "/VUiSpD9ojPyOQ7r9jsf9jZbTOL4kj6iLZn37fEhp4eLvRgy5EJCyQoFyLCsgLechBTlYl2eA95C3j4ZUFhiV6WFHQIDAQAB "
- new_password = encrypto(pk, '123456')
- print(new_password)
然后就可进行重构后的模拟登录