Python还原CryptoJs_AES_CBC模式_js逆向学习
Python_CryptoJs_js逆向破解
⼀、前⾔
1、Redeme
如果对AES加密解密了解的话,可以跳过⽬录⼆,直接看⽬录三⽬录四实例操作;
本博⽂主要是对js⾥⾯CryptoJS进⾏逆向,并⽤python进⾏还原实现,只⽤于js逆向交流学习
⼆、对称加密解密AES
1、对称加密与⾮对称加密
对称加密:加密和解密时使⽤同⼀个密钥,加密速度⾮常快,适合经常发送数据的场合;缺点是密钥的传输⽐较⿇烦;
加密_密钥K
解密_密钥K
⾮对称加密:加密和解密时使⽤不同密钥,是⽤数学上的难解问题构造的,通常加密解密的速度⽐较慢,适合偶尔发送数据的场合,优点是密钥传输⽅便;常见的⾮对称加密算法为RSA、ECC和EIGamal;
加密_密钥A _公钥
解密_密钥B_私钥
2、AES对称加密介绍
AES(Advanced Encryption Standard),是美国联邦政府采⽤的⼀种⾼级加密标准,这个标准⽤来替代原先的DES,也是最常见的对称加密算法;
AES只有⼀个密钥key,其加密与解密需要双⽅确定好key,且密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度,分别对应了不同的算法;
密钥越长,安全性越⾼,但加解密花费时间也越长,默认的是16字节(AES-128),其安全性完全够⽤;
AES只是个基本算法,实现AES有⼏种模式,主要有ECB、CBC、CFB、OFB、CTR:
3、实现AES的4种模式
ECB模式(电⼦密码本模式:Electronic codebook):ECB是最简单的块密码加密模式,加密前根据加密块⼤⼩(如AES为128位)分成若⼲块,之后将每块使⽤相同的密钥单独加密,解密同理
CBC模式(密码分组链接:Cipher-block chaining):CBC模式对于每个待加密的密码块在加密前会先与前⼀个密码块的密⽂异或然后再⽤加密器加密。第⼀个明⽂块与⼀个叫初始化向量的数据块异或
CFB模式(密⽂反馈:Cipher feedback):与ECB和CBC模式只能够加密块数据不同,CFB能够将块密⽂(Block Cipher)转换为流密⽂(Stream Cipher)
OFB模式(输出反馈:Output feedback):OFB是先⽤块加密器⽣成密钥流(Keystream),然后再将密钥流与明⽂流异或得到密⽂流,解密是先⽤块加密器⽣成密钥流,再将密钥流与密⽂流异或得到明⽂,由于异或操作的对称性所以加密和解密的流程是完全⼀样的
三、⽹站案例分析
1、准备⼯作
⽹址源:由于只是⽤于学习记录,⽹址源就不提供了
chrome浏览器开发者⼯具分析
2、分析js流程步骤
(1) ⽹站描述:每次翻页的post请求参数与响应页都已加密, 如下图,那咱们今天就是如何看前端是如何⽤js加密解密?
(2)调试⼊⼝:如果通过全局搜索不到加密,可以通过Initiator(我理解为js的调⽤栈,越下⾯是js脚本调⽤的最初,最上⾯是末尾),尝试从其中⼀个调⽤栈点击去加断点,然后翻页debugger查看js是如何运⾏的
(3)开始调试:点进去后,左下⾓花括号格式化下{}, 在定义变量的位置加个断点,如果直接在点击去的位置加断点,翻页可能⽆法中断;然后翻页,会在断点处中断;接着调试,隐约觉得a这个参数是原始请求的post参数,接着继续调试;注意:右上⾓⼏个都是调试的,如果⼀直死循环卡在某个函数调试中,记得点击向上的箭头跳出函数(可连续点多次)
(4)加密函数的发现:就这么debug下去,终于发现了加密的关键函数,经过加密后e.data就是加密后的请求参数,在这⾥先加个断点,然后我们继续往下调试,稍后再研究这个函数内部调⽤的是什么~
e.data = o.default.aes_encrypt(JSON.stringify(l))
(5)解密函数的发现:当调试到这⾥的时候,我发现响应内容被解密了,这个e.data就是解密后的内容;
e.data = o.default.aes_decrypt(e.data)
(6)接下来我们来看具体内部加密解密是怎么执⾏的,接着调试调试,其实js加密解密是⽤了AES的CBC模式加密,采⽤Pkcs7填充,在这个调试中,你需要通过调试去密钥key和偏移量,然后就可以还原js函数了
3、本地运⾏前端抠出来的CryptoJS脚本
前端定义的n其实就是CryptoJS我并没有直接复制,⽽是通过本地的node直接导⼊CryptoJS库,此时只需要将关键代码扣出来即可;
本地需安装node环境,然后再安装crypto-js库: npm install crypto-js
重要参数:key是密钥;iv是密钥偏移量;未指定模式默认CBC模式;padding是⽤来填充数据的;
var CryptoJS =require("crypto-js");
var encrypt_req=function(e, l){
return e = Utf8.parse(e),
l = Utf8.parse(l),
pt(l, e,{
mode: de.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: e
js脚本开发}).toString()
}
var decrypt_req=function(e, l){
e = Utf8.parse(e);
var a = CryptoJS.AES.decrypt(l, e,{
mode: de.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: e
});
Utf8.stringify(a).toString()
}
// CBC模式加密
console.log(encrypt_req("8c18266c4e8fa5de",'{"Type":0,"page":3,"expire":1596461032894}'));
// CBC模式解密
console.log(decrypt_req("8c18266c4e8fa5de",'7zHGSW218ARpzbHHsA90NuWHufnCLJo94vGad3zzkANQ3sFIWhHY6pDLzelv9XUO'));
四、通过Python还原CryptoJS
1、AES_CBC模式参数
key:加密的时候⽤秘钥,解密的时候需要同样的秘钥才能解出来,必须是16位字节或者24位字节或者32位字节
字符串:加密或解密的参数,字节长度需要是16位的倍数
模式:aes 加密常⽤的有 ECB 和 CBC 模式等
iv:偏移量 ,这个参数在 ECB 模式下不需要,在 CBC 模式下需要。
2、Python模拟上⾯的CryptoJS脚本
python调⽤js三种⽅式:要么还原js;要么通过execjs脚本执⾏,要么通过node布服务执⾏;
python安装Cryptojs的库:pip install pycryptodome

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。