2017-05-11 9 views
0
def get_encrypt_param(params): 
    _salt = b"\xA9\x9B\xC8\x32\x56\x35\xE3\x03" 
    _iterations = 2 
    data = [] 
    for i in params: 
     data.append("{}={}".format(i, params[i])) 
    str_param = "&".join(data) 
    print(str_param) 
    padding = 8 - len(str_param) % 8 
    str_param += chr(padding) * padding 
    print(str_param) 
    hasher = MD5.new() 
    hasher.update(apikey.encode()) 
    hasher.update(_salt) 
    result = hasher.digest() 
    for i in range(1, _iterations): 
     hasher = MD5.new() 
     hasher.update(result) 
     result = hasher.digest() 
    encoder = DES.new(result[:8], DES.MODE_CBC, result[8:16]) 

    encrypted = encoder.encrypt(str_param) 
    encryptParam = base64.b64encode(encrypted) 
    return res 

I 입력 한자,에 ValueError : 입력 스트링의 길이는 8의 배수 여야 때 파이썬 입력 UTF-8 3.6

params = { 
    "name": u"张三", 
    "idCard": "123456199001011233", 
    "mobile": "13800138000" 
} 
print(get_encrypt_param(params)) 

ValueError를 언제 : 입력 문자열이 8의 배수이어야한다 길이. 하지만 영어 문자를 입력해도 괜찮습니다. 도와주세요. 내가하려고 :

for i in params: 
    data.append("{}={}".format(i, params[i].encode("utf-8"))) 

그러나 str_param은 다음과 같습니다

mobile=b'13800138000'&name=b'\xe5\xbc\xa0\xe4\xb8\x89'&cardno=b'123456199001011233' 

그것의 바이트와 다른 사람들이 해독 PARAMS을 인식 할 수 없습니다.

답변

0

사용하는 다른 패키지 : pyDes

코드 :.

import pyDes 


def get_encrypt_param(params): 
    """对参数进行加密封装""" 
    _salt = b"\xA9\x9B\xC8\x32\x56\x35\xE3\x03" 
    _iterations = 2 
    data = [] 
    for i in params: 
     data.append("{}={}".format(i, params[i])) 
    str_param = "&".join(data) 

    hasher = MD5.new() 
    hasher.update(apikey.encode()) 
    hasher.update(_salt) 
    result = hasher.digest() 
    for i in range(1, _iterations): 
     hasher = MD5.new() 
     hasher.update(result) 
     result = hasher.digest() 

    despy = pyDes.des(result[:8], pyDes.CBC, padmode=pyDes.PAD_PKCS5, IV=result[8:16]) 
    encrypt_data = despy.encrypt(str_param.encode()) 
    return base64.b64encode(encrypt_data) 

은 그래서 당신은 인코딩없이 한자를 암호화 할 수 있습니다 ("UTF-8)