爬虫逆向sm3和sm4 加密 案例

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!!

案例--aHR0cDovLzExMS41Ni4xNDIuMTM6MTgwODgvc3Vic2lkeU9wZW4=

第一步:分析页面和请求方式

通过查看请求参数和响应内容,均为加密数据。最后的加密方式非AES和DES类型。本文主要分享案例中的sm4和sm3 加密

第二步:请求页面并分析请求

请求参数

headers 内容

响应内容

可以看出是均为密文

第三步:打断点逆向解析

在【search】里搜索 sign,通过观察关键信息得到以下即可(至于为啥能找到,自己悟吧,目前我能力有限无法用言语表达,全是命[一脸无奈]),可以看到headers 里加密的三个参数均能看到。sign, timestamp,source

第四步:分析加密方式

通过第三步,可以看到断点后重新请求,能够看出 e 和 t 很像参数,但不是很确定,可以先在控制台打印看一下。可以看出很像,但不确定,可以放置。将sign 生成的方法进行解析。可以看出 使用了s() 方法和 l()方法 ,注意s(t)返回的值要转成大写。

s()方法可以看出使用了sm3的加密方式

l() 方法可以看出使用sm4加密,同时可以看到有个 o 的参数,且参数为常量(别问我为啥,我也说不好,全凭感觉[一脸无奈]),注意注意d() 方法是sm4解密(别问,问就是自己想)

如果把上述代码扣下来会发现r.encrypt() 是个方法,且m() 也是个方法。把我所说的都扣下来基本就妥了。加密的过程就是这样。基本headers内加密参数就解决了

参数加密解析。sign 的断点页面,如下操作,堆栈那块选择上一步。就可以看到请求参数了。可以看到是 h()方法 ,正是一开始解析sign时 部分了。因此e的原本内容是 那一大串dict序列化的 内容(这部分请有缘人自己解析吧,基本复述上述步骤)

第五步:上代码

# -*- coding:utf-8 -*-
# @Time : 2024/3/16 17:39
# @Author: 水兵没月
# @File : XXX解析.py
# @Software: PyCharm
import execjs
from gmssl import sm4, sm3
# 读取JS文件
with open('./XX-解密.js', 'r', encoding='utf-8')as f:files = f.readlines()
f.close()
files = ''.join(files)
ctx = execjs.compile(files)
# 国密 SM3加密
def sm3_hash(message: str):"""国密sm3加密:param message: 消息值,bytes类型:return: 哈希值"""msg_list = [i for i in bytes(message.encode('UTF-8'))]hash_hex = sm3.sm3_hash(msg_list).upper()return hash_hexdef sm4_jiami(t):result = ctx.call('jiami', t)return resultdef sm4_jiemi(t):result = ctx.call('jiemi', t)return result
/* =====================
#@Time : 2024/3/16 17:44
#@Author: 水兵没月
#@File : XX-解密.py
#@Software: PyCharm
=======================*/// &key=HD7232D2AAAKA@978D8723H211?IER&6const e = 0, r = 32, i = 16, o = [214, 144, 233, 254, 204, 225, 61, 183, 22, 182, 20, 194, 40, 251, 44, 5, 43, 103, 154, 118, 42, 190, 4, 195, 170, 68, 19, 38, 73, 134, 6, 153, 156, 66, 80, 244, 145, 239, 152, 122, 51, 84, 11, 67, 237, 207, 172, 98, 228, 179, 28, 169, 201, 8, 232, 149, 128, 223, 148, 250, 117, 143, 63, 166, 71, 7, 167, 252, 243, 115, 23, 186, 131, 89, 60, 25, 230, 133, 79, 168, 104, 107, 129, 178, 113, 100, 218, 139, 248, 235, 15, 75, 112, 86, 157, 53, 30, 36, 14, 94, 99, 88, 209, 162, 37, 34, 124, 59, 1, 33, 120, 135, 212, 0, 70, 87, 159, 211, 39, 82, 76, 54, 2, 231, 160, 196, 200, 158, 234, 191, 138, 210, 64, 199, 56, 181, 163, 247, 242, 206, 249, 97, 21, 161, 224, 174, 93, 164, 155, 52, 26, 85, 173, 147, 50, 48, 245, 140, 177, 227, 29, 246, 226, 46, 130, 102, 202, 96, 192, 41, 35, 171, 13, 83, 78, 111, 213, 219, 55, 69, 222, 253, 142, 47, 3, 255, 106, 114, 109, 108, 91, 81, 141, 27, 175, 146, 187, 221, 188, 127, 17, 217, 92, 65, 31, 16, 90, 216, 10, 193, 49, 136, 165, 205, 123, 189, 45, 116, 208, 18, 184, 229, 180, 176, 137, 105, 151, 74, 12, 150, 119, 126, 101, 185, 241, 9, 197, 110, 198, 132, 24, 240, 125, 236, 58, 220, 77, 32, 121, 238, 95, 62, 215, 203, 57, 72], a = [462357, 472066609, 943670861, 1415275113, 1886879365, 2358483617, 2830087869, 3301692121, 3773296373, 4228057617, 404694573, 876298825, 1347903077, 1819507329, 2291111581, 2762715833, 3234320085, 3705924337, 4177462797, 337322537, 808926789, 1280531041, 1752135293, 2223739545, 2695343797, 3166948049, 3638552301, 4110090761, 269950501, 741554753, 1213159005, 1684763257];function s(t) {const n = [];for (let e = 0, r = t.length; e < r; e += 2)n.push(parseInt(t.substr(e, 2), 16));return n
}function c(t) {return t.map(t=>(t = t.toString(16),1 === t.length ? "0" + t : t)).join("")
}function u(t) {const n = [];for (let e = 0, r = t.length; e < r; e++) {const r = t.codePointAt(e);if (r <= 127)n.push(r);else if (r <= 2047)n.push(192 | r >>> 6),n.push(128 | 63 & r);else if (r <= 55295 || r >= 57344 && r <= 65535)n.push(224 | r >>> 12),n.push(128 | r >>> 6 & 63),n.push(128 | 63 & r);else {if (!(r >= 65536 && r <= 1114111))throw n.push(r),new Error("input is not supported");e++,n.push(240 | r >>> 18 & 28),n.push(128 | r >>> 12 & 63),n.push(128 | r >>> 6 & 63),n.push(128 | 63 & r)}}return n
}function g(t, n, r) {const i = new Array(4), o = new Array(4);for (let e = 0; e < 4; e++)o[0] = 255 & t[0 + 4 * e],o[1] = 255 & t[1 + 4 * e],o[2] = 255 & t[2 + 4 * e],o[3] = 255 & t[3 + 4 * e],i[e] = o[0] << 24 | o[1] << 16 | o[2] << 8 | o[3];i[0] ^= 2746333894,i[1] ^= 1453994832,i[2] ^= 1736282519,i[3] ^= 2993693404;for (let e, s = 0; s < 32; s += 4)e = i[1] ^ i[2] ^ i[3] ^ a[s + 0],n[s + 0] = i[0] ^= d(h(e)),e = i[2] ^ i[3] ^ i[0] ^ a[s + 1],n[s + 1] = i[1] ^= d(h(e)),e = i[3] ^ i[0] ^ i[1] ^ a[s + 2],n[s + 2] = i[2] ^= d(h(e)),e = i[0] ^ i[1] ^ i[2] ^ a[s + 3],n[s + 3] = i[3] ^= d(h(e));if (r === e)for (let e, a = 0; a < 16; a++)e = n[a],n[a] = n[31 - a],n[31 - a] = e
}function v(t, n, e) {const r = new Array(4), i = new Array(4);for (let o = 0; o < 4; o++)i[0] = 255 & t[4 * o],i[1] = 255 & t[4 * o + 1],i[2] = 255 & t[4 * o + 2],i[3] = 255 & t[4 * o + 3],r[o] = i[0] << 24 | i[1] << 16 | i[2] << 8 | i[3];for (let o, a = 0; a < 32; a += 4)o = r[1] ^ r[2] ^ r[3] ^ e[a + 0],r[0] ^= p(h(o)),o = r[2] ^ r[3] ^ r[0] ^ e[a + 1],r[1] ^= p(h(o)),o = r[3] ^ r[0] ^ r[1] ^ e[a + 2],r[2] ^= p(h(o)),o = r[0] ^ r[1] ^ r[2] ^ e[a + 3],r[3] ^= p(h(o));for (let o = 0; o < 16; o += 4)n[o] = r[3 - o / 4] >>> 24 & 255,n[o + 1] = r[3 - o / 4] >>> 16 & 255,n[o + 2] = r[3 - o / 4] >>> 8 & 255,n[o + 3] = 255 & r[3 - o / 4]
}function d(t) {return t ^ l(t, 13) ^ l(t, 23)
}function p(t) {return t ^ l(t, 2) ^ l(t, 10) ^ l(t, 18) ^ l(t, 24)
}function h(t) {return (255 & o[t >>> 24 & 255]) << 24 | (255 & o[t >>> 16 & 255]) << 16 | (255 & o[t >>> 8 & 255]) << 8 | 255 & o[255 & t]
}function l(t, n) {const e = 31 & n;return t << e | t >>> 32 - e
}function f(t) {const n = [];for (let e = 0, r = t.length; e < r; e++)t[e] >= 240 && t[e] <= 247 ? (n.push(String.fromCodePoint(((7 & t[e]) << 18) + ((63 & t[e + 1]) << 12) + ((63 & t[e + 2]) << 6) + (63 & t[e + 3]))),e += 3) : t[e] >= 224 && t[e] <= 239 ? (n.push(String.fromCodePoint(((15 & t[e]) << 12) + ((63 & t[e + 1]) << 6) + (63 & t[e + 2]))),e += 2) : t[e] >= 192 && t[e] <= 223 ? (n.push(String.fromCodePoint(((31 & t[e]) << 6) + (63 & t[e + 1]))),e++) : n.push(String.fromCodePoint(t[e]));return n.join("")
}function m(t, n, o, {padding: a="pkcs#7", mode: l, iv: h=[], output: p="string"}={}) {if ("cbc" === l && ("string" === typeof h && (h = s(h)),16 !== h.length))throw new Error("iv is invalid");if ("string" === typeof n && (n = s(n)),16 !== n.length)throw new Error("key is invalid");if (t = "string" === typeof t ? o !== e ? u(t) : s(t) : [...t],("pkcs#5" === a || "pkcs#7" === a) && o !== e) {const n = i - t.length % i;for (let e = 0; e < n; e++)t.push(n)}const d = new Array(r);g(n, d, o);const m = [];let b = h, y = t.length, _ = 0;while (y >= i) {const n = t.slice(_, _ + 16), r = new Array(16);if ("cbc" === l)for (let t = 0; t < i; t++)o !== e && (n[t] ^= b[t]);v(n, r, d);for (let t = 0; t < i; t++)"cbc" === l && o === e && (r[t] ^= b[t]),m[_ + t] = r[t];"cbc" === l && (b = o !== e ? r : n),y -= i,_ += i}if (("pkcs#5" === a || "pkcs#7" === a) && o === e) {const t = m.length, n = m[t - 1];for (let e = 1; e <= n; e++)if (m[t - e] !== n)throw new Error("padding is invalid");m.splice(t - n, n)}return "array" !== p ? o !== e ? c(m) : f(m) : m
}function jiami(t){var n = '30062AFC48C0E7B5B0918851C0445A37'var e1 = 0data = m(t, n, 1, e1)return data
}function jiemi(t){var n = '30062AFC48C0E7B5B0918851C0445A37'var e1 = undefineddata = m(t, n, 0, e1)return data
}

 仅作为笔记记录,如有问题请各位大佬来指导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/282298.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3·15日,上海飞北京,东航全球首架C919亲测初体验

引言&#xff1a;“望闻问切”亲测 感受C919机型的航班 【阿明观察 &#xff5c; 科技热点关注】 赶巧了&#xff01;2024年3月15日消费者权益日这天&#xff0c;上海飞北京&#xff0c;我选择了采用C919的东方航空公司航班。 真赶巧了&#xff01;上了飞机后我才知道&…

文件怎么做扫码预览?创建文件活码的步骤有哪些?

现在文件可以通过扫描二维码的方式来获取&#xff0c;与传统的通过聊天软件来传输相比&#xff0c;二维码方式的应用更加的方便&#xff0c;其他人只需要通过扫描一张二维码就可以在手机上浏览或者下载文件&#xff0c;通过手机就可以预览、存储。 文件二维码的制作方法也很简…

python共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b; 语言&#xff1a;Python 框架&#xff1a;django/flask 软件版本&#xff1a;python3.7.7 数据库…

MO尺度(大气边界层)

在大气表面层( atmospheric surface layer)中,MO参数是用来决定流动是中性或者非中性的一个重要参数。其定义是 z / L z/L z/L&#xff0c;其中 L L L为Obukhov长度&#xff0c;其含义是浮力产生的湍动能和剪切产生的湍动能之比(Hj h AIP 2023)(Monin IAS,1954)&#xff0c;具体…

实现el-table合并列

效果图如下 <el-table :data"atlasDataList" style"width: 100%" :span-method"spanMethod"><el-table-column prop"stationName" label"" width"180" /><el-table-column prop"atlasNumbe…

langchain+chatglm3+BGE+Faiss Linux环境安装依赖

前言 本篇默认读者已经看过之前windows版本&#xff0c;代码就不赘述&#xff0c;本次讲述是linux环境配置 超短代码实现&#xff01;&#xff01;基于langchainchatglm3BGEFaiss创建拥有自己知识库的大语言模型(准智能体)本人python版本3.11.0&#xff08;windows环境篇&…

栈和队列的学习

存储方式分两类&#xff1a;顺序存储和链式存储 栈&#xff1a;只允许从一端进行数据插入和删除的线性表&#xff1a;先进后出 FILO 队列&#xff1a;只允许从一端进行数据插入&#xff0c;另一端进行数据删除的线性表&#xff1a;先进先出 FIFO 栈 创建空栈&#xff0c;创建…

解决由于历史原因解析tflite失败的问题

文章目录 0. 背景1. tflite 历史遗留问题2. schema3. flatbuffers 编译器3.1 安装 FlatBuffers 编译器3.2. 编译 FlatBuffers schema 文件3.3 使用生成的 Python 文件 4 问题未解决终极解决方案 写在最前面&#xff1a;解决方法是升级tensorflow版本&#xff0c;重新生成tflite…

web前端笔记+表单练习题+五彩导航栏练习题

web前端笔记 1-骨架快捷方式!enter<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>骨架部分</titl…

基于单片机的指纹打卡机设计

摘要 在科学技术飞速发展的今天&#xff0c;社会对身份识别的要求越来越高&#xff0c;尤其是在企业管理的人员签到、工作考勤等活动中对身份识别的高效性和可靠性的需求更为迫切。而传统的个人身份识别手段&#xff0c;如钥匙、密码、IC卡等&#xff0c;由于具有可盗用、可伪…

vue3 reactive丢失响应式

问题 使用 reactive 构造响应式对象时&#xff0c;当对其进行重新赋值后&#xff0c;会导致原有变量失去响应式&#xff0c;页面不会发生联动更新 例如&#xff1a; 1、使用 reactive 定义一个响应式的对象变量 let data1 reactive({name: 小李,date: 2024-03-18,address: xx…

Spring炼气之路(炼气二层)

目录 一、bean的配置 1.1 bean的基础配置 1.2 bean的别名配置 1.3 bean的作用范围配置 二、bean的实例化 2.1 bean是如何创建创建的&#xff1f; 2.2 使用静态工厂实例化bean 2.3 使用实例工厂实例化bean 三、bean的生命周期 3.1 什么是bean的生命周期 3.2 bean的生…

工控机在机器人领域的应用丨工业一体机的应用

随着机器人技术的不断发展&#xff0c;机器人在制造、物流等领域得到了广泛应用。而工业控制计算机&#xff08;工控机&#xff09;作为机器人控制系统的核心设备&#xff0c;也在机器人领域发挥着越来越重要的作用。 机器人控制系统是机器人的核心部分&#xff0c;控制系统的…

C++的内存管理

目录 1. C/C内存分布 2. C语言中动态内存管理方式 3. C内存管理方式 3.1 new/delete操作内置类型 4. operator new与operator delete函数 4.1 连续开辟空间(尽力了解) 5. new和delete的实现原理 5.1 内置类型 5.2 自定义类型 6. 深入理解 6.1malloc/free和new/delete的区…

SAP CAP篇十五:写个ERP的会计系统吧,Part II

本文目录 本系列文章目标开发步骤数据库表设计初始数据初始数据&#xff1a;AccountCategories初始数据&#xff1a;AccountUsages初始数据&#xff1a;ChartOfAccounts初始数据&#xff1a;AccountSubjects Service 定义生成Fiori AppApp运行 本系列文章 SAP CAP篇一: 快速创…

适用于智能语音小家电的语音ic类型有哪些?

适用于智能语音小家电的语音ic类型有哪些&#xff1f; 1. 语音播放芯片&#xff1a;这种芯片主要用于实现语音提示和报警功能。例如&#xff0c;当按下某个按钮时&#xff0c;它可以发出语音提醒&#xff0c;或者在出现故障时发出报警声音。这种芯片的应用非常广泛&#xff0…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…

002_avoid_for_loop_in_Matlab避免使用for循环

避免使用for循环 在程序设计思想中&#xff0c;循环是一个很有力的工具。在循环中&#xff0c;计算机很轻松地重复执行相同的操作。循环是汇编之上的编程中最重要的概念之一。Matlab的循环有两个语言构造&#xff0c;一个是for循环&#xff0c;另一个是while循环。在Matlab中&…

JetBrains全家桶激活,分享 GoLand 2024 激活的方案

大家好&#xff0c;欢迎来到金榜探云手&#xff01; GoLand 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 GoLand等。这些工具被…

总结mac下解决matplotlib中文显示问题的几种方法

一、前言&#xff1a; 使⽤matplotlib画图时&#xff0c;由于matplotlib默认没有中⽂&#xff0c;显⽰中文时会出现空⽩⼩⽅块。 二、方法&#xff1a; 2.1 matplotlib中使用SimHei字体 1&#xff09;进入终端后查看matplotlib的字体路径&#xff1a; $ python >>&g…