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