当前位置: 首页 > news >正文

信用中国【国密SM2、SM4加解密】逆向算法分析

网址:aHR0cHM6Ly9jcmVkaXQuaGQuZ292LmNuL3h5eHhncy8=

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

点击加载更多可以看到请求相关的加密参数和返回的字节数据 请求的加密参数有nonceStr、queryContent、sign

请求参数分析

直接搜nonceStr

在这里插入图片描述

在这里插入图片描述

可以看到是uuid随机字符串

在这里插入图片描述

e = {"appId": "27IGtFrNFDc","signType": "SM2","encryptType": "SM4","appSignPrivateKey": "7faa61bb9051707ad9d9d2c417d61e038a3af871a61c8da534a9061ac1e51c32","appSignPublicKey": "040f5940c99c46ee9e438487c6a41d880b93f0804ea0e5ef53a062bb08203fc2a675b3d2b7a9aeb1862bb1b8fa5d17a40e300cbbe9a470ee3bf89b4ccb1c899719","encryptKey": "dbb78b8b64d640bb130255c69e959973","platformPublicKey": "0475ed079f423c14c6cc2fec93ce296cefc96c4be11af343c3f654f99140f8d6861589308929156ae62a74955c8bb2f4af540a45c7d1208f2ca61b264b4f383e27"
}
i = 'param=&page=2&size=10'
queryContent = sm4.encrypt(i, e.encryptKey)

queryContent 是SM4加密 ‘param=&page=2&size=10’
e对象是密钥相关信息,都是固定的,i中的page是从0开始的

sign值是将请求参数n按照键排序,再拼接成字符串

n = {"version": "1.0","appId": "27IGtFrNFDc","signType": "SM2","encryptType": "SM4","nonceStr": "1524e22536d347c082c2a9e77d12839f","timestamp": 1745648864934,"queryContent": "88e7484b6bd56df73e4672337fa76bde31244ee277cc8ef5d7df2e4ad5afd7b9"
}'appId=27IGtFrNFDc&encryptType=SM4&nonceStr=1524e22536d347c082c2a9e77d12839f&queryContent=88e7484b6bd56df73e4672337fa76bde31244ee277cc8ef5d7df2e4ad5afd7b9&signType=SM2&timestamp=1745648864934&version=1.0'

在这里插入图片描述
在这里插入图片描述

然后再将拼接的字符串进行SM2加密,SM2加密返回的结果是随机的

在这里插入图片描述
在这里插入图片描述

然后再将SM2加密得到的结果经过Zi()方法加密

在这里插入图片描述
在这里插入图片描述

这里用到了Yi()方法,就是把十六进制转为十进制

响应字节分析

有加密就有解密 直接搜decrypt(
可以猜,是和SM2或者SM4相关的解密,所以在这三个地方断点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里断住,就是SM4解密

在这里插入图片描述

function decryptByteArr(data){var r = Buffer.from(data).buffer, n = new DataView(r), i = new Uint8Array(r), s = {}, a = 40;D = ['body', 'code', 'message', 'nonceStr', 'requestId', 'subCode', 'subMessage', 'signed']D.forEach((function(t, e) {var r = n.getInt32(4 * e);s[t] = i.subarray(a, a + r),a += r}));c = sm4.decrypt(function(t) {if (!(t instanceof Uint8Array))throw new Error("Invalid Uint8Array");for (var e = "", r = 0; r < t.length; r++) {var n = t[r].toString(16);1 === n.length && (n = "0" + n),e += n}return e}(s.body), e.encryptKey, {output: "string"});return JSON.parse(c);
}
http://www.xdnf.cn/news/161731.html

相关文章:

  • 【学习笔记】Stata
  • CD32.【C++ Dev】类和对象(22) 内存管理(下)
  • 在线录屏工具(压箱底)-免费高清
  • 基于QT的仿QQ音乐播放器
  • Pygame精灵进阶:动画序列与角色控制
  • 信息论核心概念详解
  • 利用【指针引用】对【非空单循环链表】进行删除操作
  • 服务器虚拟化:技术解析与实践指南
  • 协程(微线程)
  • Kdenlive 中的变形、畸变、透视相关功能
  • Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值
  • 架构整洁之道 心得
  • 【线段树】P11414 [EPXLQ2024 fall round] 神奇磁铁|普及+
  • 如何在 PowerShell 脚本中调用外部 Windows 命令
  • 精益数据分析(29/126):深入剖析电子商务商业模式
  • 021-C语言文件操作
  • Linux系统性能调优技巧分享
  • 如何创建一个C#项目(基于VS2022版)
  • 本地电脑安装DeepSeek
  • 【特殊场景应对9】视频简历的适用场景与风险分析
  • Python----深度学习(基于DNN的PM2.5预测)
  • 作为高速通道光纤传输模式怎么理解以及到底有哪些?
  • “CSDN还有皮肤?“-如何更换(全网最新)
  • 小白如何学会完整挪用Github项目?(以pix2pix为例)
  • 识破养生假象,拥抱科学健康
  • 【随笔】地理探测器原理与运用
  • Python并发编程全景解析:多线程、多进程与协程的深度对比
  • 【OSG学习笔记】Day 11: 文件格式与数据交换
  • 3.1/Q1,Charls最新文章解读
  • RNN——循环神经网络