systemslibrarian/crypto-lab-elgamal-plain

GitHub: systemslibrarian/crypto-lab-elgamal-plain

纯浏览器端的 ElGamal 公钥加密教学实验室,通过交互式可视化演示加密、同态性、重随机化、签名及经典攻击原理。

Stars: 0 | Forks: 0

# crypto-lab-elgamal-plain 基于浏览器的 ElGamal 公钥加密演示,实现了 Taher Elgamal 在 1985 年提出的方案,基于 RFC 3526 Group 14(2048 位)以及用于透明算术运算的 11 位玩具群。 ## 它是什么 该项目是一个纯教育性质的、无需后端的明文 ElGamal 加密实验室: - 以**引导式演练**开场,通过实时数值逐步演示一个完整的加密/解密过程 - 所有模运算均使用 BigInt - 使用平方-乘法(square-and-multiply)进行模幂运算 - 所有随机性均使用 `crypto.getRandomValues` - 演示了天然的非确定性(每次使用新的临时 `k`) - 通过交互式 `g^x mod p` 散点图可视化离散对数求解的困难性 - 演示了乘法同态性 - 演示了密文重随机化,实现 mix-net 风格的不可追踪性 - 在原根群上实现了 **ElGamal 签名方案**(签名 / 验证) - 包含交互式的**安全实验室**,让你亲自破解该方案 - 包含 ElGamal 与 RSA 的并排对比展示 该应用包含两组参数: - TOY 群(`p = 2039`),便于在 UI 中直观查看数学过程 - RFC 3526 Group 14,展示真实大素数环境下的行为表现 ## 何时使用 当你想要达到以下目的时,可以使用本项目: - 理解为什么 ElGamal 是 DSA 的直接前身,且在结构上也是 ECDSA 的前身 - 通过逐步执行具体的算术运算来学习离散对数公钥加密 - 查看核心的同态行为:密钥文相乘,解密得到乘积 - 理解重随机化如何支持 mix-net 和隐私电子投票 - 为门限 ElGamal 及相关的分布式解密系统建立直观认识 请勿将其用于批量文件加密。明文 ElGamal 密文体积庞大且具有延展性;生产系统应使用混合认证加密。 ## 在线演示 https://systemslibrarian.github.io/crypto-lab-elgamal-plain/ ## 开发与测试 ``` npm install npm run dev # local dev server npm run build # type-check (tsc) + production build npm test # Vitest suite (run once) npm run test:watch ``` 已提交的 Vitest 测试套件证明了每个原语和每种攻击的正确性,因此这些 教育性声明是永久性且经过回归检查的,而非随意提出: - `modular.test.ts` — modexp、扩展欧几里得算法、模逆、拒绝采样随机数、素性检验 - `elgamal.test.ts` — 加密/解密往返、非确定性、同态性、重随机化、文本编解码 - `attacks.test.ts` — baby-step/giant-step 密钥恢复,以及拒绝在 2048 位群上执行的可行性保护机制 - `authenticated.test.ts` — 认证往返测试,以及对延展性篡改和伪造 tag 的拒绝 - `signatures.test.ts` — 签名/验证、伪造拒绝、同余求解器,以及从重用 nonce 中完全恢复密钥 CI 会在每次 pull request 时运行测试套件(`.github/workflows/ci.yml`),并且只有成功通过测试(绿灯)才会执行 GitHub Pages 部署(`.github/workflows/deploy.yml`)。 ## 安全实验室 该应用不仅描述了失败模式,还让你亲自触发它们并观察其中的数学原理: - **破解密钥(展示 4):** 通过 baby-step/giant-step 离散对数求解器(`src/attacks.ts`),从公钥恢复玩具私钥。同样的程序对 2048 位群实施了严格的硬保护,将安全论证直接编码到代码中。 - **临时密钥重用(展示 5):** 在一次重用的 `k` 下加密两条消息;共享的 `c1` 使得知道其中一条明文的攻击者只需进行一次模除法即可恢复另一条明文——完全不需要私钥。 - **密文延展性(展示 6):** 攻击者在没有密钥且不知道明文的情况下,将 `c2` 乘以一个因子 `t`,而所有者的解密结果会悄无声息地变成 `m·t`,这说明了为什么明文 ElGamal 不是 CCA 安全的。 - **认证 ElGamal —— 修复方案(展示 7):** 一种 DHIES/ECIES 风格的构造(`src/authenticated.ts`)从 Diffie-Hellman 共享密钥中派生出 HMAC-SHA-256 密钥,并对密文进行 tag 标记。原先展示 6 中的攻击现在会被检测到,并且解密会被拒绝——代价是牺牲了同态性,正是这种权衡促使投票系统倾向于使用 Cramer-Shoup 或零知识证明。 - **签名 nonce 重用 —— 密钥完全恢复(展示 9):** 使用相同的 `k`(`src/signatures.ts`)签署两条消息会使签名共享 `r`;求解由此产生的线性同余方程即可恢复签名者的整个私钥。这就是真实的 Sony PS3 ECDSA 被破解的原理,其后果比加密侧重用(展示 5)导致的单条消息泄露要严重得多。 ## 可能出现的问题 - 明文 ElGamal 具有延展性。攻击者可以通过代数方式将密文转换为相关的明文。(展示 6) - 重用临时 `k` 是灾难性的:在加密中它会导致消息泄露(展示 5),而在签名中会泄露整个私钥(展示 9)。 - 弱消息编码可能会泄露数据结构(`m=0`、`m=1` 或低熵域)。 - 玩具群是故意设计为不安全的,可以通过暴力破解。(展示 4) - 后量子时代提示:在大型量子计算机上,基于有限域的 ElGamal 会被 Shor 算法破解。 ## 实际应用场景 Taher Elgamal 在 1985 年发表的论文《_A Public Key Cryptosystem and a Signature Scheme Based on Discrete Logarithms_》引入了一种实用的、基于 DLP 的公钥设计,对现代密码学产生了深远影响。 - DSA 将 ElGamal 的签名体系进行了标准化 - 门限 ElGamal 用于分布式解密和投票 pipeline - 指数 ElGamal 出现在隐私保护计票系统中 - Cramer-Shoup 可以被看作是 ElGamal 家族的一种加固构造 - RFC 3526 Group 14 广泛部署于历史上的 DH 部署中(IPsec、SSH、TLS 1.2 有限域 DH)
标签:ElGamal, TypeScript, 加密算法, 安全插件, 密码学, 手动系统调用, 教育工具, 自动化攻击