【AIGC】找遍了全网的 shamir 方案,没有我要的"点击即用"的版本

事情的起因很简单:我想要一个这样的工具——上传任意文件,点一下,得到 n 个分片 + 1 个密文;恢复的时候,凑齐任意 k 个分片,点一下,文件原样回来。全程纯本地计算,不依赖任何后端,部署在一个静态页面就能跑。

我以为网上肯定有一堆现成的。结果把全网翻了个底朝天,发现这个生态位居然是空的。

一、先说我到底要什么

列一下我找了一路的验收标准,也是这个"生态位"的定义:

  • 任意文件——不是助记词,不是口令字符串,就是随便一个文件:照片、文档、游戏存档、压缩包。
  • 混合加密:随机生成一个 key,用 AES-256-GCM 加密文件得到密文;Shamir 秘密共享只用来分片这个 key,而不是分片文件本身。
  • 返回物:n 个分片(每个只有几十字节)+ 1 个密文(和原文件一样大)。
  • 纯前端:加密、分片、重组全部在浏览器本地完成,密文和分片全部本地下载。
  • 能部署在 GitHub Pages:零后端、零服务器、零存储,打开页面就能用。
  • 最好有现成的开源仓库,拿来即用。

为什么是"分片 key 而不是分片文件"?因为 Shamir 分片的总体积是 n × 秘密大小——把整个文件分片,每人要保管一大块跟原文件差不多大的东西,这不叫备份,这叫搬家。先加密、再只分片那 32 字节的 key,每人拿到的就是几行字符,复制、打印、二维码都能装;而密文可以随便丢——R2、U 盘、公共网盘,没有 key 它就是一堆噪声。

这个方案不是我拍脑袋想的,它就是密码学的标准姿势:Vault 的 unseal key、硬件钱包的备份、密码管理器的恢复密钥,全是"加密 + 密钥分片"这套。

二、第一轮搜索:GitHub Pages 上的 shamir,清一色比特币和助记词

我以 “shamir github pages” 开搜,很快就有收获,但也很快发现不对劲:

  • iancoleman.io/shamir——功能最全的 Shamir 秘密共享网页工具,支持拆分/合并、阈值恢复,源码在 iancoleman/shamir,GitHub Pages + 自定义域名部署,是这一行的标杆。
  • huge.github.io/shamir——最标准的 <用户名>.github.io/<仓库> 形式,用 Skulpt 在浏览器里跑 Python 做比特币种子分片,目前还是早期试验。
  • ShamirVault(shamirvault.com)——主打把秘密拆给信任的人,宣传语写着密码、文档、照片都能拆。
  • ssss-made-easy——ssss-js 的前端封装,能生成二维码分片。
  • 以及一长串 shamir39 / slip39 系列:iancoleman/shamir39、StrongShamir39、shamir39b……全是 BIP39 助记词分片。

看出来了吧:GitHub Pages 上的 shamir 工具,99% 都长在"比特币钱包助记词备份"这一个生态里。字符串进,字符串出,界面长得跟加密货币钱包教程一样。

文件呢?一个都没有。

三、被点破:文件版为什么没人做

我本来还在困惑——搜"文件形式"的 shamir,怎么全是 CLI 库。然后我自己想明白了:GitHub Pages 是纯静态托管,没有后端。要做"上传文件 → 云端保存分片 → 在线分享"这种闭环,必须接对象存储,比如 Cloudflare R2。

但接了 R2 又有容量焦虑:10GB 免费额度,n 份分片全存上去等于 n 倍文件体积,很快见底。

于是绕了一圈又绕回原点:根本不需要把分片都存云端。k-of-n 的特性就是"凑齐 k 份就够",云端只放 1~2 份甚至只放密文,其余分片让参与者各自离线保管。安全模型反而更好——攻击者拿到云端的几片,也毫无信息量。

再往前一步,就是我开头说的混合加密:密文放哪都行,分片的只是 key。容量问题直接消失。

四、第二轮搜索:现成的仓库,一个能打的都没有

带着"上传文件 → 返回 n 个分片 + 1 个密文"这个明确标准,我又搜了一圈。候选不少,但每个都差一口:

项目形态差在哪
katvio/fractumCLI / Docker技术方案和我想要的一模一样:AES-256-GCM 加密 + Shamir 分片密钥 + K-of-N + 全离线,MIT 开源。但它是命令行工具,没有网页,无法部署到 GitHub Pages。
boazeb/papervaultReact Web 应用网页形态的"加密 + 分片 key",代码里就是 splitKey(cipherKey, n, t)。但定位是"打印纸质保管密钥",不是文件上传。
dividuum/html-vault静态 HTML基于 secrets.js 的自包含工具,分片本身就是自包含 HTML。但只处理文本内容。
@papervault/corenpm 库AES-GCM + Shamir 分片 key + HTML 生成,纯 JS。但它是库,不是开箱即用的站点。

底层库倒是很成熟:amper5and/secrets.js(2019 年审计过,任意字节分片)、privy-io/shamir-secret-sharing(TypeScript,GF(2⁸),直接吃 Uint8Array,浏览器 Node 通用)。也就是说,砖头全是现成的,就是没人砌墙。

五、彩蛋:追着 PGPony 找到了 QuorumPony

差点忘了最漂亮的一个。我突然想起一个叫 PGPony 的作者,觉得他做过类似的东西,一查——还真有。

作者叫 NorseHorse(GitHub 组织 norsehorse-dev),一个人维护了 9 个隐私小工具,组了个"Pony 家族":PGPony(OpenPGP)、ScrubPony(图片脱敏)、BurnPony(阅后即焚笔记)、CarrierPony(端到端加密通信)……其中一个叫 QuorumPony,就是 Shamir 秘密共享:

  • 官网 slogan:“Split a key into cards. Any few rebuild it."——把密钥拆成卡片,任意几张恢复,单张毫无信息量。
  • 开源核心 Apache-2.0:constant-time Shamir over GF(2⁸),零外部依赖,代码公开可审计。
  • 全离线、无服务器、无账号、无埋点;卡片可打印成 PDF、可扫码;支持六种语言;iOS / Android / macOS / Windows / Linux 全平台。
  • 输入是文本或 key 文件,卡片格式是标准 GF(2⁸) 分片,跨平台互通。

做得很克制、很专业,是我这次搜索里看到的质量最高的成品。但注意它的定位——还是"密钥备份”:保护的是钱包助记词、SSH/PGP 私钥、密码管理器恢复码。它分片的仍是"秘密字符串",不是"上传的文件"。

离我要的东西,就差最后一步。而这最后一步,就是没人迈出去。

六、生态位缺失

我知道有的人了解到 并使用 shamir 的时候已经对隐私执着到了一定程度了,所以联网这种危险动作估计是困难的,但如果作为一个好玩的分片小工具,这就是完全的生态位缺失。

什么意思呢?严肃隐私用户不需要网页版——他们会用 Trezor 的 SLIP-39、会用全离线的 CLI、会把手写卡片放进保险柜,这是完全正确的选择,网页版对他们反而是风险。但 shamir 的价值不只在"国家安全级"场景:

  • 把游戏存档拆成 3 份,交给两个朋友 + 自己留一份;
  • 给某个小群里的人一人一张"开盲盒"的分片,凑齐才揭晓彩蛋;
  • 把家庭相册的加密密钥拆开,散给家人,应急时才能打开;
  • 只是想体验一下"信息论安全"到底是什么感觉。

这些人想要的是:打开网页、拖一个文件、点两下、拿到一堆分片——不注册、不装软件、不学命令行、不上传任何东西。这个位置,GitHub Pages 上真的没有人站。

生态位缺失得明明白白:字符串分片有标杆(iancoleman)、密钥卡片有标杆(QuorumPony)、命令行有标杆(fractum、ssss),唯独"文件进、分片+密文出、点击即用“这个点,砖头齐了,墙没人砌。

七、所以呢

要么我来填这个坑。

其实路径已经非常清晰:secrets.js 或 privy-io/shamir-secret-sharing 当分片引擎,Web Crypto API 做 AES-256-GCM,一个单页 HTML 包住加密、分片、下载、重组四个动作,推到 GitHub Pages 就是成品——零后端,密文和分片全部本地落地,R2 都不用接。

如果你也想要一个"点击即用"的 shamir 文件小工具,欢迎留言,一起把它砌起来。