des.py
1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from Crypto.Cipher import DES3
from Crypto.Hash import MD5
import struct
import base64
import codecs
def mds_hash(target_str):
h = MD5.new()
h.update(target_str.encode('utf-8'))
return h.digest()
def des_pad(data):
data = data.encode('utf-8')
e = len(data)
x = (e + 4) % 8
y = 0 if x == 0 else 8 - x
size_byte = struct.pack('>I', e)
result_byte = list(range(len(size_byte) + e + y))
result_byte[0:4] = size_byte
result_byte[4:4 + e] = data
for i in range(0, y):
result_byte[e + 4 + i] = 0
result_str = bytearray(result_byte).decode('utf-8')
return result_str
# DES3加密数据
def encode_des(to_encode_str, des_key):
"""
DES3加密数据
Args:
to_encode_str(str): 要被加密的原字符串,这里的字符串需要被des_pad一下
des_key(str): 加密的key
Returns:
"""
key = mds_hash(des_key)
des3 = DES3.new(key, DES3.MODE_ECB)
data = des3.encrypt(des_pad(to_encode_str))
data = codecs.encode(data, 'hex')
return data
def un_des_pad(data):
# print(data)
# result_byte = data[0:4]
# print(result_byte)
# e = struct.unpack('>I', result_byte)[0]
# x = (e + 4) % 8
# y = 0 if x == 0 else 8 - x
# print(y)
# return data[:-4] if y == 0 else data[:-y]
offset = data[-1]
return data[:-offset]
def decode_des(to_decode_str, des_key):
"""
解密数据
Args:
to_decode_str(str): 要解密的原字符串
des_key(str): 解密的key
Returns:
"""
key = mds_hash(des_key)
des3 = DES3.new(key, DES3.MODE_ECB)
param = base64.b64decode(to_decode_str)
param = des3.decrypt(param)
param = un_des_pad(param).decode('utf-8')
return param