逆向日期:2024.02.07
使用工具:Node.js
加密方法:AES
文章全程已做去敏处理!!! 【需要做的可联系我】
可使用AES进行解密处理(直接解密即可):在线AES加解密工具
1、打开某某网站(请使用文章开头的AES在线工具解密):4ChonmNI5Lkh3tjTAa6Z06mJWyT4q4j0x86XqcGv7O42h1fyOjN7aJnHZoBMGMVj
2、随便输入账号,然后图片验证码输入后,点击获取验证码,可在控制台网络面板查看
3、仍然一样,全局搜索,幺幺嗨,这么简单就找到了,他这里是将一个字典转为了字符串在进行的加密,,首先我们要先模拟生成他字典中的内容,图片验证码可以ocr识别传进去,手机号可以先写固定,时间戳直接生成,【sessionId】这个玩意不知道是啥,我们直接去翻源代码
4、哎幺,我脑子最近有点傻,忘了先去分析【sessionId】值,才发现【sessionId】是用时间组成的,别问为什么,就因为脑子有点傻,在源码上浪费时间找了半天,直接看代码
5、按照网站的方法,【f】的参数我们也已经解决了,接下来直接进入【newEncrypt】,看看这么加密的
6、找到了,好家伙AES加密,把此段代码直接复制,放到本地,然后调用本地的库。我们只需略微修改即可
7、然后我们先测试一下,在控制台和本地都加密一下【1】,看结果是不是一样,,可以看到是一样的,接下来就直接模拟
8、加密完成后,可以通过测位数来检验你的加密是否有问题,下面可以看到,无论是我本地加密的结果,还是源网站的结果,位数都是一样的,说们我们这个就成功逆开了
【附上源码】
npm install crypto-js --save // 安装本地包
// 安装 crypto 加解密包
// npm install crypto-js --save
// 对称加密算法 的结果将会是唯一性,不会变更
const CryptoJS = require('crypto-js')
// 随机生成 16位
getAesKey = function(l) {
l = l || 32;
for (var n = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", t = n.length, e = "", a = 0; a < l; a++)
e += n.charAt(Math.floor(Math.random() * t));
return e
}
var getAesKeys = getAesKey()
newEncrypt = function(l) {
var n = CryptoJS.enc.Utf8.parse(getAesKeys) // 源网站的 getAesKeys 值是随机16位 刷新网站后,此处的值也会刷新
, t = CryptoJS.enc.Utf8.parse(getAesKeys) // 源网站的 getAesKeys 值是随机16位 刷新网站后,此处的值也会刷新
, e = CryptoJS.enc.Utf8.parse(l)
, a = CryptoJS.AES.encrypt(e, n, {
iv: t,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Base64.stringify(a.ciphertext)
}
function times(){
// ISO 8601标准 UTC 时间
var currentDate = new Date();
// 年
var year = currentDate.getFullYear();
// 月
var month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始,需要加1
// 日
var day = currentDate.getDate().toString().padStart(2, '0');
// 时
var hours = currentDate.getHours().toString().padStart(2, '0');
// 分
var minutes = currentDate.getMinutes().toString().padStart(2, '0');
// 秒
var seconds = currentDate.getSeconds().toString().padStart(2, '0');
// 进行组合
sessionId = year.toString().substring(4, 2)+month+day+hours+minutes+seconds+Math.floor(Math.random() * 100000000).toString().padStart(8, '0');
return sessionId
}
f = {
"body": {
"name": "18000000000", // 账号
"code": "yutuAK", // 图片验证码
"sessionId": times(),
"option": "LOGIN"
},
"head": {
"userCode": null,
"channelCode": "101",
"transTime": new Date().getTime(), // 时间戳
"transToken": "",
"customerId": null,
"transSerialNumber": ""
}
}
G = newEncrypt(JSON.stringify(f))
console.log(G)
console.log(G.length)