惠美四川-请求数据加解密
请求与响应的数据被加密:

其中data加密流程:
- 生成16为长度的随机字符串作为密钥(key)
- 使用SM4 ECB模式加密数据
signData并不算是请求签名,只是使用SM3对SM4的密钥进行加密。若固定SM4的密钥,signData的值可以重复使用。
调试过程:



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
| def random_str(n): l = [] for i in range(n): l.append(random.choice(string.ascii_letters)) return ''.join(l)
def get_sign(prvtCtrctId, timestamp, nonce): salt = 'b85E3G6f2hC9tD59' s = prvtCtrctId + str(timestamp) + nonce + salt data = s.encode() return base64.b64encode(hashlib.sha256(data).digest()).decode()
def encrypt(d): s = json.dumps(d) sm4_key = b'1234567890123456' crypt_sm4 = CryptSM4() crypt_sm4.set_key(sm4_key, SM4_ENCRYPT) encrypt_value = crypt_sm4.crypt_ecb(s.encode()) return base64.b64encode(encrypt_value).decode()
def decrypt(s): sm4_key = b'1234567890123456' crypt_sm4 = CryptSM4() crypt_sm4.set_key(sm4_key, SM4_DECRYPT) data = base64.b64decode(s) decrypt_value = crypt_sm4.crypt_ecb(data) return decrypt_value.decode()
def test(): url = "https://scqy.ccb.com/prod-api/public/buss/all" cookie = 'ccbcustomid=bf70c8bf0e52bd0bmnZiRpQfucLPqgM6Xcrk1679470962527L3CTimvBdh16rYTtJhhT463b28ceff47fde09ff1bba710e51c87; zc_mcpcxkuz9d3f6bey=%7B%22sid%22%3A%20%221680599914149_563095963627632%22%2C%22updated%22%3A%201680599914149%2C%22info%22%3A%201680599913116%2C%22superProperty%22%3A%20%22%7B%5C%22app_id%5C%22%3A%20%5C%22mcpcxkuz9d3f6bey%5C%22%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22just998.com%22%7D; dsloginTypeTips=7; zc_did=%7B%22did%22%3A%20%221874b8f929912cf-02e2f57b14ecb7-26031851-384000-1874b8f929a15e7%22%7D; zc_nmccadi6bv8x90wg=%7B%22sid%22%3A%20%221700114251999_519372677547505%22%2C%22updated%22%3A%201700114252008%2C%22info%22%3A%201700114252000%2C%22superProperty%22%3A%20%22%7B%5C%22app_name%5C%22%3A%20%5C%22%E5%BB%BA%E8%A1%8C%E7%94%9F%E6%B4%BB%5C%22%2C%5C%22app_id%5C%22%3A%20%5C%22nmccadi6bv8x90wg%5C%22%2C%5C%22user_id%5C%22%3A%20%5C%22%5C%22%2C%5C%22mobile_no%5C%22%3A%20%5C%22%5C%22%2C%5C%22cst_id%5C%22%3A%20%5C%22%5C%22%2C%5C%22nick_name%5C%22%3A%20%5C%22%5C%22%2C%5C%22country_name%5C%22%3A%20%5C%22%E4%B8%AD%E5%9B%BD%5C%22%2C%5C%22province%5C%22%3A%20%5C%22%5C%22%2C%5C%22city%5C%22%3A%20%5C%22%5C%22%2C%5C%22latitude%5C%22%3A%20%5C%22%5C%22%2C%5C%22longitude%5C%22%3A%20%5C%22%5C%22%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22%22%7D; zg_did=%7B%22did%22%3A%20%22187084528f31183-04f4ac030c8cca-26031851-384000-187084528f414f7%22%7D; zg_002714230c264ddda7d94375a4d23e40=%7B%22sid%22%3A%201701927946204%2C%22updated%22%3A%201701927946204%2C%22info%22%3A%201701927946205%2C%22superProperty%22%3A%20%22%7B%5C%22app_id%5C%22%3A%20%5C%22ccvcag5mqy1f7ie2%5C%22%2C%5C%22app_name%5C%22%3A%20%5C%22%E7%8F%AD%E5%85%8B%5C%22%2C%5C%22user_id%5C%22%3A%20%5C%223e603926-4e5c-4128-bf18-485db1317b59%5C%22%2C%5C%22screen_height%5C%22%3A%201440%2C%5C%22screen_width%5C%22%3A%202560%7D%22%2C%22platform%22%3A%20%22%7B%7D%22%2C%22utm%22%3A%20%22%7B%7D%22%2C%22referrerDomain%22%3A%20%22www.ccb.com%22%2C%22zs%22%3A%200%2C%22sc%22%3A%200%2C%22firstScreen%22%3A%201701927946204%7D; cityName=%E5%8C%97%E4%BA%AC%E5%B8%82; cityCode=110000; bankName=%E5%8C%97%E4%BA%AC%E5%B8%82%E5%88%86%E8%A1%8C; bankCode=110000000' headers = {"Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090217) XWEB/8555 Flue", "Referer": "https://scqy.ccb.com/hmscmob/pfin/gmyl", "Cookie": cookie } prvtCtrctId = '9381b0914281ba3f2cb5e26c4fea558b8c3603f50cb47d554f7bada45410d69d' timestamp = int(time.time()*1000) nonce = random_str(11) sign_str = get_sign(prvtCtrctId, timestamp, nonce) req_data = {"bussStcd":"00","prvtCtrctId":prvtCtrctId,"timestamp":timestamp,"nonce":nonce ,"sign":sign_str} req_json={"data": encrypt(req_data), "signData": "aBtE+ZPh78z78O3ttB690Q0wCXeHX0FcNMCygmqFAFmyf/jIbmj9R08obh1/8KAQvHSvmsX7tM9cH+1CEVjyJAx6axu2qmHERC2pVdWgk9nrxmWehZLRhP1FrlkyuxU3hJ7yweTqEhe59HDDZT8No4oF0M2DruUc71FaN7zh9W0="} http = requests.post(url, headers=headers, json=req_json) resp = http.text print(decrypt(resp))
|