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

news2024/11/28 12:37:15

引用上文:

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) {
    // 设置公钥、私钥和模数为大整数BigInt
    this.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"; // 公开指数部分,一般为65537
    var 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.coloradmin.cn/o/1295750.html

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

相关文章

OpenVINS学习1——数据集配置与运行

前言 OpenVINS是基于MSCKF的开源VIO算法&#xff0c;有非常详细的官网文档可以学习使用&#xff0c;将来一段时间的主要实践工作&#xff0c;就是深度掌握这份开源代码。 https://docs.openvins.com/ 一、环境配置与Euroc数据集运行 我的环境是Ubuntu20.04&#xff0c;ROS1&a…

EasyX图形化学习

1.EasyX是什么&#xff1f; 是基于Windows的图形编程&#xff0c;给用户提供函数接口&#xff0c;最终函数调用会由Windows的API实现。 注&#xff1a;EasyX只适配 c 。 2.头文件&#xff1a; <easyx.h>---只包含最新的函数 <graphics.h>---包含<easyx.h&g…

前程无忧接口分析

前程无忧接口分析 所需用到的工具URL解析通过抓包软件或者开发者选项抓取数据包对代码中的参数解析分析对acw_sc__v2进行分析对acw_sc__v2进行转换代码生成生成outPutList数组生成arg2参数生成arg3参数最终的效果 对详情页面的分析对timestamp__1258的生成分析 所需用到的工具 …

一些系统日常运维命令和语句

一、前言 记录一些日常系统运维的命令和语句 二、linux命令与语句 1、linux查看各目录使用磁盘情况 du -h /home home为目录 du -h /home 2.查看内存使用情况 free -h 3、查看进程和CPU使用情况 top top 三、数据库语句 1、统计mysql数据库表数量 SELECT COUNT(*) A…

【爬取二手车并将数据保存在数据库中】

爬取二手车并将数据保存在数据库中 查看网页结构分析爬取步骤解密加密信息将密文解密代码&#xff1a; 进行爬取&#xff1a;爬取函数写入解密文件函数和获取城市函数解密文件&#xff0c;返回正确字符串函数保存到数据库 运行结果 查看网页结构分析爬取步骤 可以看出网页使用…

新版本AndroidStudio删除无用资源

第一步&#xff1a; 第二步&#xff1a; 第三步&#xff0c;等加载完&#xff0c;自己选择要删除的文件。 注意&#xff01;&#xff01;&#xff01; 可能会遇到没有显示无用资源&#xff0c;这时把项目运行在真机上就出来了。

学习pytorch19 pytorch使用GPU训练

pytorch使用GPU进行训练 1. 数据 模型 损失函数调用cuda()2. 使用谷歌免费GPU gogle colab 需要创建谷歌账号登录使用, 网络能访问谷歌3. 执行4. 代码 B站土堆学习视频&#xff1a; https://www.bilibili.com/video/BV1hE411t7RN/?p30&spm_id_frompageDriver&vd_sourc…

Python Authlib库:构建安全可靠的身份验证系统

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在现代应用程序中&#xff0c;安全性是至关重要的&#xff0c;特别是在处理用户身份验证时。Authlib库为Python开发者提供了一套强大的工具&#xff0c;用于简化和增强身份验证和授权流程。本文将深入探讨Authli…

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子&#xff08;包括jQuery中常见的与索引相关的选择器&#xff09; 1. 操作table常见的1.1 动态给table添加title&#xff08;指定td&#xff09;1.1.1 给td动态添加title&#xff08;含&#xff1a;获取tr的第几个td&#xff09;1.1.2 动态加工…

elasticsearch聚合、自动补全、数据同步

目录 一、数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法 1.3 RestAPI实现聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 RestAPI实现自动补全 三、数据同步3.1 思路分析3.1.1 同…

Java来实现二叉树算法,将一个二叉树左右倒置(左右孩子节点互换)

文章目录 二叉树算法二叉树左右变换数据 今天来和大家谈谈常用的二叉树算法 二叉树算法 二叉树左右变换数据 举个例子&#xff1a; Java来实现二叉树算法&#xff0c;将一个二叉树左右倒置&#xff08;左右孩子节点互换&#xff09;如下图所示 实现的代码如下&#xff1a;以…

CMake ‘3.10.2‘ was not found in PATH or by cmake.dir property.

在部署Yolov5到安卓端的过程中出现&#xff1a;CMake ‘3.10.2’ was not found in PATH or by cmake.dir property. 原因&#xff1a; cmake版本太高&#xff0c;需要安装低版本的cmake 最开始下载的是默认最高版本的cmake,默认是3.22.1&#xff0c;解决方案是&#xff0c;下载…

AIGC创作系统ChatGPT网站源码,Midjourney绘画,GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

C++初阶 | [七] (上) string类

摘要&#xff1a;标准库中的string类的常用函数 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP(面向对象)的思想&#…

区块链创新应用场景不断拓展,实现去中心化

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 区块…

网络知识学习(笔记三)(传输层的TCP)

前面已经介绍了传输层的UDP协议的报文以及一下相关的知识点&#xff0c;本次主要是传输层的TCP协议&#xff0c;包括TCP报文的详细介绍&#xff1b;可靠传输、流量控制、拥塞控制等&#xff1b;建立连接、释放连接。 一、TCP基本知识点介绍 1.1、TCP协议的几个重要的知识点 …

联想电脑重装系统Win10步骤和详细教程

联想电脑拥有强大的性能&#xff0c;很多用户办公都喜欢用联想电脑。有使用联想电脑的用户反映系统出现问题了&#xff0c;想重新安装一个正常的系统&#xff0c;但是不知道重新系统的具体步骤。接下来小编详细介绍给联想电脑重新安装Win10系统系统的方法步骤。 推荐下载 系统之…

Elastcsearch:通过 Serverless 提供更多服务

作者&#xff1a;Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性&#xff0c;让搜索…

2023年12月8日:UI登陆界面

作业 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QPushButton> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…

Liunx系统使用超详细(五)~命令符号

目录 一、逻辑符号 1.1&& 1.2|| 二、连接符号 2.1| 2.2> 2.3>> 2.4< 三、分隔符号 3.1 &#xff1b; 在Linux中&#xff0c;逻辑符号和连接符号常用于构建命令行中的逻辑操作和管道操作。下面对这两种符号进行总结描述。 一、逻辑符号 1.1&…