From 418a0411d125ddcd6291aa5005db4399ee2f3410 Mon Sep 17 00:00:00 2001 From: Whale-Fall-Code <1690628247@qq.com> Date: Fri, 9 Oct 2026 23:25:05 +0800 Subject: [PATCH] Initialize encryption and JavaScript reverse-engineering study repository Document the project structure and setup while excluding local dependencies and IDE settings. Co-Authored-By: Claude Sonnet 5 --- .gitignore | 22 ++ .python-version | 1 + README.md | 96 ++++++ Snipaste_2026-09-17_21-43-26.png | Bin 0 -> 159549 bytes package-lock.json | 79 +++++ package.json | 11 + pyproject.toml | 12 + uv.lock | 283 ++++++++++++++++++ webpack-2026-09-04/1.自执行函数.js | 34 +++ webpack-2026-09-04/2. webpack的基本结构.js | 19 ++ .../3. webpack逆向时会遇到的问题.js | 55 ++++ webpack-2026-09-04/实战案例-36Kr/加密位置 | 5 + 对称加密-2026-08-21/1. js环境实现des加解密.js | 70 +++++ 对称加密-2026-08-21/2. python实现des加解密.py | 25 ++ .../实战案例-自然科学/js解密.js | 20 ++ .../实战案例-自然科学/调用解密.py | 55 ++++ .../1. js环境实现aes加解密.js | 60 ++++ .../2. python实现aes加解密.py | 31 ++ .../实战案例-商业观察/js解密.js | 34 +++ .../实战案例-建筑市场/js解密.js | 24 ++ .../实战案例-建筑市场/python调用.py | 37 +++ .../node环境实现rsa加解密.js | 37 +++ .../python环境实现rsa加解密.py | 42 +++ .../实战案例-10086中国移动登录/模拟登陆.js | 38 +++ .../实战案例-中国观鸟记录中心/python调用.py | 41 +++ .../实战案例-中国观鸟记录中心/参数加密.js | 51 ++++ .../实战案例-中国观鸟记录中心/混淆代码.js | 9 + 非对称加密-2026-09-02/_invoke方法执行过程.js | 24 ++ .../promise异步任务的执行过程.js | 9 + .../实战案例-五矿集团/python调用.py | 47 +++ .../实战案例-五矿集团/五矿集团.js | 103 +++++++ .../实战案例-吉林长春产权交易中心/js解密.js | 130 ++++++++ .../实战案例-吉林长春产权交易中心/python调用.py | 37 +++ .../实战案例-吉林长春产权交易中心/思路.txt | 3 + 34 files changed, 1544 insertions(+) create mode 100644 .gitignore create mode 100644 .python-version create mode 100644 README.md create mode 100644 Snipaste_2026-09-17_21-43-26.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pyproject.toml create mode 100644 uv.lock create mode 100644 webpack-2026-09-04/1.自执行函数.js create mode 100644 webpack-2026-09-04/2. webpack的基本结构.js create mode 100644 webpack-2026-09-04/3. webpack逆向时会遇到的问题.js create mode 100644 webpack-2026-09-04/实战案例-36Kr/加密位置 create mode 100644 对称加密-2026-08-21/1. js环境实现des加解密.js create mode 100644 对称加密-2026-08-21/2. python实现des加解密.py create mode 100644 对称加密-2026-08-21/实战案例-自然科学/js解密.js create mode 100644 对称加密-2026-08-21/实战案例-自然科学/调用解密.py create mode 100644 对称加密-AES-2026-08-24/1. js环境实现aes加解密.js create mode 100644 对称加密-AES-2026-08-24/2. python实现aes加解密.py create mode 100644 对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js create mode 100644 对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js create mode 100644 对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py create mode 100644 非对称加密-2026-08-31/node环境实现rsa加解密.js create mode 100644 非对称加密-2026-08-31/python环境实现rsa加解密.py create mode 100644 非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js create mode 100644 非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py create mode 100644 非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js create mode 100644 非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js create mode 100644 非对称加密-2026-09-02/_invoke方法执行过程.js create mode 100644 非对称加密-2026-09-02/promise异步任务的执行过程.js create mode 100644 非对称加密-2026-09-02/实战案例-五矿集团/python调用.py create mode 100644 非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js create mode 100644 魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js create mode 100644 魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py create mode 100644 魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bc41d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv + +# Node.js dependencies +node_modules/ + +# IDE settings +.idea/ +.vscode/ + +# Local environment files +.env +.env.* +!.env.example diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a207e99 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# tuling-code + +Python 与 JavaScript 加解密、JS 逆向学习示例,按学习日期和主题整理,包含基础算法演示、Webpack 结构分析以及网站接口参数加密与响应解密案例。 + +## 学习内容 + +- **对称加密**:DES、AES,CBC 模式、填充方式和 Base64 编解码。 +- **非对称加密**:RSA 公私钥生成、加解密,以及 JavaScript 与 Python 实现。 +- **自定义算法分析**:接口请求参数加密与响应数据解密。 +- **JavaScript 执行机制**:自执行函数、Promise 异步任务和 `_invoke` 方法。 +- **Webpack 逆向**:模块加载结构、运行环境与常见问题。 +- **Python 调用 JavaScript**:使用 ExecJS 执行加解密逻辑,并通过 Requests 调用接口。 + +## 目录结构 + +```text +tuling-code/ +├── 对称加密-2026-08-21/ # DES 示例与自然科学案例 +├── 对称加密-AES-2026-08-24/ # AES 示例、商业观察与建筑市场案例 +├── 魔改算法-2026-08-28/ # 吉林长春产权交易中心案例 +├── 非对称加密-2026-08-31/ # RSA 示例、中国移动登录与观鸟记录中心案例 +├── 非对称加密-2026-09-02/ # JS 执行机制与五矿集团案例 +├── webpack-2026-09-04/ # Webpack 结构分析与 36Kr 案例 +├── pyproject.toml # Python 项目与依赖配置 +├── uv.lock # Python 依赖锁定文件 +├── package.json # Node.js 依赖配置 +└── package-lock.json # Node.js 依赖锁定文件 +``` + +## 环境准备 + +需要 Python **3.11 或以上版本**、Node.js **20.19 或以上版本**(包含 npm),以及 Python 包管理工具 uv。ExecJS 调用 JavaScript 时需要可用的 JavaScript 运行时,建议使用 Node.js。 + +在仓库根目录安装依赖: + +```bash +uv sync +npm ci +``` + +主要依赖: + +| 环境 | 依赖 | 用途 | +| --- | --- | --- | +| Python | `pycryptodome` | DES、AES 等加解密 | +| Python | `rsa` | RSA 公私钥生成与加解密 | +| Python | `pyexecjs2` | 调用 JavaScript 代码 | +| Python | `requests` | HTTP 请求 | +| Node.js | `crypto-js` | JavaScript 对称加密与摘要算法 | +| Node.js | `jsencrypt`、`node-rsa` | JavaScript RSA 加解密 | + +## 运行示例 + +以下命令从仓库根目录执行。 + +### Python DES 示例 + +```bash +uv run python "对称加密-2026-08-21/2. python实现des加解密.py" +``` + +### Python AES 示例 + +```bash +uv run python "对称加密-AES-2026-08-24/2. python实现aes加解密.py" +``` + +### Python RSA 示例 + +```bash +uv run python "非对称加密-2026-08-31/python环境实现rsa加解密.py" +``` + +### JavaScript DES 示例 + +```bash +node "对称加密-2026-08-21/1. js环境实现des加解密.js" +``` + +### 网站接口案例 + +部分 Python 案例通过相对路径读取同目录的 JavaScript 文件,需要先进入对应案例目录再运行。例如: + +```bash +cd "对称加密-AES-2026-08-24/实战案例-建筑市场" +uv run python "python调用.py" +``` + +网站接口、请求参数和加密逻辑可能随时间变化;案例记录的是学习时的实现,不保证当前接口仍可直接使用。需要登录或会话信息的案例,应自行在本地配置有效凭证,不要将 Cookie、Token 或密码提交到仓库。 + +## 注意事项 + +- 本仓库用于学习与研究,网站案例仅应在获得授权并遵守相关服务规则的前提下使用。 +- 示例中的固定密钥、固定 IV、DES 和 1024 位 RSA 等写法用于演示,不应直接用于生产环境。 +- `node_modules/`、`.venv/`、Python 缓存、IDE 配置和本地 `.env` 文件不纳入版本控制;通过依赖配置与锁定文件恢复环境。 +- 文件名包含中文和空格,执行命令时请用引号包裹路径。 diff --git a/Snipaste_2026-09-17_21-43-26.png b/Snipaste_2026-09-17_21-43-26.png new file mode 100644 index 0000000000000000000000000000000000000000..dac9aad29a76f1bc0e6c3156b23041a861434743 GIT binary patch literal 159549 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 NF$4F;j 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..424f542 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,79 @@ +{ + "name": "tuling-code", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "crypto-js": "^4.2.0", + "jsencrypt": "^3.5.4", + "node-rsa": "^2.0.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^22.20.3" + } + }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.3.tgz", + "integrity": "sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "deprecated": "Active development of CryptoJS has been discontinued. This library is no longer maintained.", + "license": "MIT" + }, + "node_modules/jsencrypt": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.5.4.tgz", + "integrity": "sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==", + "license": "MIT" + }, + "node_modules/node-rsa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-2.0.0.tgz", + "integrity": "sha512-7yfzccmBd5rm7pALJf709tPwLL987WvdT7LC/QK5Oxa5S2aabdBPjxRDxhWKkbfCc9/FiC82lwSc+ulGZHH44g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^2.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e4d8591 --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "crypto-js": "^4.2.0", + "jsencrypt": "^3.5.4", + "node-rsa": "^2.0.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^22.20.3" + } +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..64c4117 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "tuling-code" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "pycryptodome>=3.23.0", + "pyexecjs2>=1.6.1", + "requests>=2.34.2", + "rsa>=4.9.1", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..f5a3687 --- /dev/null +++ b/uv.lock @@ -0,0 +1,283 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, + { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +] + +[[package]] +name = "idna" +version = "3.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262, upload-time = "2026-07-09T01:12:33.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410, upload-time = "2026-07-09T01:12:32.92Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/5d/bdb09489b63cd34a976cc9e2a8d938114f7a53a74d3dd4f125ffa49dce82/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4", size = 2495152, upload-time = "2025-05-17T17:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/7840250ed4cc0039c433cd41715536f926d6e86ce84e904068eb3244b6a6/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae", size = 1639348, upload-time = "2025-05-17T17:20:23.171Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/991da24c55c1f688d6a3b5a11940567353f74590734ee4a64294834ae472/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477", size = 2184033, upload-time = "2025-05-17T17:20:25.424Z" }, + { url = "https://files.pythonhosted.org/packages/54/16/0e11882deddf00f68b68dd4e8e442ddc30641f31afeb2bc25588124ac8de/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7", size = 2270142, upload-time = "2025-05-17T17:20:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fc/4347fea23a3f95ffb931f383ff28b3f7b1fe868739182cb76718c0da86a1/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446", size = 2309384, upload-time = "2025-05-17T17:20:30.765Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d9/c5261780b69ce66d8cfab25d2797bd6e82ba0241804694cd48be41add5eb/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265", size = 2183237, upload-time = "2025-05-17T17:20:33.736Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6f/3af2ffedd5cfa08c631f89452c6648c4d779e7772dfc388c77c920ca6bbf/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b", size = 2343898, upload-time = "2025-05-17T17:20:36.086Z" }, + { url = "https://files.pythonhosted.org/packages/9a/dc/9060d807039ee5de6e2f260f72f3d70ac213993a804f5e67e0a73a56dd2f/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d", size = 2269197, upload-time = "2025-05-17T17:20:38.414Z" }, + { url = "https://files.pythonhosted.org/packages/f9/34/e6c8ca177cb29dcc4967fef73f5de445912f93bd0343c9c33c8e5bf8cde8/pycryptodome-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a", size = 1768600, upload-time = "2025-05-17T17:20:40.688Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1d/89756b8d7ff623ad0160f4539da571d1f594d21ee6d68be130a6eccb39a4/pycryptodome-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625", size = 1799740, upload-time = "2025-05-17T17:20:42.413Z" }, + { url = "https://files.pythonhosted.org/packages/5d/61/35a64f0feaea9fd07f0d91209e7be91726eb48c0f1bfc6720647194071e4/pycryptodome-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39", size = 1703685, upload-time = "2025-05-17T17:20:44.388Z" }, + { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" }, + { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" }, + { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" }, + { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" }, + { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" }, +] + +[[package]] +name = "pyexecjs2" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/06/afa6c5154d1789f1dd349cdd00299671e6e0050741f6dd605b1fbc76d6b8/PyExecJS2-1.6.1.tar.gz", hash = "sha256:bf8edafa419ff988e61e30ac9946eb3a7c066a1ec07d0c5b0b82b56f16b99050", size = 12771, upload-time = "2022-04-29T07:10:48.62Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/ad/9a94f4a5faf4aa8098ac0efee65dd269a028c894f6e0277a6d81e61c8f74/PyExecJS2-1.6.1-py3-none-any.whl", hash = "sha256:4d46616ca522a228ebc3c5eb3744232abdf78b2abaa0db5ede0d96219a3af778", size = 14753, upload-time = "2022-04-29T07:10:46.998Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tuling-code" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "pycryptodome" }, + { name = "pyexecjs2" }, + { name = "requests" }, + { name = "rsa" }, +] + +[package.metadata] +requires-dist = [ + { name = "pycryptodome", specifier = ">=3.23.0" }, + { name = "pyexecjs2", specifier = ">=1.6.1" }, + { name = "requests", specifier = ">=2.34.2" }, + { name = "rsa", specifier = ">=4.9.1" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] diff --git a/webpack-2026-09-04/1.自执行函数.js b/webpack-2026-09-04/1.自执行函数.js new file mode 100644 index 0000000..c040023 --- /dev/null +++ b/webpack-2026-09-04/1.自执行函数.js @@ -0,0 +1,34 @@ +// function run_task(attr) { +// console.log(attr); +// } +// +// run_task(123) + + +// !(function (attr) { +// console.log(attr); +// })(1) +// +// !(function (attr) { +// console.log(attr); +// })(2) + +// !(function (attr) { +// // console.log(attr); +// attr[0]() +// })([ +// function () {console.log("1")}, +// function () {console.log("2")}, +// function () {console.log("3")} +// ]) + + +!(function (attr) { + // attr["2"](); + attr["2"].call(); + attr["1"].apply(); +})({ + "1": function () { console.log("模块1") }, + "2": function () { console.log("模块2") }, + "3": function () { console.log("模块3") }, +}) \ No newline at end of file diff --git a/webpack-2026-09-04/2. webpack的基本结构.js b/webpack-2026-09-04/2. webpack的基本结构.js new file mode 100644 index 0000000..3dde7eb --- /dev/null +++ b/webpack-2026-09-04/2. webpack的基本结构.js @@ -0,0 +1,19 @@ +/* +* webpack 的基本结构有两种(数组结构 / 对象结构) +* +* !(function ( 形参) { 加载器 }) ([模块1, 模块2, ...]) +* !(function ( 形参) { 加载器 }) ({"1": 模块1, "2": 模块2, ...}) +* */ + + +!(function (function_location) { + function inner_run_func(key) { + return function_location[key].call() + } + + inner_run_func("1") +})({ + "1": function () { console.log("模块1"); }, + "2": function () { console.log("模块2"); }, + "3": function () { console.log("模块3"); }, +}) diff --git a/webpack-2026-09-04/3. webpack逆向时会遇到的问题.js b/webpack-2026-09-04/3. webpack逆向时会遇到的问题.js new file mode 100644 index 0000000..212fe44 --- /dev/null +++ b/webpack-2026-09-04/3. webpack逆向时会遇到的问题.js @@ -0,0 +1,55 @@ +/* +* 模块有上千个 +* 模块分布在不同的文件 +* */ + + +// 1. 如何在自执行webpack函数外部调用模块 +// 2. 加载器初始化问题(浏览器环境检测问题) +// 3. 模块丢失问题 + +window = global + +!(function (func_object) { + function inner_func(key) { + // 打印模块调用日志 + console.log("被调用的模块是:", key); + func_object[key].call(); + } + + + // 调用模块加载器 + // inner_func("encrypt") + + //将内部加载器挂在到全局 + window.loader = inner_func; + + // inner_func("web_env"); 如果在内部加载器中调用了环境检测直接注释 + +})({ + "encrypt": function () { + console.log("加密..."); + }, + "decrypt": function () { + console.log("解密..."); + }, + "web_env": function () { + console.log("浏览器环境检测..."); + }, +}) + + +// 问题1:将内部加载器挂载到顶级对象上 +/* +window.loader("encrypt") +window.loader("decrypt") + */ + + +// 问题2:对于加载器初始化出现环境问题,直接注释 +// inner_func("web_env") + + +// 问题3:模块丢失(在真实的网站模块调用当中可能存在模块是动态加载过来的) +// 解决方式就是模块定位(在内部加载器中打执行日志) +window.loader("339b") \ No newline at end of file diff --git a/webpack-2026-09-04/实战案例-36Kr/加密位置 b/webpack-2026-09-04/实战案例-36Kr/加密位置 new file mode 100644 index 0000000..705b1d5 --- /dev/null +++ b/webpack-2026-09-04/实战案例-36Kr/加密位置 @@ -0,0 +1,5 @@ +接口: + https://gateway.36kr.com/api/mus/login/byMobilePassword +加密参数: + 查询字符串,sign加密 + 请求负载,nonce,mobileNo,password \ No newline at end of file diff --git a/对称加密-2026-08-21/1. js环境实现des加解密.js b/对称加密-2026-08-21/1. js环境实现des加解密.js new file mode 100644 index 0000000..3db5392 --- /dev/null +++ b/对称加密-2026-08-21/1. js环境实现des加解密.js @@ -0,0 +1,70 @@ +var crypro_js = require("crypto-js"); + + +var source_data = "你好,世界!" +var des_key = "12345678" +var iv = "12345678"; + + +var byte_iv = crypro_js.enc.Utf8.parse(iv); +var key = crypro_js.enc.Utf8.parse(des_key); +var data = crypro_js.enc.Utf8.parse(source_data); + +function des_ecb_encrypt() { + // 进行加密 + /* + * 加密操作 + * des对称加密,需要三个形参 + * 1. 明文字节 + * 2. 密钥字节 + * 3. 配置对象 + * (1) mode 工作模式 ECB, CBC, CFB, OFB, CTR + * (2) padding 填充模式, Pkcs7, + * + **/ + var encrypted = crypro_js.DES.encrypt(data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return encrypted.toString(); + +} + +function des_ecb_decrypt() { + var encrypt_data = des_ecb_encrypt(); + + var decrypted = crypro_js.DES.decrypt(encrypt_data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +// console.log(des_ecb_encrypt()) +// console.log(des_ecb_decrypt()) + +function des_cbc_encrypt() { + + var encrypted = crypro_js.DES.encrypt(data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return encrypted.toString(); + +} + +function des_cbc_decrypt() { + var encrypt_data = des_cbc_encrypt(); + + var decrypted = crypro_js.DES.decrypt(encrypt_data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +console.log(des_cbc_decrypt()); \ No newline at end of file diff --git a/对称加密-2026-08-21/2. python实现des加解密.py b/对称加密-2026-08-21/2. python实现des加解密.py new file mode 100644 index 0000000..65aadc6 --- /dev/null +++ b/对称加密-2026-08-21/2. python实现des加解密.py @@ -0,0 +1,25 @@ +import base64 +from Crypto.Cipher import DES +from Crypto.Util.Padding import pad, unpad + + +def des_encrypt(plain_text): + cipher = DES.new(des_key, DES.MODE_CBC, iv) + encrypted = cipher.encrypt(pad(plain_text.encode("utf-8"), DES.block_size)) + return base64.b64encode(encrypted) + + +def des_decrypt(cipher_text): + cipher = DES.new(des_key, DES.MODE_CBC, iv) + decrypt_byte_data = base64.b64decode(cipher_text) + decrypted = unpad(cipher.decrypt(decrypt_byte_data), DES.block_size) + return decrypted.decode("utf-8") + + +source_data = "你好,世界!" +des_key = "12345678".encode("utf-8") +iv = "12345678".encode("utf-8") +if __name__ == "__main__": + enc_data = des_encrypt(source_data) + print(enc_data) + print(des_decrypt(des_encrypt(source_data))) diff --git a/对称加密-2026-08-21/实战案例-自然科学/js解密.js b/对称加密-2026-08-21/实战案例-自然科学/js解密.js new file mode 100644 index 0000000..3576d2a --- /dev/null +++ b/对称加密-2026-08-21/实战案例-自然科学/js解密.js @@ -0,0 +1,20 @@ +var crypro_js = require("crypto-js"); +var p = { + a: crypro_js +} + + +function g(e) { + var t = p.a.enc.Utf8.parse("IFROMC86") + , n = p.a.DES.decrypt({ + ciphertext: p.a.enc.Base64.parse(e) + }, t, { + mode: p.a.mode.ECB, + padding: p.a.pad.Pkcs7 + }); + return n.toString(p.a.enc.Utf8) +} + +// var ee = "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"; +// +// console.log(JSON.stringify(g(ee))) \ No newline at end of file diff --git a/对称加密-2026-08-21/实战案例-自然科学/调用解密.py b/对称加密-2026-08-21/实战案例-自然科学/调用解密.py new file mode 100644 index 0000000..54318ae --- /dev/null +++ b/对称加密-2026-08-21/实战案例-自然科学/调用解密.py @@ -0,0 +1,55 @@ +import json +import time + +import requests +import execjs + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Authorization": "Bearer false", + "Connection": "keep-alive", + "Content-Type": "application/json;charset=UTF-8", + "Origin": "https://kd.nsfc.cn", + "Referer": "https://kd.nsfc.cn/finalSearchList?s=%E7%AC%AC%E4%B8%80%E6%80%A7%E5%8E%9F%E7%90%86%E8%AE%A1%E7%AE%97", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"" +} +with open("js解密.js", "r", encoding="utf-8") as f: + js_code = f.read() + + +ctx = execjs.compile(js_code) + +url = 'https://kd.nsfc.cn/api/baseQuery/completionQueryResultsData' +for page in range(1, 11): + data = { + "complete": True, + "fuzzyKeyword": "第一性原理计算", + "isFuzzySearch": True, + "conclusionYear": "近五年", + "dependUnit": "", + "keywords": "", + "pageNum": page, + "pageSize": 10, + "projectType": "", + "projectTypeName": "", + "code": "", + "ratifyYear": "", + "order": "enddate", + "ordering": "desc", + "codeScreening": "", + "dependUnitScreening": "", + "keywordsScreening": "", + "projectTypeNameScreening": "" + } + response = requests.post(url, headers=headers, json=data) + result = ctx.call("g", response.text) + print(json.loads(result)) + time.sleep(1) + diff --git a/对称加密-AES-2026-08-24/1. js环境实现aes加解密.js b/对称加密-AES-2026-08-24/1. js环境实现aes加解密.js new file mode 100644 index 0000000..289a71f --- /dev/null +++ b/对称加密-AES-2026-08-24/1. js环境实现aes加解密.js @@ -0,0 +1,60 @@ +var crypro_js = require("crypto-js"); + + +var source_data = "你好,世界!" +var aes_key = "1234567890abcdef" +var iv = "abcdef1234567890"; + + +var byte_iv = crypro_js.enc.Utf8.parse(iv); +var key = crypro_js.enc.Utf8.parse(aes_key); +var data = crypro_js.enc.Utf8.parse(source_data); + +function aes_ecb_encrypt() { + var encrypted = crypro_js.AES.encrypt(data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return btoa(encrypted.toString()); // base64 返回 + +} + +function aes_ecb_decrypt() { + var encrypt_data = atob(aes_ecb_encrypt()); + + var decrypted = crypro_js.AES.decrypt(encrypt_data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +console.log("密文结果: ", aes_ecb_encrypt()) +console.log("明文结果: ", aes_ecb_decrypt()) + +function aes_cbc_encrypt() { + + var encrypted = crypro_js.AES.encrypt(data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return btoa(encrypted.toString()); + +} + +function aes_cbc_decrypt() { + var encrypt_data = atob(aes_cbc_encrypt()); + + var decrypted = crypro_js.AES.decrypt(encrypt_data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +console.log("CBC 密文结果: ", aes_cbc_encrypt()); +console.log("CBC 明文结果: ", aes_cbc_decrypt()); \ No newline at end of file diff --git a/对称加密-AES-2026-08-24/2. python实现aes加解密.py b/对称加密-AES-2026-08-24/2. python实现aes加解密.py new file mode 100644 index 0000000..634f506 --- /dev/null +++ b/对称加密-AES-2026-08-24/2. python实现aes加解密.py @@ -0,0 +1,31 @@ +import base64 +from Crypto.Cipher import AES +from Crypto.Util.Padding import pad, unpad +""" +des加解密,key长度有要求 + key长度必须8字节(64bit) + +aes加解密,key长度有要求 + key长度必须16字节(128bit), 24字节(192bit), 32字节(256bit) +""" + +def aes_encrypt(plain_text): + cipher = AES.new(des_key, AES.MODE_CBC, iv) + encrypted = cipher.encrypt(pad(plain_text.encode("utf-8"), AES.block_size)) + return base64.b64encode(encrypted) + + +def aes_decrypt(cipher_text): + cipher = AES.new(des_key, AES.MODE_CBC, iv) + decrypt_byte_data = base64.b64decode(cipher_text) + decrypted = unpad(cipher.decrypt(decrypt_byte_data), AES.block_size) + return decrypted.decode("utf-8") + + +source_data = "你好,世界!" +des_key = "1234567890abcdef".encode("utf-8") +iv = "abcdef1234567890".encode("utf-8") +if __name__ == "__main__": + enc_data = aes_encrypt(source_data) + print(enc_data) + print(aes_decrypt(aes_encrypt(source_data))) diff --git a/对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js b/对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js new file mode 100644 index 0000000..382cb7c --- /dev/null +++ b/对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js @@ -0,0 +1,34 @@ +var crypro_js = require("crypto-js"); +var key = "QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9"; +// var o = "IiEcCVEdLRxEFEBUG0oIBgUeLwg4TkQCJhciJhwxWFo="; +// +// var a = null; +// +// function s() { +// return "sw-observe-crypto-v1".trim() +// } +// +// function u(t, e) { +// for (var n = atob(t), r = "", i = 0; i < n.length; i++) +// r += String.fromCharCode(n.charCodeAt(i) ^ e.charCodeAt(i % e.length)); +// return r +// } +// +// function c() { +// if (a) +// return a; +// var t = u(o, s()); +// console.log(t) +// return a = crypro_js.enc.Utf8.parse(t), a +// } + +function ars_decrypt_data(encrypt_data) { + const encode_key = crypro_js.enc.Utf8.parse(key) + const decrypted = crypro_js.AES.decrypt(encrypt_data, encode_key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} +var data = "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" +console.log(ars_decrypt_data(data)) \ No newline at end of file diff --git a/对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js b/对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js new file mode 100644 index 0000000..74228ba --- /dev/null +++ b/对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js @@ -0,0 +1,24 @@ +var crypro_js = require("crypto-js"); + +var d = { + a: crypro_js +} +// var f = d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn"); +var f = d.a.enc.Utf8.parse("Dt8j9wGw%6HbxfFn"); +var m = d.a.enc.Utf8.parse("0123456789ABCDEF"); + +function g(t) { + var e = d.a.enc.Hex.parse(t) + , n = d.a.enc.Base64.stringify(e) + , a = d.a.AES.decrypt(n, f, { + iv: m, + mode: d.a.mode.CBC, + padding: d.a.pad.Pkcs7 + }) + , r = a.toString(d.a.enc.Utf8); + return r.toString() +} + +// var data = "5588a9e126c91a28cc2f6813e379336923bf42c9814280cca7955d2725a88b28a430c6a4a13cfcd227010b6cddc9aa6d678e97dc96a1ad7090f8ebebc67eeddfb66537a330e1205d1c659d97171c97a2e36e25f5af7a86d80a66daafd539c810a6712825cd15a92948872ba0b6203c6d63ca6a3f3efab6f8f696fac042f165cb31e46edf70a7755792e7f719eb460b9ea71a28e75647e84cfb584edc7466a740d0588595a1fe5331fda0101c56a9ccbe9eb7ad800517ec987d583f87c65c2e2cd209209af42453d7a6d1d73e2b5d1a5414cea523ad5bd6d4100532538f210b2ecfd4230a3342c921cb0df9ee77b605a85d33bd44f241b44873885fd42ab0f38f734242ad73e786694cae37bf54d171e65cf419523517727feff4997bcfebd036015b4bea6386bf219e4d48f75205ed9bf0f243b90ec44a35ff42b2158355929efdca94d9b650f842e2057146d6b698abcf6a80752c8dc9367d2382d181588d4ea7df9afb6567b86f6dd53e9496914bdd24f7eb1947232abbaef35a9f7adfedc677e14ceae7537c2ca9d07f5ddd55c6affb6082396ac0ae92a33bcb36e45c21c8d78661bbe32f2798a68ec7fce17f3c69a132579cfec95455aa7b42680e38e542f77f89aa8b01622f7e9fb3be5f0ab207d998aaa3ee1e31db1a66648a37b0677c6b8cf520d7a3f6143d7fbca1fadf954ce9e1f3f8e87925d4f4963ce51644ef12141d9947dfc53ea8c179fc00d4848068caf28ec652435e7473dbb0b6e02fc3d624476c9e1efc501b61c8fdc1741b13c32256553f9f36054213cf0ea0601765b42f2fe4ed48eb60c5eb5bb4aef8dc8eca161b98e627260468bbfc91f963866474d6507c5b067e1dc54a4232b6ee82f50ed39de9b3d9f2937cfcca36b11127bab3b5ed835b4ed190210c9c90390dde68ac0cd5575cb401545eed4f68fcdf472464c734b45acbc771a199acd70be5bf18093079c1c802a186a41adccd563352a94857afc3015cd3184584cdeb3483560750fce6d6ccc6dbc2e5328b7bf5cf342e0d842a105b032d29dcf8186932c792479569f44c545e8171f0549c2740ae15140c4284634d5bbba47264d92e7e50744200259f33ab29cd9a9cd5d2d1b4267ad2624f9fd8e2360918963e819bb955a1e6e645c8c352917d02b893acac32d178c3272e59f657671c2273228717bab1d214b2d57c8c62e4185e86f2e4b623c07514eff9779e36d10802490768a86b3d47914d73207007aaaeb3ad559da6102ba6c4d68e7df73c6b472cc2d8b9ac474e1b0adbd935253cf17871975288b28af933f7bb325462a554e5c65dcc5283e22689eff8840e09f9b3e3b6a65586ae40e97ebc382ea9b98b21bc7b9c9628a6bf694b85147cc974781d7961c06361ad65e9d2fcbe56ad3a2ab7c3bba87ab8bc324de6ac13b56516aaac4ae68c9158eda2fa0f798c0d7c463338e855f36cb300e47c8a08e399ad56ec1f76b955df2aba2ad8fb3ff271728fd8bbb36a6fbcdee3c5e9605cba7e207e2ee71b47422e706652e007bb888a6168ad55ca6cf2c3b10a97879320fb632910348ddef93444e0f714638ac36178b1c2c5c2be5763ff9220cadbf312bf4885fda352b96d359d5d6bb5749e7bcca5578846e283a55d2c94b41bcd80e8179042e3dcd0cf2f7b9464769f7e51941b246164e86365a6b8722faf4dbda85b304d4693571573e3ea42ea77b2f06a6198b7a922d684e74743e97adc4164ef9773c3fc28d8c5bc528c595df3c459e9747ddf527e2c5ec6b5c3d321527fe43d9849b12be593c0592a9e3c0e2fdb8e0c26f22874519a3ce98b883cada5d131b6e0eadb1f2e82459bdd0709b111e8112ee04b066b07c0d221409bef31d114e17ae226a3347ef68bfd4ed1b668df07045e4414b42d50e74ce63ea42d421f497aa3b3109b4bb3250fd2aeb497f3b015ce8a4a72b77b915a6fbc50d35f41abc404dd4dc9e33c53adacf59daf22c47ca23e1a5eb22ddf54238c22fb98ce5b50894cc43d2a7a7676ce757073fc5bba41774b267ef534605d3b8489dc3098bffd9899b9fa86e51e80ee76e037e16edd821b06fd981b4f6e77b32c16e51f2285bb41cb15ef099a428ee7ab3dc287a97ce4e88bb44198ea76c54895a4978f50df09fa2a0d0afc3bdc22d3f03953ba7f049c0b9fad3115c92baf1d1ce6aec6b16903e5727314b7f8fb6ae202026cd1933a0f9a3ed7881b7ac16fe623c82d903dc166a820952c757e65a4562f4568fdf5cb06b79630220866e5ffeaf08c4da30025b531dc5915a1b002fa735ffa6d68b25aabe300cfc459a70896e4d6f40c56503451f142d73b83787024736a1841d5956e82473133cea0211c6222ab3469a1a25d90100295f8ef7d09ea6840bb1a4c688de8d508b55e6b27e70d1017e29448a8321f92f924110a8085f6c3cb25d43ae8d8f3a9642640a8907673c297c56b3953c40f76228a5a6eb8612c2e1d5fcca122751813f4a371cda28bd6c29b5a7b272438faa636f21da41c2fc0365ac4b87453f62cde7f6a709445c0612e2f57caa9bd0f3761cc85186c99a070ca7db303d027abef7d2fbe2a2ea5f1934e9361bf2a3bac8d808f16d901d0ba43642a2135a25c64eea15747dc621a5a0ede232e11314d6b8ce248d1c932484d7641ec29c30bd50af411867f95106f4464ead118f4b225b8fb5a9aeb737806fc8e8085840cfd14885ad4acabf0af424a8a13029e1ee2f981627b70f61df9e2ce258ec47c0d7584db684c27e2f26da939ce0e49a93ab8f9d3db0fc3721590a46fb95f54275b6f7a1f09ab55bb58cefafc95804f2ed85a59df5f0c32c84cd35c6cc05ef2f4e08b759baf36732f632d4e026d415bef3f6ad9b30b1ef1d3cb27aa6a6e3a74c0a92f4313e8b945eedc942b4a23f9fc7ba1897a8bb0c164ec25aed7fce9aff8a2b18b29eaf970d3b568ba22d43d3fdb552fa3e84d757b6f5a2d35276ad8ffb827831a3bfa03a1eeedd964c72071bb60e3c152854d485d6e33483c54630ed97e9f8413a7266715bfbb7e90078b25602a01ff5696e809280765754987846ac329af92e984e816aa14ed28fefe0958068ea036aba0b16c9f53dc1db06ad94b8b96d2eba04461cff4d6a91be444101fff897e597b05e5f221acfb04dcc0f28b9e176338f650dd475c7f0380834bc753be8c828a452430309a0173e94c03a328d0b092d75e6059f6119409ab72d98445144ddc726e4d1d12f0d0c0f88b0c0994ea00fd67442bf904e1c436d0b1f61b4fde70802fcd13c3d4266c83ab3f913bb723e2ad5a6c8271d8f709fd75aff72bcbd2d5ece32c88d89120d5254e2036667d742e118661b09b433908e89758d3f95e9366b91ddd4ecb1cc6d4bc5ab69a528625211de08f8dd7d63ab184170ffaf6132bde3a7e8b763cff071059c6a5d517293a778ac87656d019547ee9185d9a2c748522369a64a5bde812351e8a3572da3cb4e14a785b4e27b9ac7302601661d9c4fc7de894f882d92a6cfe79c77118188b59a54092003cd64ec11b481a91f2fc055fb24a8a35dfaedbad401ef3c07f0266e34bb5a5cbfde85a77820576cab37ee0868b75036807b6d333dd44514c3038ebef1ea9e3ab7626a7c5e051106a1dd2a4fa94f065d55ea0a24ada10b7b4e9bd87e2f35e34670d417a62ae08a42698e876392f0f4439fded822fbc05b37be973dd1b00dd1ca4e29915c2c40a97ea0710191a5c041cd775d32ac538bbd4a88e8ff9ce09669fdeea0d269e46444842cda48f83b57aaded975d2b5b4f9567240691627c610c6b1b720666e1011f19adff884a2293edf014730f88ef5097fa337fd9afa6e9ecf4ef0ba4ebb48911a8655091c9b9e518059172a6600d953374626bf90485a7c071e6158575b31fdc65856afabe1931450a740354f97192724192b741398e0de4432ed912fa454bdc8f74b811f3b6aa0fe8aeb5939432dcf39a3c3ed906a082970bbf6db3759b1f42a1935be7981c7361ce02a3c4bfe7f8589664a3f52241322d33d92e2b6e0213b16a0766687b375d473c7e48694f8c073ccc84a9fd1c50eec2cdf1c7bf7caf26e86864be797418860792070cc93e97ce10b807fb4189a8f234bdad57be782bb9d20eeca1b4f2f6328acb75edeaf4b320e91a8d0256012a745f11655ef544000edc06c994f7c6fdce368575b857aa58b456cbefa026abb3ae088e874c7d64aa45898d928b245cde2a2c51994f7b5ca00c4f23ed7db6351e0ff93a5fc96dd6d27baa7da6e0acf245ec57ec733a7823d78e1888cb02280fcd886b460d6854856659f3269dd2f57d55cc01c824e8d25082c4260efab9395f8768c2e2794731fc8e101ef73b996a42df30615cf113a4937d9f33a06f73c38617cdd7e4800d584da194ade03e3a052c22ecaace2d43b689ec21ac947b4f00432425a9b3394294ce7f79e22e5c755800ff4d88ceabf7a88456b06ea7462fa88fb8d52d541cf59bb798f9c893e13b93845d72a52af5ec3d85aaf209f76167f06a6a6cf8252d19250964e5897c5bbb501114e8b0d4beed12600651428b3b230aaa6d3c9f88da49734f17d147bff8df3805caf6e48191c3b7db8a58616836f5cc8346e4fc36dd0b345088b271b33e192dc872afe1109d7458930a6887f6b73c15203b03a1e9bfe3880be945caba6b10b9d9efc958e77aa4f2eefd99fbd7d0cc5d68bb2103001b92141f978a3e8e06875d8fa923d724b20170f73171a72c7c21bc4ea03a037e34c7b1fb1120a8a64e7839324001525c7f2ea95a6116d27845418af476b2040d23c633d4e7e0982c7ddd4f608c77f8e2f1a5e37454fefa79ea2f5aebd5bae32c447122c1473c5ab61edcb97e1d186c5fa3d1d2060308d782e2a2ef46ed9d249e43f3e33f7ed2fe0c31527cad10f651843ec6f5c4d26f100164af8b77bc694d89dfd99756f78261c344daf154ea2ceb3586cccaa8a1f5d5f495494f4643e0995a2964c8608c6eba1f271edbdee7d29bbba5b08f8a572abc6ef32b5bad5292eb40758034d46cd0ddcf82b80601ff25cac0019a59442fd56957b527317aa0a25e87873f54b53dec15fa462c7c23051c54891830fde77e4b09eef3f3cea2115da97baf6834b394b54c9c1266ec36f5ba45e23aa5357a99ed97496c293ef0397886c1497675f79c10c7337b231784c073811bccb404026743855e4ba843605474f4f3bce8dd7930ed5517c42527c0c4dabaeca19800e4d063db79da1f9e7092d40e0d8932bcf01aeda700e923d66ad172152c1f4c59d9548b94a365361f3720f5e4b8db2fe945cf664dd11387a8d4c5b9f76126735a80ff17035ce25c03f12d4e34dbd51605a0751f724b7503dfe183138152451112960d34a03dc6bef2a235b6183f17e4e072333175a870f6cd998a426a44b24a8d004c910b357df51224ed87b6dbed710c99ae1a73d64b68aa38d3653256dc9c246be4bfed6521bd0c6a2ad005bc6a0dd568abc256af7f9eacc906c6195a877580301d6bed06e165dd54105c11e58e25ef629fa57d49d8a2ef75bdcca061f9a9465c76eb9a1b580c7a388e95fcd2bbaf4e1ec8c2201d91f75933737ec27a3e0fa7731133ac05eceaaabfe6ec03f488a7e93b65cd2ceaac440f4de0183ee5202e2e7ac3b9ca95653cac936f2f59d08d7b385dbc06e09689edfc88507bbea3d0c89c2520430eec65e3e317f66b74c846ce63657635b1a53622d740408d385a809641d6f26f89d12f0904269eb26e536e941dab128e7f9dadf2474a57c61da524ce5ba1f42d076ef094ccc9bf35e6373cccddc03b187d2b6e8a4fef1da7ab1ae135d5c9e460b3d658aa976fe5d2c256b69e9e84b383790d96f2174113f889539a52bd608f68094aff5032375008e863226be5380a8db892166e63aa71f1816f12d2af07f1a34e11f9a8f5220633b059b6854ae9930dcab637f946ff6831c8bfe9244d30462f03b879af7fd1cc8b1797300b88a713a0a2d8354ea2b6265c067fcf83d199c68c277d97914010207a79f4cb975ef333e10602d3893e7d42e87330ad5e57dfefc00c259bb74ac0b5f555bef4649e6696474573683e4232d581554925888772e023e6b67836811e2e84792aeb352cfafbde4b37b880d1196e5f11e467d5325abe307a456c46aa2d67b38c88ce0b1c20bb6c24f5908eacc48f6bcdd91bfb2abf487e5175eb3c4c003c32cc9b8e94a802649c4b8bf98e5556361d49178d8ba75f51ae1f83ed5e22501d485e948eb5d43cc5e4767c303dc1c142ab7ca01e33d5cbe5fa8628734e0647c6aef75969a84c526d2c7689a3c802ade58e095b5f9d0f82ab5becdeddc4c015b13e706be86a0556f1b1e02ce83f6c8ebabeed51a31a0d3415e8af49ec"; +// +// console.log(g(da)) \ No newline at end of file diff --git a/对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py b/对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py new file mode 100644 index 0000000..42d39e8 --- /dev/null +++ b/对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py @@ -0,0 +1,37 @@ +import requests +import execjs +import time + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Referer": "https://jzsc.mohurd.gov.cn/data/company", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "accessToken;": "", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "timeout": "30000", + "v": "231012" +} + +with open("js解密.js", "r", encoding="utf-8") as f: + js_code = f.read() + +code = execjs.compile(js_code) +url = 'https://jzsc.mohurd.gov.cn/APi/webApi/dataservice/query/comp/list' +for page in range(1, 11): + params = { + "pg": str(page), + "pgsz": "15", + "total": "450" + } + response = requests.get(url, headers=headers, params=params) + # print(response.text) + result = code.call("g", response.text) + print(result) + time.sleep(1) \ No newline at end of file diff --git a/非对称加密-2026-08-31/node环境实现rsa加解密.js b/非对称加密-2026-08-31/node环境实现rsa加解密.js new file mode 100644 index 0000000..07e56ab --- /dev/null +++ b/非对称加密-2026-08-31/node环境实现rsa加解密.js @@ -0,0 +1,37 @@ +// JSEncrypt() node-rsa 两个包 +// npm install node-rsa + +var node_rsa = require("node-rsa").NodeRSA; // node-rsa 2.x 导出的是 { NodeRSA, default } + + +class RsaEncryptDecrypt { + constructor(key_size = 1024) { + this.node_rsa = new node_rsa({b: key_size}); + this.public_key = this.node_rsa.exportKey("pkcs8-public"); + this.private_key = this.node_rsa.exportKey("pkcs8-private"); + + console.log("公钥:", this.public_key); + console.log("私钥", this.private_key); + } + + encrypt(data) { + const public_instance = new node_rsa(this.public_key, "pkcs8-public"); + return public_instance.encrypt(data, "base64"); + } + + decrypt(data) { + const private_instance = new node_rsa(this.private_key, "pkcs8-private"); + return private_instance.decrypt(data, "utf8"); + } + + +} + +const rsa = new RsaEncryptDecrypt(); +const source_data = "你好,世界"; + +const enc_data = rsa.encrypt(source_data); +console.log("base", enc_data); + +const dec_data = rsa.decrypt(enc_data); +console.log("解密结果", dec_data); diff --git a/非对称加密-2026-08-31/python环境实现rsa加解密.py b/非对称加密-2026-08-31/python环境实现rsa加解密.py new file mode 100644 index 0000000..8db6bb2 --- /dev/null +++ b/非对称加密-2026-08-31/python环境实现rsa加解密.py @@ -0,0 +1,42 @@ +# pip install rsa +import rsa +import base64 + +""" +非对称加解密需要一对密钥(公钥,私钥) + +加密过程中,一般情况使用公钥加密,私钥解密 +也能用私钥加密,公钥解密 +""" + +def create_key(): + public_key, private_key = rsa.newkeys(1024) # 字节长度 + # print("公钥", public_key) + # print("私钥", private_key) + return public_key, private_key + +# 使用公钥加密,私钥解密 +def encrypt_data(text, public_key): + bytes_text = text.encode("utf-8") + encrypted_text = rsa.encrypt(bytes_text, public_key) + return base64.b64encode(encrypted_text) + +def decrypt_data(encrypted_text, private_key): + bytes_text = base64.b64decode(encrypted_text) + bytes_decrypted_text = rsa.decrypt(bytes_text, private_key) + return bytes_decrypted_text.decode("utf-8") + + + +def main(): + public_key, private_key = create_key() + + source_data = "你好,世界!" + encrypted_text = encrypt_data(source_data, public_key) + print("base64的密文结果", encrypted_text) + decrypted_text = decrypt_data(encrypted_text, private_key) + print("解密结果", decrypted_text) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js b/非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js new file mode 100644 index 0000000..ca75c46 --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js @@ -0,0 +1,38 @@ +const JSEncrypt = require("jsencrypt") + +// function et(_0x32033c) { +// var _0x283d00 = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgDq4OqxuEisnk2F0EJFmw4xKa5IrcqEYHvqxPs2CHEg2kolhfWA2SjNuGAHxyDDE5MLtOvzuXjBx/5YJtc9zj2xR/0moesS+Vi/xtG1tkVaTCba+TV+Y5C61iyr3FGqr+KOD4/XECu0Xky1W9ZmmaFADmZi7+6gO9wjgVpU9aLcBcw/loHOeJrCqjp7pA98hRJRY+MML8MK15mnC4ebooOva+mJlstW6t/1lghR8WNV8cocxgcHHuXBxgns2MlACQbSdJ8c6Z3RQeRZBzyjfey6JCCfbEKouVrWIUuPphBL3OANfgp0B+QG31bapvePTfXU48TYK0M5kE+8LgbbWQIDAQAB'; +// var _0x1defd6 = new JSEncrypt(); +// _0x1defd6['setPublicKey'](_0x283d00); +// var _0x4bd6d3 = _0x1defd6['encrypt'](_0x32033c); +// return _0x4bd6d3; +// } + +function et(data) { + const key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgDq4OqxuEisnk2F0EJFmw4xKa5IrcqEYHvqxPs2CHEg2kolhfWA2SjNuGAHxyDDE5MLtOvzuXjBx/5YJtc9zj2xR/0moesS+Vi/xtG1tkVaTCba+TV+Y5C61iyr3FGqr+KOD4/XECu0Xky1W9ZmmaFADmZi7+6gO9wjgVpU9aLcBcw/loHOeJrCqjp7pA98hRJRY+MML8MK15mnC4ebooOva+mJlstW6t/1lghR8WNV8cocxgcHHuXBxgns2MlACQbSdJ8c6Z3RQeRZBzyjfey6JCCfbEKouVrWIUuPphBL3OANfgp0B+QG31bapvePTfXU48TYK0M5kE+8LgbbWQIDAQAB'; + const encrypt_instance = new JSEncrypt(); + encrypt_instance.setPublicKey(key); + return encrypt_instance.encrypt(data); + +} + + +/* +* 非堆成加密:在加密过程中key固定,密文不固定 +* +* */ + +const password = "admin"; +console.log(et(password)); + + +/* +* 在js环境中和实现rsa 有两种方式 +* 1. rsa-node +* 2. jsencrypt +* 区别 +* rsa-node: 可以自己生成密钥对,并且完成加解密 +* jsencrypt: 不能自己生成密钥对,不能完成解密,只能加密(js逆向的中重点使用) +* +* + */ \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py new file mode 100644 index 0000000..ac123ee --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py @@ -0,0 +1,41 @@ +import time + +import requests +import execjs + + +with open("参数加密.js", "r", encoding="utf-8") as f: + code_js = f.read() + +code = execjs.compile(code_js) +for page in range(1, 2): + temp_params = code.call("beforeSend", page) + + headers = { + "Accept": "application/json, text/javascript, */*; q=0.01", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Origin": "https://www.birdreport.cn", + "Referer": "https://www.birdreport.cn/", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-site", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "requestId": str(temp_params["requestId"]), + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sign": str(temp_params["sign"]), + "timestamp": str(temp_params["timestamp"]) + } + + enc_data = temp_params["data"] + url = 'https://api.birdreport.cn/front/activity/search' + response = requests.post(url, headers=headers, data=enc_data) + response_json = response.json() + result = code.call("aes_decrypt", response_json["data"]) + + print(result) + print(response) + time.sleep(1) \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js new file mode 100644 index 0000000..1703169 --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js @@ -0,0 +1,51 @@ +const JSEncrypt = require("jsencrypt"); +var crypto_js = require("crypto-js"); + +const encrypt = new JSEncrypt(); +var paramPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvxXa98E1uWXnBzXkS2yHUfnBM6n3PCwLdfIox03T91joBvjtoDqiQ5x3tTOfpHs3LtiqMMEafls6b0YWtgB1dse1W5m+FpeusVkCOkQxB4SZDH6tuerIknnmB/Hsq5wgEkIvO5Pff9biig6AyoAkdWpSek/1/B7zYIepYY0lxKQIDAQAB"; +encrypt.setPublicKey(paramPublicKey); + +function MD5(text) { + return crypto_js.MD5(text).toString(); +} + +function getUuid() { + var s = []; + var hexDigits = "0123456789abcdef"; + for (var i = 0; i < 32; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 16), 1) + } + s[14] = "4"; + s[19] = hexDigits.substr(s[19] & 3 | 8, 1); + s[8] = s[13] = s[18] = s[23]; + var uuid = s.join(""); + return uuid +} + +function beforeSend(page) { + var timestamp = Date.parse(new Date); + var requestId = getUuid(); + + var data = `{"limit":"20","page":"${page}"}` + const sign = MD5(data + requestId + timestamp) + return { + timestamp: timestamp, + requestId: requestId, + sign: sign, + data: encrypt.encrypt(data) + }; +} + + +function aes_decrypt(encrypt_data) { + var key = crypto_js.enc.Utf8.parse("C8EB5514AF5ADDB94B2207B08C66601C"); + var iv = crypto_js.enc.Utf8.parse("55DD79C6F04E1A67"); + var decrypted = crypto_js.AES.decrypt(encrypt_data, key, { + iv: iv, + mode: crypto_js.mode.CBC, + padding: crypto_js.pad.Pkcs7, + }) + return decrypted.toString(crypto_js.enc.Utf8); +} + +// console.log(beforeSend(1)); \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js new file mode 100644 index 0000000..97fc449 --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js @@ -0,0 +1,9 @@ +_0x48989b["prototype"]['decode'] = function (_0x291626) { + var _0x3c6fa1 = CryptoJS['enc']["Utf8"]["parse"]("C8EB5514AF5ADDB94B2207B08C66601C") + , _0x3ec027 = CryptoJS["enc"]["Utf8"]["parse"]("55DD79C6F04E1A67"); + return CryptoJS["AES"]["decrypt"](_0x291626, _0x3c6fa1, { + 'iv': _0x3ec027, + 'mode': CryptoJS["mode"]['CBC'], + 'padding': CryptoJS['pad']["Pkcs7"] + })['toString'](CryptoJS['enc']['Utf8']); +} \ No newline at end of file diff --git a/非对称加密-2026-09-02/_invoke方法执行过程.js b/非对称加密-2026-09-02/_invoke方法执行过程.js new file mode 100644 index 0000000..a1da1e3 --- /dev/null +++ b/非对称加密-2026-09-02/_invoke方法执行过程.js @@ -0,0 +1,24 @@ +class MyFunc { + _invoke(func_name, a, b) { + switch (func_name) { + case 'add': + return this._add(a, b); + case 'subtract': + return this._subtract(a, b); + default: + throw new Error(`Invalid func name, ${operation}`); + } + + } + + _add(a, b) { + return a + b; + } + + _subtract(a, b) { + return a - b; + } +} + +const myFunc = new MyFunc(); +console.log(myFunc._invoke("add", 10, 5)) \ No newline at end of file diff --git a/非对称加密-2026-09-02/promise异步任务的执行过程.js b/非对称加密-2026-09-02/promise异步任务的执行过程.js new file mode 100644 index 0000000..ddefd6c --- /dev/null +++ b/非对称加密-2026-09-02/promise异步任务的执行过程.js @@ -0,0 +1,9 @@ +function run_async_task() { + return new Promise(function (resolve, reject) { + resolve("这是异步任务执行之后得到的结果"); + }); +} + +run_async_task().then(function (result) { + console.log(result); +}); \ No newline at end of file diff --git a/非对称加密-2026-09-02/实战案例-五矿集团/python调用.py b/非对称加密-2026-09-02/实战案例-五矿集团/python调用.py new file mode 100644 index 0000000..efababe --- /dev/null +++ b/非对称加密-2026-09-02/实战案例-五矿集团/python调用.py @@ -0,0 +1,47 @@ +import time + +import requests +import execjs + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Content-Length": "0", + "Origin": "https://ec.minmetals.com.cn", + "Referer": "https://ec.minmetals.com.cn/open/home/purchase-info", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"" +} +with open("五矿集团.js", "r", encoding="utf-8") as f: + code_js = f.read() +cookies = { + # "__jsluid_s": "e761c17024077e17ad5b78ccdd2b3df3", + "SUNWAY-ESCM-COOKIE": "a9a9e461-c1c4-4348-b1f3-60ace80a499e", + "JSESSIONID": "C1F0A4A6E17FA8D3F9674563DF3F20C9" +} +ctx = execjs.compile(code_js) + +for page in range(1, 6): + public_key = requests.post("https://ec.minmetals.com.cn/open/homepage/public", headers=headers).text + + encrypt_params = ctx.call("encrypt_param", public_key, page) + + json_data = { + "param": encrypt_params, + } + + response = requests.post( + "https://ec.minmetals.com.cn/open/homepage/zbs/by-lx-page", + cookies=cookies, + headers=headers, + json=json_data + ) + print(response.json()) + # print(response.text) + time.sleep(1) diff --git a/非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js b/非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js new file mode 100644 index 0000000..ce17f7c --- /dev/null +++ b/非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js @@ -0,0 +1,103 @@ +var JSEncrypt = require("jsencrypt"); +var crypto_js = require("crypto-js"); + +function w(A) { + var e, t, n = "", r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", a = "="; + for (e = 0; e + 3 <= A.length; e += 3) + t = parseInt(A.substring(e, e + 3), 16), + n += r.charAt(t >> 6) + r.charAt(63 & t); + e + 1 == A.length ? (t = parseInt(A.substring(e, e + 1), 16), + n += r.charAt(t << 2)) : e + 2 == A.length && (t = parseInt(A.substring(e, e + 2), 16), + n += r.charAt(t >> 2) + r.charAt((3 & t) << 4)); + while ((3 & n.length) > 0) + n += a; + return n +} + +function encryptLong(jsencrypt_object, A) { + var e = jsencrypt_object.getKey() + , t = (e.n.bitLength() + 7 >> 3) - 11; + try { + var n = "" + , r = ""; + if (A.length > t) + return n = A.match(/.{1,50}/g), + n.forEach((function (A) { + var t = e.encrypt(A); + r += t + } + )), + w(r); + var a = e.encrypt(A) + , s = w(a); + return s + } catch (i) { + return i + } +} + +function v(A, e) { + var t = Object.keys(A); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(A); + e && (n = n.filter((function (e) { + return Object.getOwnPropertyDescriptor(A, e).enumerable + } + ))), + t.push.apply(t, n) + } + return t +} + +function encode_MD5(data) { + return crypto_js.MD5(data).toString() +} + +function m(A) { + for (var e = 1; e < arguments.length; e++) { + var t = null != arguments[e] ? arguments[e] : {}; + e % 2 ? v(Object(t), !0).forEach((function (e) { + b(A, e, t[e]) + } + )) : Object.getOwnPropertyDescriptors ? Object.defineProperties(A, Object.getOwnPropertyDescriptors(t)) : v(Object(t)).forEach((function (e) { + Object.defineProperty(A, e, Object.getOwnPropertyDescriptor(t, e)) + } + )) + } + return A +} + +function b(A, e, t) { + return e in A ? Object.defineProperty(A, e, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0 + }) : A[e] = t, + A +} + +function encrypt_param(public_key, page) { + var r = public_key; + var t = new JSEncrypt(); + t.setPublicKey(r); + var e = { + "inviteMethod": "", + "businessClassfication": "", + "mc": "", + "lx": "ZBGG", + "dwmc": "", + "pageIndex": page + }; + a = m(m({}, e), {}, { + sign: encode_MD5(JSON.stringify(e)), + timeStamp: +new Date + }); + return encryptLong(t, JSON.stringify(a)) +} + +// var key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrD7FHuUUHUCWeInEnnRraglf7ytCal3jB4bP66T7vkUQZRepM1uNr1LWucdPMYvDsaN8LSsu8HHwoqqRoQx33T5pNrFWe4/daccjbM7m7h8VWRQ2Ny3rgRNuSIIg012o25ORgpAHjGBXQ+mMzFYvCFYzY6sKMmqS3k0xYpy6KwwIDAQAB"; + + +// console.log(new JSEncrypt().__proto__) +// console.log(encrypt_param(key, 0)) \ No newline at end of file diff --git a/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js new file mode 100644 index 0000000..d77bb60 --- /dev/null +++ b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js @@ -0,0 +1,130 @@ +var b = function () { + function t() { + this.codeStr = "", + this.pubPass = "BX1o65CoobwcDP33iQW6ld1OyIPsNzF1", + this.pubPassNum = [], + this.publicKey = "", + this.setPass(this.pubPass) + } + + return t.prototype.encode = function (t) { + var e = ""; + try { + e = JSON.stringify(t) + } catch (n) { + return console.error(n + "这不是一个正确的json对象"), + "" + } + return this.encryptCode(e) + } + , + t.prototype.decode = function (t) { + var e; + try { + e = JSON.parse(this.decryptCode(t)) + } catch (n) { + return void console.error(n + "json对象转出失败") + } + return e + } + , + t.prototype.encryptCode = function (t) { + for (var e = encodeURI(t), n = [], i = 0, r = "", o = this.random(16, 32), a = this.randomStr(o), c = this.stringChangeASCIINumberArrs(a), s = 0, u = 0, l = 0, h = 0; h < e.length; h++) + i = e.charCodeAt(h), + s == this.pubPassNum.length && (s = 0), + i += this.pubPassNum[s], + s++, + u == c.length && (u = 0), + i += c[u], + u++, + l += i, + l > 65535 && (l -= 65535), + r = i.toString(36), + r = ("00" + r).substr(-2, 2), + 1 == r.length && (r = "0" + r), + n.push(r); + var f = ""; + return f = l.toString(36), + f = ("0000" + r).substr(-4, 4), + n.unshift(a), + n.unshift(o.toString(36)), + n.unshift(f), + n.join("") + } + , + t.prototype.decryptCode = function (t) { + var e = "" + , n = 0 + , i = "" + , r = [] + , o = [] + , a = 0 + , c = 0; + e = t.substr(4, 1), + n = parseInt(e, 36), + i = t.substr(5, n), + r = this.stringChangeASCIINumberArrs(i), + e = t.substr(5 + n, t.length - 5 - n); + for (var s = "", u = 0, l = 0, h = 0; h < e.length / 2; h++) + s = e.substr(l, 2), + l += 2, + u = parseInt(s, 36), + c == r.length && (c = 0), + u -= r[c], + c++, + a == this.pubPass.length && (a = 0), + u -= this.pubPassNum[a], + a++, + s = String.fromCharCode(u), + o.push(s); + return e = o.join(""), + e = decodeURI(e), + e + } + , + t.prototype.setPass = function (t) { + this.pubPassNum = this.stringChangeASCIINumberArrs(t) + } + , + t.prototype.stringChangeASCIINumberArrs = function (t) { + for (var e = [], n = 0; n < t.length; n++) + e.push(t.charCodeAt(n)); + return e + } + , + t.prototype.random = function (t, e) { + return void 0 === t && (t = 0), + void 0 === e && (e = 1e4), + Math.floor(Math.random() * (e - t) + t) + } + , + t.prototype.randomStr = function (t) { + for (var e = [], n = 0; n < t; n++) + e.push(this.random(0, 35).toString(36)); + return e.join("") + } + , + t +}() + +function encrypt_payload(page) { + const aes = new b; + const data = { + "id": "ru9dz050bkg8oy3j", + "projectKey": "honsan_cloud_ccprec", + "clientKey": "ru9dyul1ixcuvpdn", + "token": null, + "clientDailyData": {}, + "acts": [{ + "id": "ru9dz04zw4wp164f", + "fullPath": "/ccprec.com.cn.web/client/info/cqweb_nonphy_cqzr", + "args": [page, 20, null] + }] + }; + return aes.encode(JSON.stringify(data)); +} + +function decrypt_data(enc_data) { + const aes = new b; + return aes.decode(enc_data) +} \ No newline at end of file diff --git a/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py new file mode 100644 index 0000000..0469147 --- /dev/null +++ b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py @@ -0,0 +1,37 @@ +import execjs +import requests +import time + + +with open("js解密.js", "r", encoding="utf-8") as f: + js_code = f.read() + +code = execjs.compile(js_code) + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Content-Type": "text/xml;charset=UTF-8", + "Origin": "https://www.ccprec.com", + "Referer": "https://www.ccprec.com/projectSecPage/", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"" +} +url = 'https://www.ccprec.com/honsanCloudAct' +for page in range(1, 11): + data = code.call("encrypt_payload", page) + print(data) + response = requests.post(url, headers=headers, data=data) + + response_data = code.call("decrypt_data", response.text) + print(response_data) + + # print(response.text) + # print(response) + time.sleep(1) diff --git a/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt new file mode 100644 index 0000000..b03e9bb --- /dev/null +++ b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt @@ -0,0 +1,3 @@ +先找请求负载的加密位置 + 魔改的函数,进行扣代码 +然后找结果解密的位置 \ No newline at end of file