学习目标:
- 了解 算法实现方法
- 熟悉 定位加密位置
- 熟悉 网页加密的实现
一、非对称简介
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对用的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
- 常见非对称加密算法 RSA、DSA。
- 非对称加密算法私钥由数据接收方持有,不会在网络上传递,保证了密钥的安全。
- 非对称加密算法通常比对称加密算法计算复杂,性能消耗高。
- 非对称加密算法可用于数字签名。

注意:
- 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留
- 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密。
二、非对称加密算法的特征与实现
1.非对称加密的定位方法
常见JavaScript调试算法
- 搜索关键词 new JSEncrypt(),JSEncrypt 等,一般会使用 JSEncrypt 库,会有new一个实例对象的操作;
- 搜索关键词 setPublicKey、setKey、setPrivateKey、getPublicKey 等,一般实现的代码里都含有设置密钥的过程。
2.非对称加密算法的特征
RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:
| 私钥长度 | 公钥长度 | 明文长度 |
|---|---|---|
| 428 | 128 | 1~53 |
| 812 | 216 | 1~117 |
| 1588 | 392 | 1~245 |
3.非对称加密算法的代码实现
javascript代码:
var NodeRSA = require('node-rsa')
function rsaEncrypt() {
pubKey = new NodeRSA(publicKey, 'pkcs8-public');
var encrypteData = pubKey.encrypt(text, 'base64');
return encrypteData
}
function rsaDecrypt() {
priKey = new NodeRSA(privateKey, 'pkcs8-private');
var decrypteData = priKey.decrypt(encrypteData, 'utf8');
return decrypteData
}
var key = new NodeRSA({b:512}) // 生成512位密钥
var publicKey=key.exportKey('pkcs8-public'); //导出公钥
var privateKey=key.exportKey('pkcs8-private');//导出私钥
var text='新年快乐'
var encrypteData=rsaEncrypt()
var decrypteData=rsaDecrypt()
console.log('公钥:\n',publicKey)
console.log('私钥:\n',privateKey)
console.log('加密字符串:',encrypteData)
console.log('解密字符串:',decrypteData)
python代码:
import rsa
import base64
def rsa_encrypt(pub_key,t):
# 公钥加密
rsas=rsa.encrypt(t.encode("utf-8"),pub_key)
return base64.b64encode(rsas)
def rsa_decrypt(pr_key,t):
# 私钥解密
rsas=rsa.decrypt(base64.b64decode(t),pr_key).decode("utf-8")
return rsas
if __name__ == '__main__':
public_key,private_key = rsa.newkeys(512) # 生成公钥,私钥
print('公钥:',public_key)
print('私钥:',private_key)
text='新年快乐'
encrypted_text=rsa_encrypt(public_key,text)
print('加密字符串:',encrypted_text)
decrypted_text=rsa_decrypt(private_key,encrypted_text)
print('解密字符串:',decrypted_text)
三、案例
1.案例1
(1)逆向目标
网址:https://login.10086.cn/html/login/email_login.html
接口:https://login.10086.cn/login.htm
加密参数:
(2)逆向分析
关键字定位:


(3)代码实现
var JSEncrypt=require('jsencrypt')
function et(_0x32033c) {
var _0x283d00 = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgDq4OqxuEisnk2F0EJFmw4xKa5IrcqEYHvqxPs2CHEg2kolhfWA2SjNuGAHxyDDE5MLtOvzuXjBx/5YJtc9zj2xR/0moesS+Vi/xtG1tkVaTCba+TV+Y5C61iyr3FGqr+KOD4/XECu0Xky1W9ZmmaFADmZi7+6gO9wjgVpU9aLcBcw/loHOeJrCqjp7pA98hRJRY+MML8MK15mnC4ebooOva+mJlstW6t/1lghR8WNV8cocxgcHHuXBxgns2MlACQbSdJ8c6Z3RQeRZBzyjfey6JCCfbEKouVrWIUuPphBL3OANfgp0B+QG31bapvePTfXU48TYK0M5kE+8LgbbWQIDAQAB';
var _0x1defd6 = new JSEncrypt();
_0x1defd6['setPublicKey'](_0x283d00);
var _0x4bd6d3 = _0x1defd6['encrypt'](_0x32033c);
return _0x4bd6d3;
}
console.log(et('123456'))
2.案例2
(1)逆向目标
接口:https://api.birdreport.cn/front/activity/search
加密数据:

(2)逆向分析
请求头加密参数定位分析:




表单数据加密定位分析:








响应数据加密定位分析:
decrypt关键字进行搜索定位:


(3)代码实现
javascript代码:
var CryptoJS = require('crypto-js')
var JSEncrypt = require('jsencrypt')
function getUuid() {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 32; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 16), 1)
}
s[14] = "4";
s[19] = hexDigits.substr(s[19] & 3 | 8, 1);
s[8] = s[13] = s[18] = s[23];
var uuid = s.join("");
return uuid
}
function gn(data) {
var paramPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvxXa98E1uWXnBzXkS2yHUfnBM6n3PCwLdfIox03T91joBvjtoDqiQ5x3tTOfpHs3LtiqMMEafls6b0YWtgB1dse1W5m+FpeusVkCOkQxB4SZDH6tuerIknnmB/Hsq5wgEkIvO5Pff9biig6AyoAkdWpSek/1/B7zYIepYY0lxKQIDAQAB";
var encrypt = new JSEncrypt;
encrypt.setPublicKey(paramPublicKey);
var headers = {}
headers["timestamp"] = Date.parse(new Date);
headers["requestId"] = getUuid();
headers["data_encrypt"] = encrypt.encrypt(data);
headers["sign"] = CryptoJS.MD5(data + headers["requestId"] + headers["timestamp"]).toString()
return headers
}
function gunniao(text) {
var _0x3c6fa1 = {
"words": [
1127761218,
892678452,
1095120193,
1145324089,
876753458,
808927792,
943928886,
909128003
],
"sigBytes": 32
}
var _0x3ec027 = {
"words": [
892683332,
926499638,
1177564229,
826357303
],
"sigBytes": 16
}
var text = CryptoJS["AES"]["decrypt"](text, _0x3c6fa1, {
'iv': _0x3ec027,
'mode': CryptoJS["mode"]['CBC'],
'padding': CryptoJS['pad']["Pkcs7"]
})['toString'](CryptoJS['enc']['Utf8']);
return JSON.parse(text)
}
// console.log(gunniao('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'))
python 代码:
import requests
import execjs
import pymongo
class GunNiao():
def __init__(self):
self.client=pymongo.MongoClient()
self.db=self.client['py_spider']['gn']
self.headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "https://www.birdreport.cn",
"Pragma": "no-cache",
"Referer": "https://www.birdreport.cn/",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-site",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
"requestId": "7b809a243dec83422c39487388f4d65d",
"sec-ch-ua": "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\", \"Google Chrome\";v=\"138\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sign": "ac4502b6124c9c040a780a54e5247df3",
"timestamp": "1753384836000"
}
self.url = "https://api.birdreport.cn/front/activity/search"
self.page_data='{"limit":"20","page":"%s"}'
def get_info(self,page):
with open('1.观鸟.js', encoding='utf-8')as f:
js_code = f.read()
js = execjs.compile(js_code)
headers_data=js.call('gn',self.page_data % page)
self.headers["sign"]=headers_data["sign"]
self.headers["timestamp"]=str(headers_data["timestamp"])
self.headers["requestId"]=headers_data["requestId"]
data=headers_data['data_encrypt']
response = requests.post(self.url, headers=self.headers, data=data)
print(response.text)
print(response.status_code)
res_data=js.call('gunniao',response.json()['data'])
return res_data
def parse_data(self,res_data):
item={}
for i in res_data:
item['ob_address']=i['address']
item['ob_time']=i['startTime']+'至'+i['endTime']
item['ob_user']=i['username']
item['count']=i['taxonCount']
self.save(item)
def save(self,item):
if '_id' in item:
del item['_id']
self.db.insert_one(item)
print(f'{item["ob_address"]}保存成功!!!')
def main(self):
for page in range(1,15):
res_data=self.get_info(page)
self.parse_data(res_data)
if __name__ == '__main__':
g=GunNiao()
g.main()
3.案例3
(1)逆向目标
接口:https://ec.minmetals.com.cn/open/homepage/zbs/by-lx-page
加密参数:

(2)逆向分析
具体分析:异步流程与数据流分析-CSDN博客













(3)代码实现
javascript代码:
var JSEncrypt = require('jsencrypt')
var Crypto = require('crypto-js')
function v(A, e) {
var t = Object.keys(A);
if (Object.getOwnPropertySymbols) {
var n = Object.getOwnPropertySymbols(A);
e && (n = n.filter((function (e) {
return Object.getOwnPropertyDescriptor(A, e).enumerable
}
))),
t.push.apply(t, n)
}
return t
}
function b(A, e, t) {
return e in A ? Object.defineProperty(A, e, {
value: t,
enumerable: !0,
configurable: !0,
writable: !0
}) : A[e] = t,
A
}
function m(A) {
for (var e = 1; e < arguments.length; e++) {
var t = null != arguments[e] ? arguments[e] : {};
e % 2 ? v(Object(t), !0).forEach((function (e) {
b(A, e, t[e])
}
)) : Object.getOwnPropertyDescriptors ? Object.defineProperties(A, Object.getOwnPropertyDescriptors(t)) : v(Object(t)).forEach((function (e) {
Object.defineProperty(A, e, Object.getOwnPropertyDescriptor(t, e))
}
))
}
return A
}
function w(A) {
var e, t, n = "", r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", a = "=";
for (e = 0; e + 3 <= A.length; e += 3)
t = parseInt(A.substring(e, e + 3), 16),
n += r.charAt(t >> 6) + r.charAt(63 & t);
e + 1 == A.length ? (t = parseInt(A.substring(e, e + 1), 16),
n += r.charAt(t << 2)) : e + 2 == A.length && (t = parseInt(A.substring(e, e + 2), 16),
n += r.charAt(t >> 2) + r.charAt((3 & t) << 4));
while ((3 & n.length) > 0)
n += a;
return n
}
function encryptLong(aa, A) {
var e = aa.getKey()
, t = (e.n.bitLength() + 7 >> 3) - 11;
try {
var n = ""
, r = "";
if (A.length > t)
return n = A.match(/.{1,50}/g),
n.forEach((function (A) {
var t = e.encrypt(A);
r += t
}
)),
w(r);
var a = e.encrypt(A)
, s = w(a);
return s
} catch (i) {
return i
}
}
function MD5(text) {
return Crypto.MD5(text).toString()
}
function encrypt(publickkey,page) {
var t = new JSEncrypt()
var e = {
"inviteMethod": "",
"businessClassfication": "",
"mc": "",
"lx": "ZBGG",
"dwmc": "",
"pageIndex": page
}
t.setPublicKey(publickkey)
a = m(m({}, e), {}, {
sign: MD5(JSON.stringify(e)),
timeStamp: +new Date
}),
s = encryptLong(t, JSON.stringify(a))
return s
}
// console.log(encrypt('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgQnneEaFvLQSeDSM9lMW/FqXrAsiaBjsge88wvfJTOd0p+1 Jd0MWVmHEJK2q1x9EAZiUUAnDTNLCxjMklPlHTIUr0oEfgOrzpKMXd5X4p8pq0Z/7 Mp //RP74cjEfEBtuG+K3zGgFBf9+rGhXqZ25MLId4iAiPPfLYfsZ0SMfeVQIDAQAB',4))
python代码:
import requests
import json
import execjs
import csv
import os
class Wukuang():
def __init__(self):
self.headers = {
"sec-ch-ua-platform": "\"Android\"",
"Referer": "https://ec.minmetals.com.cn/open/home/purchase-info",
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36",
"Accept": "application/json, text/plain, */*",
"sec-ch-ua": "\"Google Chrome\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"",
"Content-Type": "application/json",
"sec-ch-ua-mobile": "?1"
}
self.p_url = "https://ec.minmetals.com.cn/open/homepage/public"
self.url = "https://ec.minmetals.com.cn/open/homepage/zbs/by-lx-page"
self.filename='wukuang.csv'
def get_info(self,page):
# 获取公钥
res = requests.post(self.p_url, headers=self.headers)
# 获取参数
with open('五矿.js', encoding='utf-8') as f:
js_code = f.read()
js = execjs.compile(js_code)
param = js.call('encrypt', res.text, page)
data = {"param": param}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(self.url, headers=self.headers, data=data)
return response.json()
def parse_data(self,data_info):
item=dict()
for i in data_info['list']:
item['url']=f'https://ec.minmetals.com.cn/open/home/purchase-info?id={i["bm"]}&lx=zbgg'
item['title']=i['mc']
item['time']=i['rq']
item['condDes']=i['condDes']
self.save(item)
def save(self,item):
file_exists=os.path.exists(self.filename)
with open('wukuang.csv','a',encoding='utf-8',newline='') as f:
header=['url','title','time','condDes']
f_csv = csv.DictWriter(f, header)
if not file_exists:
f_csv.writeheader()
f_csv.writerow(item)
print(f'{item["title"]}保存成功')
def main(self):
for page in range(1,11):
data_info = self.get_info(page)
self.parse_data(data_info)
if __name__ == '__main__':
w=Wukuang()
w.main()

2572

被折叠的 条评论
为什么被折叠?



