Python还原CryptoJs_AES_CBC模式_js逆向学习

Python还原CryptoJs_AES_CBC模式_js逆向学习

2023年7月7日发(作者:)

Python还原CryptoJs_AES_CBC模式_js逆向学习Python_CryptoJs_js逆向破解⼀、前⾔1、Redeme如果对AES加密解密了解的话,可以跳过⽬录⼆,直接看⽬录三⽬录四实例操作;本博⽂主要是对js⾥⾯CryptoJS进⾏逆向,并⽤python进⾏还原实现,只⽤于js逆向交流学习⼆、对称加密解密AES1、对称加密与⾮对称加密对称加密:加密和解密时使⽤同⼀个密钥,加密速度⾮常快,适合经常发送数据的场合;缺点是密钥的传输⽐较⿇烦;加密_密钥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下去,终于发现了加密的关键函数,经过加密后就是加密后的请求参数,在这⾥先加个断点,然后我们继续往下调试,稍后再研究这个函数内部调⽤的是什么~ = _encrypt(ify(l))(5)解密函数的发现:当调试到这⾥的时候,我发现响应内容被解密了,这个就是解密后的内容; = _decrypt()(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 = (e), l = (l), t(l, e, { mode: , padding: 7, iv: e }).toString()}var decrypt_req = function(e, l) { e = (e); var a = t(l, e, { mode: , padding: 7, iv: e }); return ify(a).toString()}// CBC模式加密(encrypt_req("8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":94}'));// CBC模式解密(decrypt_req("8c18266c4e8fa5de", '7zHGSW218ARpzbHHsA90NuWHufnCLJo94vGad3zzkANQ3sFIWhHY6pDLzelv9XUO'));四、通过Python还原CryptoJS1、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 pycryptodomefrom import AESimport base64from g import padimport jsondef aes_cbc_encrypt_text(decrypt_text: str, key: str, iv: str) -> str: """ 加密AES_CBC的明⽂ :param decrypt_text: 明⽂ :param key: 密钥 :param iv: 密钥偏移量 :return: 密⽂ """ aes2 = (('utf-8'), _CBC, ('utf-8')) encrypt_text = t(pad(decrypt_('utf-8'), _size, style='pkcs7')) encrypt_text = str(bytes(encrypt_text), encoding='utf-8').replace("n", "") return encrypt_textdef aes_cbc_decrypt_js_text(encrypt_text: str, key: str, iv: str) -> str: """ 解密AES_CBC的密⽂ :param encrypt_text: 密⽂ :param key: 密钥 :param iv: 密钥偏移量 :return:解密后的数据 example_url_learn_js_base64: aHR0cDovL2NyZWRpdC5jdXN0b21zLmdvdi5jbi8= """ decode_encrypt_text = base64.b64decode(encrypt_text) #

初始化AES对象时传⼊与加密时的相同的密钥、加密模式和iv aes2 = (('utf-8'), _CBC, ('utf-8')) decrypt_text = t(decode_encrypt_text).decode('utf8') decrypt_text = decrypt_e(b'x00'.decode(), "").replace("", "") return decrypt_text"""由于只是⽤于学习,原⽹站的key和iv我已保密, 以下脚本并不能直接运⾏"""# AES_CBC加密模式decrypt_str = '{"Type":0,"page":3,"expire":94}'key_str = "55****"iv_str = "55****"encrypt_str = aes_cbc_encrypt_text(decrypt_str, key_str, iv_str)print(encrypt_str)# AES_CBC解密模式encrypt_str = "待解密字符串, 需⾃⼰替换,为保证原⽹站安全,暂不放"key_str = "0a1******"iv_str = "0a1******"decrypt_str = aes_cbc_decrypt_js_text(encrypt_str, key_str, iv_str)print((decrypt_str)['list'])

发布者:admin,转转请注明出处:http://www.yc00.com/web/1688683582a162206.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信