逆向日期: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)