systemslibrarian/crypto-lab-silent-tally
GitHub: systemslibrarian/crypto-lab-silent-tally
浏览器端的安全多方计算演示,通过Shamir秘密分享让五家医院在不泄露各自入组人数的情况下计算出总和。
Stars: 0 | Forks: 0
# silent-tally
**安全MPC在浏览器中** — 五家医院计算综合临床试验入组人数,而不暴露各自的计数。Shamir SSS · 加法同态 · GF(2⁶¹−1) · 无需可信第三方。
**[▸ 现场演示](https://systemslibrarian.github.io/crypto-lab-silent-tally/)**
属于 [systemslibrarian crypto-lab 集合](https://github.com/systemslibrarian)。
## 为何存在此项目
五家医院正在合作开展一项全球临床试验。监管机构需要所有机构的综合入组总人数。每家医院都持有其私有的入组数量——这些数字不会与同行机构共享,不会与监管机构共享,也不会与任何中央服务器共享。
核心问题是:五方各持有一个私有数字。他们想共同计算一个关于这五个数字的函数——在本例中是求和。 naive的解决方案都会失败:
- **将所有数据发送到中央服务器** → 服务器会获知所有五个私有输入。违反HIPAA,单点故障,需要信任。
- **将数字相互发送** → 同样存在问题。医院A现在知道了医院B的入组人数。
- **信任某个人** → 没有每个人都信任的人。
### MPC的作用
多方计算(MPC)让各方能够计算函数的输出,而任何一方都不会获知他人的输入。医院获知总数。没有人获知个别计数。没有中央服务器。没有可信第三方。协议本身在数学上强制执行隐私。
### 为什么Shamir SSS能实现这一点
当您将数字秘密分享为多项式时,这些份额本身毫无意义——它们看起来像随机的域元素。但份额具有**加法同态**特性:如果将每方多项式的一个份额相加,结果本身就是所有秘密*之和*的份额。因此,每家医院可以对其持有的份额计算本地求和,广播该结果,然后对这些广播值进行拉格朗日插值来重构总数——而且只有总数。
其洞见在于,计算是在秘密分享方案*内部*发生的。数学以一种产生答案的方式坍缩,而输入从未在一个地方汇集。
### 安全保证
这是**信息论意义上的**——而非计算意义上的。持有少于*t*个份额时,您不仅仅是缺乏破解它的计算能力。您实际上拥有**零信息**。每个可能的秘密都与您持有的份额一致。没有量子计算机、没有算法突破、没有足够的时间能改变这一点。这比"暴力破解需要十亿年"是一个根本更强的保证。
这就是MPC的意义,也是为什么这个演示值得构建的原因
## 五家医院
| ID | 机构 | 预设入组人数 |
|----|-------------|----------------------|
| 1 | 日内瓦医学研究所 | 1,247 |
| 2 | 首尔研究中心 | 983 |
| 3 | 约翰霍普金斯临床部 | 2,104 |
| 4 | 拉各斯大学医院 | 761 |
| 5 | 圣保罗临床中心 | 1,589 |
所有计数均可由用户编辑(1–9,999)。在协议完成前,总数永远不会泄露。
## 密码学原语
| 原语 | 实现 |
|-----------|---------------|
| **有限域** | GF(2⁶¹ − 1) — 梅森素数,足够容纳 5 × 9,999 = 49,995 |
| **秘密分享** | Shamir SSS,阈值 t = 3,方数 n = 5 |
| **重构** | GF(p) 上的拉格朗日插值 |
| **同态** | 加法 — 份额级加法产生和的份额 |
| **RNG** | `getrandom` crate 配合 `wasm_js` 特性(浏览器 CSPRNG) |
| **模逆** | 费马小定理:a⁻¹ = a^(p−2) mod p |
| **溢出防护** | 乘法前使用 u128 中间值,然后进行梅森约简 |
所有运算都是真实的。没有模拟计算。没有模糊处理。每个原语都经过实现和测试。
## 六个展示
演示以逐步导航的形式构建。用户手动推进——没有自动播放。
1. **问题** — 五个带有锁定入组数据的医院卡片,naive方案与MPC对比图
2. **私有输入** — 可编辑的入组计数,每家医院都有锁定机制
3. **秘密分享** — 多项式构造,随机系数,计算出的份额,曲线可视化
4. **份额分发** — 5×5 份额矩阵,点对点流程图
5. **计算与重构** — 本地求和,带公式和真实值的拉格朗日插值,总数揭示与交叉验证
6. **联盟攻击** — 选择最多2个共谋者,观察攻击失败,欠定系统的多曲线可视化,阈值分析
## 架构
```
crypto-lab-silent-tally/
├── Cargo.toml # Rust crate: wasm-bindgen + getrandom
├── src/
│ └── lib.rs # GF(p) arithmetic, Shamir SSS, Lagrange interpolation
├── pkg/ # wasm-pack output (gitignored)
├── src-ts/
│ ├── main.ts # App entry, exhibit navigation, state management
│ ├── wasm.ts # WASM init and typed bindings
│ ├── types.ts # Hospital, ShareData, AppState interfaces
│ ├── style.css # Tailwind entry
│ └── exhibits/
│ ├── exhibit1.ts # The Problem
│ ├── exhibit2.ts # Private Input
│ ├── exhibit3.ts # Secret Sharing
│ ├── exhibit4.ts # Share Distribution
│ ├── exhibit5.ts # Computation & Reconstruction
│ └── exhibit6.ts # Coalition Attack
├── index.html
├── vite.config.ts
├── tsconfig.json
└── package.json
```
**技术栈:** Rust → WASM(通过 `wasm-pack`)+ Vite + TypeScript(严格模式)+ Tailwind CSS v4 → GitHub Pages
## 构建
```
# 前置要求:Rust, wasm-pack, Node.js ≥ 18
# 构建 WASM
wasm-pack build --target web --out-dir pkg
# 安装前端依赖项
npm install
# 开发服务器
npm run dev
# 生产构建
npm run build
```
## Shamir 三部曲
crypto-lab 集合中的三个项目使用 Shamir 构造,分别在三个不同的域上实现三个根本不同的密码学应用:
| 项目 | 域 | 应用 |
|---------|-------|-------------|
| [quantum-vault-kpqc](https://github.com/systemslibrarian/quantum-vault-kpqc) | GF(2⁸) | 密钥分割 — 基于 XOR 的字节级数据秘密分享 |
| [frost-threshold](https://github.com/systemslibrarian/frost-threshold) | Ed25519 标量域 | 阈值签名 — 无需密钥组装的分布式签名 |
| **silent-tally** | GF(2⁶¹ − 1) | 算术MPC — 通过加法同态实现安全求和计算 |
相同的数学理念。三种根本不同的密码学应用。
## 状态
这是一个演示和教育工具。密码学原语是标准的、经过公开审查的算法(Shamir SSS、拉格朗日插值、梅森素数域运算)。该实现尚未经过外部审计。在专业审计之前,请勿在生产安全关键系统中使用此代码。
*所以,你们或吃或喝,或作什么事,都要为荣耀神而行。* — 哥林多前书 10:31
标签:AI工具, GF(2^61-1), meg, MPC, Shamir秘密共享, 临床试验, 信息安全, 分布式计算, 加法同态, 医疗数据安全, 可视化界面, 多方协作, 安全多方计算, 密码学, 异常处理, 手动系统调用, 数据聚合, 有限域, 浏览器端加密, 秘密共享方案, 秘密分享, 网络安全, 自动化攻击, 阈值密码学, 隐私保护, 隐私计算, 零知识证明