起因
抓包某网站,发现数据是加密的。
网站的json数据
然后找到加密具体代码为:
加密代码
那么加密代码我是怎么找到的呢?
image.png
把代码往右拽拽就能看到,有中文。hhhh
言归正传:分析
你一百度解密方法
然后再去搜python版的CryptoJS,就会各种让你装
这里使用一个包叫:
这里麻烦的有两点:
- 不管是python的pycrypto中的DES3或者pyDes的triple_des都没有PKCS7这种加密方式。
- 密钥很麻烦,放上去长度不对。
先看代码后看解释
我图上的代码改完就是如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from pyDes import * import pyDes import base64 def toHex(txt): return ''.join(["%02x" % x for x in txt]).strip() def do_3des(): mi="秘文太长不放了" # 我这里密文是经过base64加密的,需要解密,你的密文如果没经过base64加密,不需要这一步 result = base64.b64decode(mi) k = triple_des(b"fad6dd67a2422fd699edc0de", ECB, pad=None, padmode=PAD_PKCS5) d = k.decrypt(result) print(result) print ("Decrypted: %r" % d) print(toHex(d)) do_3des() |
image.png
这里的密钥是怎么出来的?
image.png
打断点调试页面,然后调用该函数就知道了。
注意
密钥长度
然后细心的就会发现:截图里的和代码里的不太一样,截图里的长。
那是因为密钥只支持16位和24位的,
md5生成的太长了,32位呢。删掉后面8个就是24位了。
那么如果不够24位呢?
补上0就可以了,但不是直接加0,这个0指的是ASCII码值0 ,' '
比如:
1 | k = triple_des(b"test12345678901234 ", ECB, pad=None, padmode=PAD_PKCS5) |
PAD_PKCS5和PAD_PKCS7
发现我用的还是PAD_PKCS5,
根据这篇回答的解释是:
PKCS#5 可以说是 PKCS#7的一个子集。 前者是针对8字节块padding,后者把padding的块大小放宽到255字节
所有现在这样就行,解决!手工!