python 中文加密不通过,但是英文可以

相关资料:
一、官方规范:传输协议:暂时只支持HTTP协议进行通信数据传输格式:所有接口暂只支持json消息格式编码格式:UTF-8(交互编码格式统一用UTF-8,避免传递中文数据出现乱码)
二、摘要验证失败的官方提供的解决办法:
1、平台采用MD5+BASE64加密,MD5加密后的数据是全小写的; 2、以下为不同方式下对“1”进行加密的结果,请比对是否一致;(不一致则加密方法可能有误) MD5对1加密结果 --- c4ca4238a0b923820dcc509a6f75849b BASE64对1加密结果 --- YzRjYTQyMzhhMGI5MjM4MjBkY2M1MDlhNmY3NTg0OWI= BASE64(MD5)对1解密结果 ---MjhjOGVkZGUzZDYxYTA0MTE1MTFkM2IxODY2ZjA2MzY= 3、参数传递采用http post请求,请求消息头设置:("Content-Type","application/x-www-form-urlencoded;charset=utf-8"); 4、在 我的对接进度-报文校验 窗口中输入请求报文,生成时间戳和签名,检查签名和本地生产上的签名是否一致; 5、对于params参数中有特殊字符的需要进行url转译; 6、检查调用时appkey是否和平台存在差异。 您可前往 对接文档-规范说明-APISDK说明及示例 查看详情。


# -!- coding: utf-8 -!-
# !/usr/bin/python3

import base64
ndard-order/newTraceQuery.action?companyCode=EWBHMJJWJG&params=%s&digest=%s&timestamp=%s' % (
    json.dumps(params_new_track_query, ensure_ascii=False), digest(params_new_track_query), timestamp_13)

response = requests.post(url.encode(), headers=headers)
response1 = requests.post(url1.encode(), headers=headers)
if __name__ == '__main__':
    print(response.json())
    print(response1.json())

以上代码打印结果:


加密参数为: {"logisticCompanyID": "DEPPON", "province": "湖北省", "city": "武汉市", "county": "武昌区", "address": "南湖李纸路72号", "matchType": "2"}64510296bc2ddf30bd45*******9cf7d1660563919739
Mjc5MjcxNTQ0NzRjYzdjNTkyNjg2ZDFjNzJlOWE2ZjE=
加密参数为: {"mailNo": "479000244251"}64510296bc2ddf30bd******d9cf7d1660563919739
NzgwOGE3MmEwNGFkY2IzNmYwYzNiNWZhNjg5ZGY0ZGE=
这是中文出错的结果:
{'result': 'false', 'reason': '摘要验证失败', 'resultCode': '2002', 'uniquerRequestNumber': '36191221806927382'}
这是英文正常的结果:
{'result': 'true', 'reason': '', 'resultCode': '1000', 'responseParam': {'trace_list': [{'city': '**市(测试)', 'description': '正常签收,签收人类型:本人/同事/门卫 等', 'site': '【***】营业部', 'status': 'SIGNED', 'time': '2021-09-24 13:44:26'}, {'city': '**市(测试)', 'description': '此货已滞留,与客户预约改日派送', 'site': '【***】营业部', 'status': 'ERROR', 'time': '2021-09-24 16:44:26'}, {'city': '**市(测试)', 'description': '拒绝签收:原因', 'site': '【***】营业部', 'status': 'FAILED', 'time': '2021-09-24 13:44:26'}, {'city': '**市(测试)', 'description': '派送中,派送人:**,派送人电话:***********', 'site': '【***】营业部', 'status': 'SENT_SCAN', 'time': '2021-09-24 10:44:26'}, {'city': '**市(测试)', 'description': '货物已到达【***营业部】部门', 'site': '【***】营业部', 'status': 'ARRIVAL', 'time': '2021-09-24 07:44:26'}, {'city': '**市(测试)', 'description': '运输中,离开【上海转运中心】,下一站【***营业部】(出发到达对应多个)', 'site': '****转运中心/营业部/枢纽中心', 'status': 'DEPARTURE', 'time': '2021-09-24 04:44:26'}, {'city': '**市(测试)', 'description': '您的订单已被收件员揽收,【上海***营业部】库存中', 'site': '上海转运中心/营业部/枢纽中心', 'status': 'GOT', 'time': '2021-09-24 02:44:26'}], 'tracking_number': '479000244251'}, 'uniquerRequestNumber': '36198464157138534'}

进程已结束,退出代码0


请问如何解决中文加密的问题?

楼主,中文的要加urlencode才行,麻烦加一下urlencode(params), 引用方法from urllib.parse import urlencode,刚回到家,看来你是有新进展了啊,胜利在望,加油

用这个。这是别人的。


import os
import hashlib
import base64
import time
 
 
def mine():
 
    print("-------------------------------------批量加密工具-------------------------------------")
    print("关注博主不迷路!!!\nhttps://jiangongfang.blog.csdn.net/\nhttps://blog.51cto.com/u_15449377")
    print("使用告知:\n【加密后的文件后缀会多出DATAAES-AI,是为了方便软件检测,请勿乱改加密后的后缀名】")
    print("【要加密或解密的文件命名不可有“./\”字符,否则会出错】")
    print("【此程序的密码可以使用中文、英文、字符串、数字进行加密,可使用中文和中文字符串】")
    print("【重点要注意::程序一旦开始加密或解密,中途不可退出,否则会丢失数据,直到运行完毕方可退出】")
    print("-------------------------------------批量加密工具-------------------------------------\n")
    DATA_1 = input('请输入要加密或解密的文件路径(不含文件):')
    if DATA_1 == '':
        print('程序不得为空,请重新输入!!!')
        time.sleep(2)
        os.system('cls')
        mine()
    else:
        pass
 
    DATA_1 = DATA_1.replace("\\", "/")  # 替换
    if os.path.isdir(DATA_1) == True:
        pass
    else:
        print('路径错误或文件夹不存在,请重新输入!!!')
        time.sleep(2)
        os.system('cls')
        mine()
 
    str = input('请输入最高可加密的内存MB:')
    # 判断是否填写
    if int(str) == '':
        print('错误,请重新输入!!!')
        time.sleep(2)
        os.system('cls')
        mine()
    else:
        pass
 
    PassWord_1 = input('请输入要加密或解密的密码(密码):')
    # 判断是否填写
    if PassWord_1 == '':
        print('密码不得为空,请重新输入!!!')
        time.sleep(2)
        os.system('cls')
        mine()
    else:
        pass
 
 
    def iterbrowse(path):
        for home, dirs, files in os.walk(path):
            for filename in files:
                yield os.path.join(home, filename)
 
 
    for fullname in iterbrowse(DATA_1):
        NAME = fullname
        NAME = NAME.replace("\\", "/")  # 替换
 
        def get_FileSize(filePath):
            fsize = os.path.getsize(filePath)
            fsize = fsize / float(1024 * 1024)
            size = "%.0f" % fsize
            if int(size) >= int(str):
                print('[-!-]: ',NAME, '\t- - - - 内存过大!!!')
                pass
            else:
                #写入的文件
                if NAME.split(".")[-1][-10:] == 'DATAAES-AI':  # 检测是否是已经加密后的文件,用于检测后缀的DATAAES-AI
                    #解密
                    F = NAME.split(os.path.sep)[0].replace("DATAAES-AI", "")  #去除DATAAES-AI
                    print(f'[-.·J·.-]: ',NAME, '\t- - - - 解密成功!!!')
                else:
                    #加密
                    F = NAME.split(os.path.sep)[0]+"DATAAES-AI"
                    print(f'[+·J·+]: ', NAME, '\t+ + + + 加密成功!!!')
 
 
 
 
                a = open(NAME, "rb")  #读取文件
                b = open(F, "wb")    #写入文件
 
 
 
                #使用MD5进行加密(双层加密)
                hl = hashlib.md5()
                hl.update(PassWord_1.encode(encoding='utf-8'))
                password_list = hl.hexdigest()
                #使用MD5进行加密(双层加密)
                hl.update(password_list.encode(encoding='utf-8'))
                password_list2 = hl.hexdigest()
                password_data = password_list+password_list2
 
 
                #加密
                def Encryption_and_decryption():
                    count = 0  #索引
                    for now in a:
                        for nowByte in now:
                            newByte = nowByte ^ ord(password_data[count % len(password_data)])  #循环遍历出密码的ord值,单个循环
                            count += 1
                            b.write(bytes([newByte]))   #转换
                Encryption_and_decryption()
 
 
 
                a.close()
                b.close()
                os.remove(f'{NAME}')
        get_FileSize(NAME)
    print('操作完成!!!')
    print('正在返回!!!')
    time.sleep(2)
    os.system('cls')
    mine()
mine()