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秘密共享, 临床试验, 信息安全, 分布式计算, 加法同态, 医疗数据安全, 可视化界面, 多方协作, 安全多方计算, 密码学, 异常处理, 手动系统调用, 数据聚合, 有限域, 浏览器端加密, 秘密共享方案, 秘密分享, 网络安全, 自动化攻击, 阈值密码学, 隐私保护, 隐私计算, 零知识证明