来源信息
- 仓库
- Kur1sulab/blackbox
- 最近来源活动
- 2026年8月12日 15:05
- 检测到的 SKILL.md 语言
- 中文
- 星标
- 3
- 分支
- 1
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
文件资源管理器
2 个文件正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- js-login-crypto-replica
- description
- 复刻登录页 JS 加密链为 Python 等价实现。触发:写登录加密脚本/encryptedString/登录自动化。
- version
- 1.0.0
- author
- Hermes Agent
- license
- MIT
- platforms
- ["windows"]
- metadata
- {"hermes":{"tags":["crypto","rsa","js","login-automation","python-replica","cas","pentest"]}}
# JS 登录加密链复刻(JS → Python)
## When to Use
- 登录面自动化前需要把登录页 JS 里的客户端加密(reverse→RSA、AES、MD5、自定义混淆)用 Python 等价复刻
- 手里有登录页引用的 JS 证据文件(security.js / common.js / 主题 cas.js),要写 `encrypt_password` 类接口
- 典型目标:正方/泛微等校园 CAS(reverse→RSA + getPubKey 动态公钥)、各类 SRC 登录表单
场景:SRC/渗透登录面自动化需要 Python 复刻登录页客户端加密(正方/泛微等校园 CAS 的 reverse→RSA、AES、MD5、自定义混淆)。输入:登录页 HTML + 引用的 JS 证据文件(security.js / common.js / 主题 cas.js 等)。2026-08-11 某高校 CAS 实战验证:Python 复刻与真实 JS 输出**逐字节一致**。
## 五步工作流
1. **提取加密链**(grep JS 证据):`grep -n "encryptedString|RSAUtils|setMaxDigits|chunkSize|reversedPwd|password|putRsa|getPubKey"` 定位 submit handler(checkForm 类)→ 确认:变换顺序(先 reverse 再 RSA?)、padding、输出格式(hex 串 / 空格分块)、公钥来源(POST getPubKey → localStorage)。`pwdDefaultEncryptSalt` 变量存在与否 → 判断是否 Apereo CAS(存在=是;不存在=自定义平台,如正方)
2. **金标准先行**:Node 直接跑原始 JS 拿 ground truth(IIFE shim 见 Pitfalls),**先于 Python 实现生成对照输出** —— 最硬的验证锚点
3. **Python 复刻**:stdlib only;大数 RSA 用 `pow(block, e, n)`;接口固定 `encrypt_password(plaintext_password, modulus_hex, exponent_hex) -> str` + CLI `python xxx.py <pwd> <modulus_hex> <exponent_hex>`
4. **验证矩阵**(selftest.py 模式,全本地不联网):
- 输出格式:空格分隔的小写 hex 块
- chunk 数学:块数 = 填充后长度/chunkSize,chunkSize 从 modulus 位数推出
- 私钥回解:有私钥时逐块 `pow(int(c,16), d, n)`,**定长 `to_bytes(chunk_size,'little')`** 后 == 反转+零填充明文
- **与 Node 真实 JS 输出逐字节比对**:短密码(单块)+ 长密码 ≥ chunkSize(多块)各一次
5. **落盘**:selftest-output.txt + README.md(用法 + 链说明 + 下轮自动化怎么用),git commit
## Pitfalls
- **RSAUtils chunkSize = 2*biHighIndex(modulus):1024-bit 公钥 = 126,不是 128**(David Shapiro 经典实现怪癖,必须复刻;错 2 字节全盘皆输)
- 输出 hex 是最小长度:biToHex 从最高非零 16-bit digit 向下、每 digit 4 位小写 hex、高位零 digit 省略 = Python `format(int,'x')`
- 私钥回解**别用** `while m: out.append(m&0xFF)` —— 会剥掉明文尾部零填充,误报 FAIL;用 `m.to_bytes(chunk_size, 'little')`
- JS IIFE shim:`global.window = global; eval(fs.readFileSync('xxx.js','utf8'))` 后直接调 `RSAUtils.getKeyPair(e,'',n)` + `encryptedString`;文件可能带 UTF-8 BOM(codex PowerShell 写盘产物),字节比对前注意
- 公钥会话级动态:POST `/cas/v1/getPubKey` → `{modulus, exponent}` → localStorage `cas_modulus`/`cas_exponent`;自动化每次刷新,勿复用旧 key
- 测试密钥本地生成即可(cryptography lib 1024-bit RSA),无需联网;侦察报告(cas-recon.md 类)通常没记样例公钥
- 时间盒纪律:15min 内先出复刻 + 金标准比对,验证通过即收工
## 派 codex 复刻(可选)
- 证据文件先复制进**自包含工作目录**(codex 沙箱读外部目录受限),`git init` 后 `codex exec --skip-git-repo-check --sandbox workspace-write "<English prompt>"`(pty=true;trusted-directory 坑详见 claude-codex-pi-executors 技能,user-owned 勿改)
- 提示词给精确算法步骤(reverse → char codes → chunkSize → 小端 16-bit 打包 → pow → minimal hex → 空格拼接),codex 复刻成功率最高
- codex 跑的同时**并行**:生成测试 RSA 密钥 + 写 Node 金标准 harness
- **codex 写完交付文件后常自我迭代不退出(10min+,会读父代中途放入的文件继续折腾)——独立验证通过即 `process kill`,kill 后重跑一次最终验证锁定产物**(防它 kill 前又改文件)
## 参考
- `references/rsautils-encryptedstring.md` — RSAUtils.encryptedString 逐字节等价细节 + 正方 CAS 链 + Node 金标准 harness 模板
在 GitHub 查看