JS逆向---非对称加密对抗(RSA,DSA详解以及案例分析)


前言

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除

一. 非对称加密简介

  • 常见非对称加密算法 RSA、DSA。
  • 非对称加密算法私钥由数据接收方持有,不会在网络上传递,保证了密钥的安全。
  • 非对称加密算法通常比对称加密算法计算复杂,性能消耗高。
  • 非对称加密算法可用于数字签名。
    在这里插入图片描述
  • 常见非对称加密算法 RSA、DSA。
  • 非对称加密算法私钥由数据接收方持有,不会在网络上传递,保证了密钥的安全。
  • 非对称加密算法通常比对称加密算法计算复杂,性能消耗高。
  • 非对称加密算法可用于数字签名。
  • 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留。
  • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密

二. 非对称特征

常见JavaScript调试算法

  • 搜索关键词 new JSEncrypt(),JSEncrypt 等,一般会使用 JSEncrypt库,会有 new 一个实例对象的操作;
  • 搜索关键词 setPublicKey、setKey、setPrivateKey、getPublicKey 等,一般实现的代码里都含有设置密钥的过程。

RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:

私钥长度公钥长度明文长度密文长度
4281281~5388
8122161~117172
15883921~245344

1. Javascript实现

// npm install node-rsa --save
// 引用 node-rsa 加密模块
var NodeRSA = require('node-rsa');

function rsaEncrypt() {
    pubKey = new NodeRSA(publicKey,'pkcs8-public');
    var encryptedData = pubKey.encrypt(text, 'base64');
    return encryptedData
}

function rsaDecrypt() {
    priKey = new NodeRSA(privatekey,'pkcs8-private');
    var decryptedData = priKey.decrypt(encryptedData, 'utf8');
    return decryptedData
}

var key = new NodeRSA({b: 512});                    //生成512位秘钥
var publicKey = key.exportKey('pkcs8-public');    //导出公钥
var privatekey = key.exportKey('pkcs8-private');  //导出私钥
var text = "I love Python!"

var encryptedData = rsaEncrypt()
var decryptedData = rsaDecrypt()

console.log("公钥:\n", publicKey)
console.log("私钥:\n", privatekey)
console.log("加密字符串: ", encryptedData)
console.log("解密字符串: ", decryptedData)

2. python实现

模块:rsa

import rsa
import base64

def rsa_encrypt(pu_key, t):
    # 公钥加密
    rsas = rsa.encrypt(t.encode("utf-8"), pu_key)
    return base64.b64encode(rsas)

def rsa_decrypt(pr_key, t):
    # 私钥解密
    rsas = rsa.decrypt(base64.b64decode(t), pr_key).decode("utf-8")
    return rsas

if __name__ == "__main__":
    public_key, private_key = rsa.newkeys(512)   # 生成公钥、私钥
    print('公钥:', public_key)
    print('私钥:', private_key)
    text = 'I love Python!'  # 加密对象
    encrypted_str = rsa_encrypt(public_key, text)
    print('加密字符串:', encrypted_str)
    decrypted_str = rsa_decrypt(private_key, encrypted_str)
    print('解密字符串:', decrypted_str)

三. 案例分析

1. RSA逆向分析

  • 逆向目标:房天下登录
  • 逆向参数:表单数据

首先进行抓包分析
在这里插入图片描述
然后直接从启动器进入源代码中
在这里插入图片描述
感觉已经找到了表单信息,打断点测试一下,进行停顿了,进行代码测试,看看是不是我们需要的数据pwd
在这里插入图片描述
基本确认,这里就是我们需要的位置,对于key_to_encode进行搜索查看一下
在这里插入图片描述
然后对encryptedString算法部分进行分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
确定算法加密部分就是该JS部分
一共只有四百多行,我选择全扣JS
结果测试
在这里插入图片描述

2. 多层嵌套加密案例分析

  • 逆向目标:微流云平台登录

分析目标,进行抓包,发现有两个地址需要进行分析
在这里插入图片描述
进行检查分析发现, 地址Token里面有携带参数 地址code返回公钥和item2参数
在这里插入图片描述
在这里插入图片描述
对Token进行分析,从启动器中直接进入登陆
直接一眼看到加密部分
下断点进行调试分析
在这里插入图片描述
var encrypt = new JSEncrypt();
encrypt.setPublicKey(pub);
var encrypted = encrypt.encrypt(pubCode + sha512(password));
为我们需要进行逆向的部分,很明显,password进行sha512加密之后,在进行RSA加密
对其进行逆向分析即可
拉动滑块,获取后台公钥 item1 和带有时间的item2
进行传入
结果测试
在这里插入图片描述

总结流程笔记:

https://api.wei-liu.com/api/v1/Token/code
item1: “-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo0nnZ/9wVN7HV/VeepE3\r\nIVAlAT6n1fmkXrHxbA08Olv+nYp7QlTW3heOEsOWTEMKRcYU1xAIMwt7pZ+qbyFD\r\nitnHkQUqneYs6PKeK2nDxGXR4MIRUz/MFJ4I3QRzmmklFPkJpfxnL0HnwNHw0fm4\r\nuX3GD9qxEcVsqSdhQMvgrW7gFQMD9tSiaXflgyQv1CZjCPNW2xSpWVoFl0+ODpFT\r\nsEmEt+uRiBD1ZVJnTVTCI0txqFLzFw/JwhUcUgflFRovtkcXTU+8aUCtnAAW019U\r\n5Anw6S4S6Ct2PTO0ZFwRNgjboRmT/0x/zdUfn/h6otQSllRfdqF1RVG4HoDf1U0s\r\neQIDAQAB\r\n-----END
PUBLIC KEY-----”
item2: “fcb20f51535b41179e2facaa4c7147df”

对JS进行分析 确认分析位置

var encrypt = new JSEncrypt(); encrypt.setPublicKey(pub); var
encrypted = encrypt.encrypt(pubCode + sha512(password));

基本上来说,可以确认,item1为公钥文件 后分析JS得到,pubcode为item2传入的参数 即这两个参数为后端返回的

发现该案例为多层嵌套加密 sha512+RSA加密

写在最后:
本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步.如有需要代码和讲解交流,可以加本人微信18847868809

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值