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,一经查实,立即删除!

相关文章

国内地址地区智能解析,无需完整地址也能正确匹配

页面直接引入使用 已打包成单文件dist/bundle.js 可以直接通过标签引用 <script src="./bundle.js"></script> <script>var results = AddressParse.parse(福建省福州市福清市石竹街道义明综合楼3F,15000000000,asseek);console.log(results);…

OD机考真题搜集:服务失效判断

题目 某系统中有众多服务,每个服务用字符串(只包含字母和数字,长度<=10)唯一标识,服务间可能有依赖关系,如A依赖B,则当B故障时导致A也故障。 依赖具有传递性,如A依赖B,B依赖C,当C故障时导致B故障,也导致A故障。 给出所有依赖关系,以及当前已知故障服务,要求输…

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

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

Kotlin 中密封类、枚举类与密封接口的对比分析

在 Kotlin 编程语言中&#xff0c;密封类&#xff08;Sealed Classes&#xff09;、枚举类&#xff08;Enum Classes&#xff09;和密封接口&#xff08;Sealed Interfaces&#xff09;是处理一组固定类型的强大工具。它们在 Kotlin 中扮演着特殊的角色&#xff0c;特别是在创建…

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

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

数据库常用锁

数据库锁是一种用于管理并发访问的机制&#xff0c;以确保数据的一致性和完整性。在并发访问的情况下&#xff0c;多个事务可能同时尝试访问相同的数据&#xff0c;而数据库锁能够协调这些访问&#xff0c;防止数据不一致的问题。以下是一些常见的数据库锁及其详细解释&#xf…

C语言-统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数M和N&#xff08;1≤M≤N≤500&#xff09;。 输出格式: 在一行中顺序输出M和N区间内素数的个数以及它们的和&#xff0c;数字间以空格分隔。 输入样例: 10 31输出样例: 7…

深入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…

HTB Surveillance

Surveillance 2023年12月10日 12:13:35User nmap Starting Nmap 7.80 ( https://nmap.org ) at 2023-12-10 12:15 CST Stats: 0:00:37 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 59.83% done

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

大家好&#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;不存在跳过这一步。

八叉树bt文件转为grid文件的代码及编译流程

目的 点云文件转为八叉树文件 代码 在一个文件夹中新建两个文件&#xff0c;pcd2bt.cpp和CMakeLists.txt&#xff0c;分别写入&#xff1a; grid3d_node.cpp #include <ros/ros.h> #include <string> #include "grid3d.hpp"int main(int argc, char…

【Maven技术专题】「实战开发系列」盘点Maven项目中打包需要注意到的那点事儿

Maven项目打包需要注意到的那点事儿 Maven是什么Maven打包插件的作用Maven打包后经常出现的问题maven构建可运行Jar包 Maven打包的三种方式Maven打包的最简单的方法maven-jar-pluginMANIFEST.MF文件部分MANIFEST.MF的文件内容jar包的拷贝机制在pom.xml中配置 maven-jar-plugin的…

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 …

C++大型项目经验

1 附加包含目录 在Visual Studio中&#xff0c;“附加包含目录”&#xff08;Additional Include Directories&#xff09;是一个编译器设置&#xff0c;它指示编译器在查找包含文件&#xff08;通常是头文件&#xff0c;扩展名为.h或.hpp&#xff09;时去哪些额外的文件夹路径…

函数的栈帧

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

Error opening file for writing报错解决

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

CSS结构伪类选择器之否定伪类:not()

结构伪类选择器是针对 HTML 层级结构的伪类选择器。 常用的结构化伪类选择器有&#xff1a; :root选择器、:not选择器、:only-child选择器、:first-child选择器、:last-child选择器、 :nth-child选择器、:nth-child(n)选择器、:nth-last-child(n)选择器、:nth-of-type(n)选择…