那么它的加密算法是怎样的呢?
我们在刚才的那个JS代码里面搜索 params 这个参数
可以发现这里有请求参数的两个key值
它们俩的值分别为 bWv0x.encText,bWv0x.encSecKey,
而
bWv0x = window.asrsea(JSON.stringify(i0x), bsK6E(["流泪", "强"]), bsK6E(XR7K.md), bsK6E(["爱心", "女孩", "惊恐", "大笑"]));
这个window.asrsea()是一个函数,里面四个是参数,bsK6E()也是一个函数,但是里面的参数都是固定的。
而bsK6E()就是返回输入的字符串数组中字符串(key)对应的value值,比如bsK6E(["流泪", "强"])="010001"
我们ctrl+F查找asrsea这个函数的定义,可以发现在如下这里
通过分析上面的a、b、c、d函数,可以发现a函数其实就是取随机长度的字符串,b函数小编有点看不懂,猜想应该是加密操作吧!c函数小编看不懂是什么操作,但是小编觉得如果传进去的三个参数如果是固定的,那么它的返回值应该也是固定的,而encSecKey的值等于它的返回值,也就是说encSecKey可以是固定的。而i值是随机生成的,那么怎样才能把它取为固定的呢?其实就是取它的一个返回值即可,让它代表所有。之后看b函数,小编的确看不懂,于是百度了一下。
发现如果要用python代码实现同样的效果也是可以的,但是需要下载一个包,具体在cmd
上输入 pip install pycryptodome
即可,具体加密算法读者可以看看这位博主这篇文章:python—AES加密
小编改了一下, def to_16(data): len1=16-len(data)%16 data+=chr(len1)*len1 return data def encryption(data,key): iv = \'0102030405060708\' aes = AES.new(key=key.encode(\'utf-8\'),IV=iv.encode(\'utf-8\'),mode=AES.MODE_CBC) data1 = to_16(data) bs=aes.encrypt(data1.encode(\'utf-8\')) return str(b64encode(bs),\'utf-8\') def get_enc(data): param4 = \'0CoJUm6Qyw8W8jud\' #enc=\'NA5SxhePf6dxIxX7\' #enc=\'GLvjERPvSFUw6EVQ\' enc=\'g4PXsCuqYE6icH3R\' first=encryption(data,param4) return encryption(first,enc)