MDP-Studio/crypto-toolkit
GitHub: MDP-Studio/crypto-toolkit
一个完全在浏览器端运行的交互式密码学教育平台,通过真实执行的攻击算法和逐步数学可视化帮助用户深入理解密码学原理与漏洞利用方式。
Stars: 0 | Forks: 0
# CryptoToolkit
一个通过实践学习密码学的交互式教育平台:包含 36 个学习模块、独立的挑战中心和保证矩阵,涵盖了密码学的工作原理、有效原因以及破解方式。每一次攻击都是真实的:算法会运行到底,并通过真实的数学漏洞恢复秘密,而不是预先计算的模拟。
所有计算均在客户端使用 BigInt 算术和 `crypto.getRandomValues()` 运行 —— 没有服务器,没有跟踪,数据不会离开你的浏览器。
**在线访问:** [ctool.mdpstudio.com.au](https://ctool.mdpstudio.com.au)
## 模块(36 个学习页面)
### 攻击(12 页)
- **Bleichenbacher** — 具有真实区间缩小的 PKCS#1 v1.5 填充预言机(步骤 2a/2b/2c/3/4)。通常在约 10K 次预言机查询内收敛。
- **Padding Oracle** — 真实的 AES-CBC 逆密码解密,逐字节 PKCS#7 恢复跨越所有密文块。
- **ECDSA Nonce Reuse** — 从共享相同 k 的两个签名中提取私钥。包含 PS3 事件背景。
- **GCM Nonce Reuse** — 对密文进行 XOR 以泄露明文关系 + 恢复认证密钥 H。
- **Hash Length Extension** — 具有暴露内部状态的自定义 SHA-256。使用攻击者控制的状态恢复进行真实的 Merkle-Damgard 攻击。
- **Wiener's Attack** — e/n 的连分数展开恢复较小的私钥 d。
- **Hastad Broadcast** — 针对 e=3 的 CRT + 整数立方根(Coppersmith 定理,最简单的情况)。
- **CRT-RSA Fault Injection** — CRT 签名期间的单比特翻转通过 GCD 揭示 p。
- **Textbook RSA** — 通过乘法同态实现密文的可塑性。
- **RSA Factoring** — Pollard's rho + 试除法,恢复 d,解密,验证。
- **DH Small Subgroup** — 恶意生成器泄露对素数小阶数取模的秘密,进行 CRT 组合。
- **ECB Penguin** — 显示模式泄漏的颜色编码块可视化。
### 协议组合
- **AES-GCM** — 基于 GF(2^128) 的 CTR 流密码 + GHASH 多项式认证。包含 Web Crypto 比较。
- **TLS 1.3 Handshake** — ECDHE → HKDF → ECDSA(真实的 `crypto.subtle`)→ AES-GCM 加密的应用数据。
- **HMAC-SHA256** - 逐步的 ipad/opad XOR,带有文本或原始十六进制密钥输入和 Web Crypto 验证的内部/外部哈希。
- **Argon2id** — 通过 WASM Web Worker 进行具有内存密集型特点的密码哈希。SHA-256 计时比较,OWASP 预设。
### 工作流
- **ECDSA Signing** — 哈希 → 签名 → 验证,带有 nonce 唯一性警告和 RFC 6979 解释。
- **AES-128 Round** — SubBytes、ShiftRows(CSS 动画)、MixColumns(GF(2^8) 细节)、AddRoundKey。FIPS 197 向量。
- **Diffie-Hellman** — 带有共享秘密推导的逐步密钥交换。
- **Paillier** — 加法同态加密:密钥生成、加密、同态加法、解密。
- **ElGamal** — 带有同态乘法和有界离散对数的指数 ElGamal。
- **Shamir Secret Sharing** — 多项式拆分,Lagrange 插值,门限重构演示。
### 密码学
- **Elliptic Curve Calculator** — 点加法、标量乘法、Montgomery 梯、baby-step giant-step ECDLP,预设曲线(secp256k1、P-192、P-256)。
- **RSA Key Generator** — 通过 Web Worker 生成 16–2048 位密钥,手动密钥计算,加密/解密。NIST 指出 2048 是过渡期的最低要求;根据 SP 800-57,生产环境应使用 ≥3072 位。
- **Cipher Tools** — Caesar(加密/解密/暴力破解)、Vigenere、ROT13、Atbash,频率分析。
### 数论
- **Modular Arithmetic** — 模逆元,模幂,GCD/扩展 GCD,Euler's totient,模 p 平方根(Tonelli-Shanks),Legendre 符号,Miller-Rabin 素性测试。
- **Integer Factorization** — Pollard's rho + 试除法,totient,除数个数,下一个素数,列出 100K 以内的素数。
### 高级
- **Lattice (LWE)** — 带有误差分析和暴力破解扩展表的后量子加密。
- **Schnorr ZKP** — 带有作弊证明者模式(可靠性演示)的交互式零知识证明。
- **LLL Lattice Reduction** — 带有 Lovász 条件的 2D Gram-Schmidt 正交化可视化。
- **Meet-in-the-Middle** — S-DES 双重加密在 O(2^n) 与 O(2^2n) 暴力破解下的密钥恢复。
- **Birthday Collision** — 截断的 SHA-256 碰撞查找器,演示生日界限(~√N)。
- **Constant-Time Comparison** — 带有计时测量的提前退出与基于 XOR 的字符串比较。演示了*为什么*恒定时间很重要;这些实现本身使用 BigInt(非恒定时间 —— 请参阅上面的注意事项)。
### 实用工具
- **Base & Encoding** — SHA-1/SHA-256 哈希(感知 LF/CRLF),文本↔十六进制/二进制/十进制/base64 转换,进制转换。
- **Substitution Analysis** — 带有频率/双字母组/三字母组分析的交互式密码破解器。
- **EC Curve Plot** — 小素数下所有 F_p 点的散点图,支持交互式选择。
## 挑战中心
在线应用包含一个独立的**挑战中心**,位于 `#/challenges`。它将 CryptoHack 风格的练习提示与计算器和模拟器分开,一次显示一个挑战,在本地存储进度,并链接回相关的学习模块。当前的题库包含 30 个自定义实例挑战,分布在 6 个阶段:初步接触、构建基础、滥用雷达、攻击工作流、密码分析实验室和人脑极限挑战。该题库有意避免了纯查找类的答案,例如算法名称、标准向量名称和通用的定义回忆。
## 保证矩阵
在线应用包含一个**保证矩阵**页面,位于 `#/assurance`。它列出了每个模块及其规范锚点、向量源、测试 ID 和已知限制。相同的数据通过 `npm run assurance` 生成 [docs/assurance-matrix.md](docs/assurance-matrix.md),如果矩阵中缺少某个模块,`npm run ci` 将会失败。
## 测试向量与覆盖率
7 个 Vitest 套件中的 118 个测试,外加针对每个学习模块、挑战中心和保证页面的 Playwright 路由冒烟快照。主要向量来源:
| 模块 | 来源 |
|--------|--------|
| AES-128 ECB | FIPS 197 附录 B(加密 + 独立解密) |
| AES-GCM | NIST SP 800-38D 测试用例 2 & 3 |
| SHA-256 | FIPS 180-4(`"abc"`,空字符串) |
| HMAC-SHA256 | RFC 4231 测试用例 1 & 2,AWS SigV4 kDate |
| Miller-Rabin | 已知素数 + Carmichael 数(561, 1105, 1729, 15841, 41041) |
| MixColumns | FIPS 197 中间状态往返 |
| LWE | 加密/解密往返,密钥生成一致性 |
| Shamir SSS | 已知多项式重构,t-1 不足性 |
| Pollard's rho | 15 位和 14 位半素数分解 |
| Bleichenbacher | 24 位模数上的端到端区间缩小 |
| Hastad broadcast | e=3 CRT 恢复和前置条件拒绝 |
覆盖率报告可通过使用 v8 提供程序的 `npm run coverage` 获取,并包含在 `npm run ci` 中。
## 技术栈
- **React 19** + **Vite 8** — 使用 React.lazy 进行代码分割(主包 220KB,gzip 压缩后 67KB)
- **TypeScript 5.9** — 严格模式,noUnusedLocals,verbatimModuleSyntax
- **Tailwind CSS v4** + **shadcn/ui** — 深色/浅色主题,响应式 320px–1280px+
- **Vitest** - 118 个测试,带有 NIST/RFC/AWS 向量属性和派生的挑战答案检查
- **Playwright** - 跨应用的路线冒烟快照
- **BigInt** — 任意精度,无外部数学库
- **Web Crypto API** — 通过 `crypto.getRandomValues()` 提供 CSPRNG,`crypto.subtle` 用于 ECDSA/AES/HMAC 比较
- **hash-wasm** — 在专用 Web Worker 中运行 Argon2id WASM
- **ESLint** — 通过 `no-restricted-properties` 在全项目范围内禁止使用 `Math.random`
```
npm install
npm run dev # dev server at localhost:5173
npm run build # production build
npm test # 118 Vitest tests
npm run coverage # Vitest v8 coverage report
npm run assurance # regenerate docs/assurance-matrix.md
npm run e2e:routes # Playwright route smoke snapshots
npm run ci # full check: tsc + lint + assurance + coverage + build + routes + prod audit
```
## 架构
```
src/
lib/
ec-math.ts # EC operations, Montgomery ladder, baby-step giant-step ECDLP
crypto-math.ts # RSA, primality, factorization, ciphers, Paillier, discrete log
aes-math.ts # AES encrypt/decrypt (FIPS 197), CTR, GCM, GHASH, GF(2^8/2^128)
sha256.ts # Custom SHA-256 with exposed internal state (for hash extension)
hash-birthday.ts # Birthday-bound truncation helpers
lwe-math.ts # LWE key generation, encrypt, decrypt
hmac.ts # HMAC-SHA256 step computation
hmac-examples.ts # RFC 4231 and AWS SigV4 HMAC examples
hastad.ts # Hastad broadcast attack CRT and cube-root helpers
assurance.ts # Typed assurance matrix accessors
web-crypto.ts # HMAC, HKDF, AES-GCM, ECDH, ECDSA via crypto.subtle
parse.ts # Shared BigInt parsing with 2000-char length guard
utils.ts # UI utility (cn)
hooks/
useDebouncedValue.ts # 300ms debounce for input-triggered computation
usePhaseStatus.ts # Shared workflow phase status (pending/active/complete)
workers/
crypto.worker.ts # RSA keygen worker with BigInt serialization
hash.worker.ts # Dedicated Argon2id WASM worker (loads once, reuses)
components/
Sidebar.tsx # Right-side collapsible nav with category toggles
ErrorBoundary.tsx # Catches computation errors without crashing app
SecurityBanner.tsx # Collapsible timing attack warning
StepCard.tsx # Step-by-step workflow card
AssuranceSummary.tsx # Per-module evidence summary card
ShiftRowsAnimation.tsx # CSS transform animation for AES ShiftRows
pages/ # 37 lazy-loaded page components
data/
module-assurance.json # Spec anchors, vector sources, tests, known limitations
__tests__/
crypto.test.ts # AES, SHA-256, EC math, number theory, LWE test vectors
attacks.test.ts # Attack primitive tests
e2e/
route-smoke.spec.ts # Playwright route smoke and regression snapshots
docs/
assurance-matrix.md # Generated module assurance report
```
## 设计决策
**自定义 SHA-256 而非 Web Crypto。** `crypto.subtle.digest` 不暴露内部状态。哈希长度扩展攻击需要设置一个自定义的初始哈希值(攻击者已知的 MAC 输出)并从任意中点恢复 —— 这在使用密封 API 时是不可能的。从头构建了一个符合 FIPS 180-4 的实现,带有 `getState()` / `resume()`,以使 Merkle-Damgard 漏洞变得有形可见。
**真实的攻击,而非模拟。** 每一个攻击页面都计算了真实的漏洞利用 —— 恢复的明文是算法的输出,而不是通过动画揭示的预先已知的值。这作为一条项目规则被强制执行:任何模拟而非计算的演示都必须明确标注。这种区别在教育上很重要,因为学生需要看到这些攻击是*在计算上可行的*,而不仅仅是理论上可能的。
**带有已记录局限性的 BigInt 算术。** GHASH 长度编码使用 32 位 JS 按位运算(对于小于 268MB 的输入是正确的,已在源码中记录)。`generateRandomPrime` 每次迭代提取新的 CSPRNG 候选项(符合 FIPS 186-5 §B.3.3)。Miller-Rabin 使用 12 个固定见证者 + 在 3.3×10²⁴ 的确定性阈值之上添加 CSPRNG 额外见证者。BigInt 操作不是恒定时间的 —— 计时泄漏与操作数大小成正比(在恒定时间比较页面中已明确指出)。这些是教育工具蓄意设定的范围边界,而不是疏忽 —— 每一个边界都有一个源码注释解释其权衡。
**在 Web Worker 中生成 RSA 密钥。** 生成 2048 位密钥需要迭代的素性测试,这会阻塞主线程 1-5 秒。已将其移至 `crypto.worker.ts`,并带有过期响应防护(`genIdRef`),因此快速重新生成不会应用过时的结果。
## 安全标头
部署在 Netlify(`public/_headers`)和 Vercel(`vercel.json`)上,带有匹配的标头:
| 标头 | 值 | 备注 |
|--------|-------|-------|
| Content-Security-Policy | `script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; worker-src 'self'; frame-ancestors 'none'` | `unsafe-inline` 用于 Tailwind v4 + React `style={}`;`wasm-unsafe-eval` 用于 hash-wasm 的 `WebAssembly.compile()` (Argon2id) |
| Strict-Transport-Security | `max-age=31536000` | 1 年的 HSTS,仅限顶点域(无预加载 —— 请参阅 SECURITY.md) |
| Referrer-Policy | `no-referrer` | |
| Permissions-Policy | `camera=(), microphone=(), geolocation=()` | |
| Cross-Origin-Opener-Policy | `same-origin` | |
| Cross-Origin-Embedder-Policy | `require-corp` | |
| Cross-Origin-Resource-Policy | `same-origin` | |
| X-Frame-Options | `DENY` | |
| X-Content-Type-Options | `nosniff` | |
| Cache-Control | `no-cache`(HTML),`immutable`(带哈希的资源) | |
## 动机
每次做密码学作业时,我都会在不同的浏览器标签页中打开六七个计算器,而教程通常会跳过从输入到答案之间的计算过程。CryptoToolkit 就是我在学习时希望拥有的工具:一个一步数学计算都清晰可见的地方,而且攻击是真实运行的。
## 延伸阅读
- [Cryptopals Challenges](https://cryptopals.com/) — 经典的“通过破解来学习密码学”问题集
- [Dan Boneh's Cryptography Course](https://crypto.stanford.edu/~dabo/courses/OnlineCrypto/) — 斯坦福大学的免费密码学课程
- [RFC 8446](https://datatracker.ietf.org/doc/html/rfc8446) — TLS 1.3 规范
- [NIST SP 800-38D](https://csrc.nist.gov/pubs/sp/800-38d/final) — AES-GCM 规范
- [FIPS 197](https://csrc.nist.gov/pubs/fips/197/final) — AES 规范
- [Twenty Years of Attacks on the RSA Cryptosystem](https://crypto.stanford.edu/~dabo/pubs/papers/RSA-survey.pdf) — Boneh 的 RSA 攻击综述
## 许可证
MIT
标签:AES-GCM, BigInt, Bleichenbacher攻击, CryptoToolkit, CTF训练, Diffie-Hellman, ECB模式, ECDSA, Go语言工具, JSONLines, Padding Oracle, RSA, Web Crypto API, Web安全, 交互式学习, 侧信道攻击, 加密算法, 协议安全, 哈希长度扩展攻击, 安全教育, 密码学, 手动系统调用, 攻击演示, 故障注入, 特征检测, 纯前端计算, 网络安全, 网络安全, 自动化攻击, 蓝队分析, 隐私保护, 隐私保护, 零信任