返回列表 发新帖

某wifi不能钥匙协议

[复制链接]

9

主题

147

回帖

491

积分

初中生

Rank: 3Rank: 3

金币
349
好评
1
信誉
100
发表于 2026-7-29 21:02:16 来自手机  | 显示全部楼层 | 阅读模式  来自 天津

  1. """
  2. 通用加解密与 JWT 刷新模块
  3. 提供三个函数:
  4. - encrypt_request(payload) -> bytes
  5. - decrypt_response(encrypted_data) -> dict
  6. - refresh_jwt(old_token=None) -> str
  7. """

  8. import os
  9. import json
  10. import time
  11. import requests
  12. from Crypto.Cipher import AES
  13. from Crypto.Util.Padding import pad, unpad

  14. # ---------- 固定加密参数 ----------
  15. _AES_KEY = b"W98$9@F9@NlJ6oIwIylrjR2JP8JNa5wt"   # 32 字节
  16. _AES_IV  = b"iijbSYXWrsjQksaS"                  # 16 字节

  17. # ---------- 公共函数 ----------

  18. def encrypt_request(payload: dict) -> bytes:
  19.     """
  20.     将明文字典请求体加密为二进制数据。
  21.     自动添加当前毫秒时间戳(若 payload 中未包含 timestamp)。
  22.     """
  23.     # 深拷贝避免修改原字典
  24.     data = payload.copy()
  25.     # 确保 common 存在且包含 timestamp
  26.     if "common" in data:
  27.         if "timestamp" not in data["common"]:
  28.             data["common"]["timestamp"] = int(time.time() * 1000)
  29.     else:
  30.         # 若无 common,直接在顶层添加 timestamp(兼容非标准用法)
  31.         if "timestamp" not in data:
  32.             data["timestamp"] = int(time.time() * 1000)

  33.     json_str = json.dumps(data, separators=(',', ':'))  # 紧凑格式
  34.     plaintext = json_str.encode('utf-8')

  35.     cipher = AES.new(_AES_KEY, AES.MODE_CBC, _AES_IV)
  36.     padded = pad(plaintext, AES.block_size)
  37.     return cipher.encrypt(padded)


  38. def decrypt_response(encrypted_data: bytes) -> dict:
  39.     """解密二进制响应体,返回明文字典。"""
  40.     cipher = AES.new(_AES_KEY, AES.MODE_CBC, _AES_IV)
  41.     decrypted = cipher.decrypt(encrypted_data)
  42.     unpadded = unpad(decrypted, AES.block_size)
  43.     json_str = unpadded.decode('utf-8')
  44.     return json.loads(json_str)


  45. def refresh_jwt(old_token: str = None) -> str:
  46.     """
  47.     使用旧 JWT 刷新,返回新 JWT 字符串。
  48.     若 old_token 为 None,则从环境变量 WIFIallinonekwy 读取。
  49.     自动去除 'Bearer ' 前缀。
  50.     """
  51.     if old_token is None:
  52.         old_token = os.environ.get("WIFIallinonekwy")
  53.         if not old_token:
  54.             raise ValueError("未提供旧 JWT 且环境变量 WIFIallinonekwy 未设置或为空。")
  55.     # 去除可能的 "Bearer " 前缀
  56.     if old_token.startswith("Bearer "):
  57.         old_token = old_token[7:]

  58.     # ---------- 构造 refresh_token 请求体(固定字段) ----------
  59.     refresh_payload = {
  60.         "common": {
  61.             "projectCode": "wifi",
  62.             "appId": "TT0066",
  63.             "verCode": "260723",
  64.             "verName": "5.2.25",
  65.             "channelId": "zb_oppo",
  66.             "uid": "2e3f2899cf074d9ab26937d316771d99",
  67.             "dhid": "bbga9ccf3h16v1a5881f6c2b4bcba077",
  68.             "deviceId": "a2811bfd9eced1ef870b89d3b43000b7",
  69.             "aid": "1c26f6fc799e1b85",
  70.             "model": "PKG110",
  71.             "manuf": "OnePlus",
  72.             "osVerCode": "35",
  73.             "sim_operator": "CTCC",
  74.             "net": "4",
  75.             "oaid": "47685F5B5DCB45938EAEC2F77D3D8C1149b1407c06d2ae9db56f153d2c40f8f1",
  76.             "bootId": "482237067",          # 此值可保持不变,或根据实际情况更新
  77.             "sdkVersion": "1.3.7",
  78.             "sdkVerCode": "37",
  79.             "clientTaichis": "V1_LSKEY_158016_B,V1_LSKEY_159177_null,V1_LSKEY_161226_A,V1_LSKEY_162189_A,V1_LSKEY_162477_C,V1_LSKEY_164890_A,V1_LSKEY_163921_C,V1_LSKEY_165250_A,V1_LSKEY_167542_A",
  80.             "platform": "android",
  81.             "isMu": 0
  82.         }
  83.     }

  84.     # 加密请求体
  85.     encrypted_body = encrypt_request(refresh_payload)

  86.     # 发送请求
  87.     url = "https://coin-api.y5coin.com/coin/user/refresh_token"
  88.     headers = {
  89.         "Content-Type": "application/json",
  90.         "Charset": "UTF-8",
  91.         "Accept": "*/*",
  92.         "x-project-code": "wifi",
  93.         "x-sdk-version": "37",
  94.         "x-platform": "android",
  95.         "x-http-jwt-token": f"Bearer {old_token}",
  96.         "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 15; PKG110 Build/UKQ1.231108.001)",
  97.         "Connection": "Keep-Alive",
  98.         "Accept-Encoding": "gzip",
  99.     }

  100.     resp = requests.post(url, headers=headers, data=encrypted_body)
  101.     resp.raise_for_status()

  102.     # 解密响应
  103.     result = decrypt_response(resp.content)
  104.     new_jwt = result.get("data", {}).get("newJwtToken")
  105.     if not new_jwt:
  106.         raise KeyError("响应中未找到 newJwtToken,请检查接口返回结构。")
  107.     return new_jwt


  108. # ---------- 可选:直接运行测试 ----------
  109. if __name__ == "__main__":
  110.     try:
  111.         # 测试刷新 JWT(需要环境变量 WIFIallinonekwy)
  112.         new_token = refresh_jwt()
  113.         print("刷新成功,新 JWT:")
  114.         print(new_token)
  115.         print("\n--- 测试加密函数 ---")
  116.         test_payload = {"common": {"foo": "bar"}}
  117.         encrypted = encrypt_request(test_payload)
  118.         print(f"加密长度: {len(encrypted)}")
  119.         # 解密测试
  120.         decrypted = decrypt_response(encrypted)
  121.         print("解密结果:", decrypted)
  122.     except Exception as e:
  123.         print(f"测试错误: {e}")
复制代码
刷新jwt:旧jwttoken传入,传出新jwttoken
加密请求体:明文dict—> 二进制
解密请求体:二进制—>明文dict
回复

使用道具 举报

0

主题

819

回帖

1806

积分

高中生

Rank: 4

金币
81
好评
0
信誉
100
发表于 2026-7-29 21:24:23 | 显示全部楼层  来自 福建
支持一下!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表