前言
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除
一. 非对称加密简介
- 常见非对称加密算法 RSA、DSA。
- 非对称加密算法私钥由数据接收方持有,不会在网络上传递,保证了密钥的安全。
- 非对称加密算法通常比对称加密算法计算复杂,性能消耗高。
- 非对称加密算法可用于数字签名。
- 常见非对称加密算法 RSA、DSA。
- 非对称加密算法私钥由数据接收方持有,不会在网络上传递,保证了密钥的安全。
- 非对称加密算法通常比对称加密算法计算复杂,性能消耗高。
- 非对称加密算法可用于数字签名。
- 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留。
- 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密
二. 非对称特征
常见JavaScript调试算法
- 搜索关键词 new JSEncrypt(),JSEncrypt 等,一般会使用 JSEncrypt库,会有 new 一个实例对象的操作;
- 搜索关键词 setPublicKey、setKey、setPrivateKey、getPublicKey 等,一般实现的代码里都含有设置密钥的过程。
RSA 的私钥、公钥、明文、密文长度也有一定对应关系,也可以从这方面初步判断:
私钥长度 | 公钥长度 | 明文长度 | 密文长度 |
---|---|---|---|
428 | 128 | 1~53 | 88 |
812 | 216 | 1~117 | 172 |
1588 | 392 | 1~245 | 344 |
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