des.py 1.72 KB
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