JavaScript <关于逆向RSA非对称加密算法的案例(代码剖析篇)>--案例(五点一)

引用上文:

CSDNicon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/134857857

剖析:

var bitsPerDigit=16; // 每个数组元素可以表示的二进制位数// 数组复制函数,将源数组部分复制到目标数组的指定位置
function arrayCopy(src, srcStart, dest, destStart, n) {var m = Math.min(srcStart + n, src.length);for (var i = srcStart, j = destStart; i < m; ++i, ++j) {dest[j] = src[i];}
}var maxDigitVal = 65535; // 数字最大值(16位,即2的16次方减一)
var biRadixBits = 16; // 基数位数(二进制)// 多个函数与算法中用到的变量和计算方式,例如乘法、乘方、左移等,略去具体说明// 返回大整数的十六进制字符串
function biToHex(x) {var result = "";var n = biHighIndex(x); // 获取有效位for (var i = biHighIndex(x); i > -1; --i) {result += digitToHex(x.digits[i]);}return result;
}// RSA公钥对的构造函数
function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen) {// 设置公钥、私钥和模数为大整数BigIntthis.e = biFromHex(encryptionExponent);this.d = biFromHex(decryptionExponent);this.m = biFromHex(modulus);// 如果没有提供密钥长度,则通过模数的位数计算,每个chunk的大小(二进制字节单位)this.chunkSize = (keylen) ? keylen / 8 : 2 * biHighIndex(this.m);this.radix = 16; // 设置输出的基数(十六进制)this.barrett = new BarrettMu(this.m); // 用于优化模逆计算的BarrettMu对象
}// 大整数BigInt的构造函数,如果传入true,则digits不初始化,否则初始化为零数组
function BigInt(flag) {if (typeof flag == "boolean" && flag == true) {this.digits = null;} else {this.digits = ZERO_ARRAY.slice(0);}this.isNeg = false; // 表示数字的符号,默认为非负
}// 设置全局的最大数字位数和相应的零数组、bigZero、bigOne等的初始化
function setMaxDigits(value) {maxDigits = value;ZERO_ARRAY = new Array(maxDigits);for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0;bigZero = new BigInt();bigOne = new BigInt();bigOne.digits[0] = 1;
}// 被RSA加密函数使用的内部函数,略去具体说明// RSA加密的实现函数
function encryptedString(key, s, pad, encoding) {// ...详细的加密处理...// 使用公钥中的指数e对数据进行加密,最终返回加密字符串
}// rsa函数封装了创建密钥、设置位数和执行加密操作
function rsa(arg) {setMaxDigits(130); // 设置最大位数var PublicExponent = "10001"; // 公开指数部分,一般为65537var modulus = "..."; // 模数,这里因篇幅而缩略var key = new RSAKeyPair(PublicExponent, "", modulus); // 生成RSA公钥对return encryptedString(key, arg); // 返回加密后的字符串
}console.log(rsa("输入你的密码")) // 执行RSA加密,并打印加密后的结果

为逆向而生---rsa篇总结:

非对称加密算法,尤其是RSA加密算法,以其强大的加密能力被广泛应用于在线交易和数据传输中保护信息安全。常规使用该算法时,我们需要公钥、私钥以及一系列的算法参数来确保加密的有效进行。然而,在某些情况下,逆向工程师可能需要从一堆混淆的代码中找到这些关键参数。在JavaScript文件中,这一任务既有挑战性,也不失为一门技艺。

逆向解析RSA参数的步骤概述

首先,需要明确我们要寻找的参数主要包括:模数(n),公开指数(e),以及在私钥情况下需找到的私钥指数(d)。在JavaScript代码中,这些参数可能会以十六进制字符串的形式出现。

1. 定位密钥生成逻辑
通常,RSA密钥的生成逻辑会包含赋值给某些变量的步骤。代码逆向的第一步是定位到这一逻辑段落。可以通过查找“RSAKeyPair”, "BigInt", 或者与加密相关的关键函数如“biFromHex”来进行。
 2. 分析密钥结构
通过密钥生成函数的参数和内部使用方式,可以推断出模数(n)、公开指数(e)和私钥指数(d)等参数。这些在构造函数`RSAKeyPair`中将经典地用于初始化一个新的密钥对对象。
 3. 提取加密参数
一旦我们定位到了密钥生成逻辑,下一步就是逐个提取相应的参数。公钥和私钥通常会以某种加密形式存储,最常见的为十六进制字符串。在JavaScript中,这些参数可能会通过函数如`biFromHex`来转换成适合加密算法使用的大数字格式(BigInt)。
4. 确认编码和填充方式
除了密钥参数,加密过程还与编码和填充方式紧密相关。在JavaScript的RSA实现中,需要确认是否有`Utf8`编码的应用,以及`Pkcs1`等填充策略,因为这些都会影响加密数据的最终形式。
5. 提取完成
具备了这些参数和算法细节后,逆向工程师就可以使用相同的参数在自己的环境中复制加密和解密过程了。倘若目标是解密,获取私钥(d)至关重要,而这通常通过对JavaScript代码的逻辑流程和函数调用进行跟踪来实现。

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

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

相关文章

git提交代码报错Git: husky > pre-commit

目录 git提交代码报错原因解决方法&#xff08;三种&#xff09;1、第一种2、第二种3、第三种 git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代…

【小白专用】MySQL创建数据库和创建数据表

1.在Windows开始搜索输入Mysql,并选择第一个打开。 2.输入安装时的密码 3.说明安装成功。 二、创建数据库 1. 连接 MySQL 输入 mysql -u root -p 命令&#xff0c;回车&#xff0c;然后输入 MySQL 的密码(不要忘记了密码)&#xff0c;再回车&#xff0c;就连接上 MySQL 了。 …

深入Redis过程-持久化

目录 redis实现持久化 RDB 触发机制-定期方法 定期-手动触发 save bgsave 定期-自动触发 AOF 开启AOF功能 刷新缓冲区策略 重写机制 混合持久化 Redis事务 事务相关的命令 MULTI EXEC DISCARD WATCH redis实现持久化 RDB RDB叫做Redis数据备份文件&#xf…

强大的公式编辑器 —— MathType最新版本安装与使用

强大的公式编辑器 —— MathType最新版本安装与使用 由于使用了很长时间的机械硬盘出现坏道&#xff0c;安装在其中的MathType6.9&#xff08;精简版&#xff09;也没办法使用了&#xff0c;本来想安装个高版本的MathType&#xff0c;比如MathType7.4&#xff0c;但在网上苦苦…

如何更改Jupyter Notebook中的环境?

1.首先&#xff0c;打开终端 2.接着&#xff0c;分别输入以下命令 conda env list 把EXPose替换为自己的环境变量 conda activate EXPose 3.接下来安装‘ ipykernel ’软件包 conda install ipykernel 4. 将该环境添加到Jupyter Notebook中&#xff1b;在Jupyter Notebook…

小白第一次开私服怎么吸引玩家

大家好&#xff0c;我是咕噜-凯撒&#xff0c;在现在这个网络社会很多人为了放松一下会选择打打游戏&#xff0c;私服也就成为了许多玩家为了寻找新鲜体验的热门选择&#xff0c;很多小白就发现了这个契机但是吸引玩家加入自己的服务器也就成了一个比较头疼的问题&#xff0c;下…

Wrong number of values of control parameter 2(Halcon 错误代码:1402)

threshold (ImageReduced1, Region, 0,min2(75,Min)) 程序运行到这一句&#xff0c;出现错误 原因是其中的参数Min为空数组 解决方案&#xff1a;判断了下可以输出Min的区域是否存在&#xff0c;不存在跳过这一步。

mybatis多表映射-分步查询

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

函数的栈帧

我们每次在调用函数的时候&#xff0c;都说会进行传参。每次创建函数&#xff0c;或者进行递归的时候&#xff0c;也会说会进行压栈。 那么&#xff0c;今天我们就来具体看看函数到底是如何进行压栈&#xff0c;传参的操作。 什么是栈&#xff1f; 首先我们要知道&#xff0c;…

Error opening file for writing报错解决

报错展示及描述 在安装pycharm的时候出现了一下报错&#xff0c; Error opening file for writing。 报错原因 一般出现这种报错都是文件权限的原因&#xff0c;检查一下&#xff0c;果然这个文件夹权限是【只读】 查看文件权限的方式&#xff1a;【右击】文件夹名称&#xff0…

046:vue通过axios调用json地址数据的方法

第046个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

ffmpeg过滤器filter理论与实战

文章目录 前言一、DirectShow1、简介2、程序基本结构3、架构 二、过滤器1、视频过滤器 -vf2、音频过滤器 -af3、过滤器链&#xff08;Filterchain&#xff09;4、过滤器图&#xff08;Filtergraph&#xff09;①、基本语法②、Filtergraph 的分类 5、结构体间的关系图 三、过滤…

保研毕业论文查重率多少通过【保姆教程】

大家好&#xff0c;今天来聊聊保研毕业论文查重率多少通过&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 保研毕业论文查重率多少通过 在保研过程中&#xff0c;毕业论文的查重率是衡量学术诚信和论文…

JAVA8新特性之函数式编程详解

JAVA8新特性之函数式编程详解 前言一、初步了解函数式接口二、 Lambda表达式2.1 概述2.2 lambda省略规则2.3 lambda省略常见实例2.4 lambda表达式与函数式接口 三、 Stream流3.1 stream流的定义3.2 Stream流的特点3.3 Stream流的三个步骤3.4 Stream 和 Collection 集合的区别&a…

【HarmonyOS开发】拖拽动画的实现

动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#xff08;F…

【带头学C++】----- 九、类和对象 ---- 9.12 C++之友元函数(9.12.1---12.4)

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易&#xff0c;麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜&#xff01;献舞一支&#xff01;❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.12…

五:爬虫-数据解析之xpath解析

三&#xff1a;数据解析之xpath解析 1.xpath介绍&#xff1a; ​ xpath是XML路径语言&#xff0c;它可以用来确定xml文档中的元素位置&#xff0c;通过元素路径来完成对元素的查找&#xff0c;HTML就是XML的一种实现方式&#xff0c;所以xpath是一种非常强大的定位方式​ XPa…

vue2 element-ui select下拉框 选择传递多个参数

<el-select v-model"select" slot"prepend" placeholder"请选择" change"searchPostFn($event,123)"> <el-option :label"item.ziDianShuJu" :value"{value:item.id, label:item.ziDianShuJu}" v-for&qu…

Ubuntu系统使用快速入门实践(七)——软件安装与使用(5)

Ubuntu系统使用快速入门实践系列文章 下面是Ubuntu系统使用系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 Ubuntu系统使用快速入门实践系列文章总链接 下面是专栏地址&#xff1a; Ubuntu系统使用快速入门实践系列文章专栏 文章目录 Ubuntu系统使用快速…

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

【背景】 最近在研究远程画面&#xff0c;所以就实践了一下。技术采用我认为比较合适的WebRTC。 这篇文章的基础是我的另一篇博文&#xff0c;如果希望顺利完成本篇操作&#xff0c;请先关注我后查询我的如下博文&#xff1a; 【WebRTC】【Unity】Unity Web RTC1-Unity中简单实…