非对称加密算法

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

学习目标:

  1. 了解 算法实现方法
  2. 熟悉 定位加密位置
  3. 熟悉 网页加密的实现

一、非对称简介

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对用的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

  • 常见非对称加密算法 RSA、DSA。
  • 非对称加密算法私钥由数据接收方持有,不会在网络上传递,保证了密钥的安全。
  • 非对称加密算法通常比对称加密算法计算复杂,性能消耗高。
  • 非对称加密算法可用于数字签名。

注意:

  • 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留
  • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密。 

 二、非对称加密算法的特征与实现

1.非对称加密的定位方法

常见JavaScript调试算法

  • 搜索关键词 new JSEncrypt(),JSEncrypt 等,一般会使用 JSEncrypt 库,会有new一个实例对象的操作;
  • 搜索关键词 setPublicKey、setKey、setPrivateKey、getPublicKey 等,一般实现的代码里都含有设置密钥的过程。

2.非对称加密算法的特征

RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:

私钥长度公钥长度明文长度
4281281~53
8122161~117
15883921~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()

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值