python版的TripleDES (DES3) padding
2019-12-04 本文已影响0人
萌木盖
起因
抓包某网站,发现数据是加密的。
加密代码
那么加密代码我是怎么找到的呢?
image.png
把代码往右拽拽就能看到,有中文。hhhh
言归正传:分析
你一百度解密方法TripleDES
就会知道这个方法是 CryptoJS 加密库里的。
然后再去搜python版的CryptoJS,就会各种让你装Crypto
、pycryptodome
、pycryptodomex
、之类的。然而并不用。
这里使用一个包叫:pyDes
这里麻烦的有两点:
- 不管是python的pycrypto中的DES3或者pyDes的triple_des都没有PKCS7这种加密方式。
- 密钥很麻烦,放上去长度不对。
先看代码后看解释
我图上的代码改完就是如下:
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 ,'\0'
比如:
k = triple_des(b"test12345678901234\0\0\0\0\0\0", ECB, pad=None, padmode=PAD_PKCS5)
PAD_PKCS5和PAD_PKCS7
发现我用的还是PAD_PKCS5,
根据这篇回答的解释是:
PKCS#5 可以说是 PKCS#7的一个子集。 前者是针对8字节块padding,后者把padding的块大小放宽到255字节
所有现在这样就行,解决!手工!