Codex32:沙米尔秘密共享计划
Blockstream Research

Codex32:沙米尔秘密共享计划

Andrew Poelstra

自 2020 年以来,我与 Blockstream 研究公司一起,一直在研究没有电子计算机的密码学。这并不是什么新想法:20 世纪之前的整个密码学历史都是这样。但是,拥有百位数字和复杂算法的现代密码学一直在使用计算机。这是有充分理由的:计算机可以在十亿分之一秒内完成人类可能需要几分钟才能完成的操作。

对于可手动计算的密码系统来说,十亿倍的速度减慢是最不容易解决的问题。人类不仅速度慢,他们能同时记住的精确指令也有限,阅读这些指令的耐心也有限,而且他们很难长时间进行繁琐的计算。人类还经常犯错,即使是他们以前多次成功做过的事情。

事实证明,尽管秘密数据的管理非常复杂,但我们仍然可以借助可以打印和剪切的工作表和简单工具,手工完成许多操作。

今天,我们推出了《Codex32:沙米尔秘密共享计划》,这是一本新的小册子,可在 Blockstream 商店购买。Codex32 包含校验和与秘密共享的可撕工作表、可剪裁和组装的纸质计算机、消除掷骰子偏差的工作表,以及由 Micaela Paez 和 M. Lufti' As'ad 创作的精美插图。

我们将探讨法典的作用,但首先,让我们来谈谈从本文章第一句话开始就一直困扰着你的问题: 为什么?

Codex32 背后的前提是,你将生成、校验和拆分一个 BIP 32 主种子,并从中导出比特币地址。

为什么要手工计算?

电子计算机非常神奇。它们的运算速度远远超过人类,而且不会出错,可以连续数年不休息,也不会感到无聊。但是,超人的速度意味着人类无法真正检查它们的行动。

这不仅仅是哲学问题。正是因为这个问题,我们才有了价值数十亿美元的网络安全产业和开源软件运动。这也是安全研究人员坚持要求投票机生成可人工计数的纸质记录的原因。计算机可能会被恶意软件感染,它们的代码可能是恶意的,它们可能会通过旁路或未删除的方式泄露秘密数据,它们还可能存在漏洞。这些问题在软件方面几乎难以解决,但在硬件方面也同样如此,因为硬件验证需要复杂的工具和专业知识。正如《监控资本主义时代》一书所详述的,即使是 "正常工作 "的计算机,也很可能会损害用户的利益。

每当您更换硬件或更新软件时,所有这些问题都会重新出现。(如果不升级软件,这些问题就会无限制地增加。

在我们的日常生活中,我们大多接受这些事情,将其视为成为数字社会一部分的代价,但当涉及到控制比特币等不记名资产的密钥数据时,这种代价可能就太大了。

通过纸笔计算,我们可以确保没有秘密数据出现在我们没有书写的地方。我们可以以透明的方式创建自己的随机数据。我们可以选择进行各种操作所需的时间,从而混淆定时攻击。我们可以确信,只要我们的指令被写在某个地方,也许被打印出来并保存在保险柜里,我们的程序就会保持兼容。这些保证不仅真实,而且让人感觉真实,让我们感到安心,这是电子计算机永远无法做到的。

脑钱包和纸钱包

这些想法可能会让读者想起 BitcoinTalk 论坛上流传的一些老想法。比如 "纸钱包",用户可以在纸上写下种子(或私钥),然后离线存储。Cryptosteels 或 ColdTi 等金属设备是这一想法的自然延伸,它们更有可能在自然灾害或被水淹没的地下室中存活下来。

离线存储种子数据是提高比特币安全性的一个好主意。建议使用某种金属装置,不过无酸纸也可以放在干燥防火的地方。这种存储方式需要在创建更多副本(增加被盗风险)或创建更少副本(增加丢失风险)之间做出权衡。代码盒允许用户将数据分成多个 "共享",只有将足够多的 "共享 "集中在一起才能恢复原始数据,从而为用户提供了更大的自由度。

同一时代的另一个想法是 "大脑钱包"(或 brainwallet),用户只需记住自己的秘密数据,而无需物理备份。我们强烈反对这种做法。这样做的一个问题是,它会鼓励用户选择太短、结构性太强或存在于印刷文献中的弱种子。即使用各种方法对这些种子进行调整,它们也没有足够的信息来抵御计算能力强大的攻击者。最早的比特币骗局之一是一个网站,旨在 "帮助 "用户制作这种弱种子,供大脑钱包使用。

归根结底,问题在于很难记住好的随机性。常见短语、诗歌片段和小故事的结构让人过目难忘,也让攻击者更容易猜出你的话。

大脑钱包的第二个问题是,人类的记忆是容易出错的。我们很容易说服自己,我们是那种高智商的人,记忆不会出错。但是,如果你撞到头、发烧、经历外伤,或者几年后干脆失去了进行记忆恢复仪式的动力,那么聪明也无济于事。

产生种子数据的正确方法是产生至少 128 比特的均匀随机数据,而存储这些数据的正确方法是在大脑之外。法典提供了一种通过掷骰子和应用冯-诺依曼提取器消除偏差来生成此类数据的方法。还有其他方法可以从骰子中获得良好的种子,通常被称为骰子器。

您究竟能亲手完成多少工作?

有了这些背景知识,让我们来讨论一下用户可能想用种子备份做的各种事情。

  • 验证备份的完整性。
  • 确认备份所控制的硬币没有移动。
  • 如果是秘密共享备份,则重新分割备份。
  • 从备份中恢复或初始化新钱包。

有些用户可能想跳过 "新钱包",直接在纸上完成一切。遗憾的是,目前还没有办法在不使用电子设备的情况下推导地址或签署交易。不过,我们可以完成上述任务。

验证备份的完整性。长期存储介质可能会损坏或磨损,导致无法读取。有一种机制可以检测和修复少量独立错误,称为纠错码或校验和。代码集提供了工作表,使用户能够创建和验证其数据的校验和。如果校验和通过,则一切正常。如果没有通过,就说明有错误。创建校验和的过程需要 30-60 分钟,而且需要做两次才能发现第一次出现的错误。验证校验和也需要同样的时间,而且只需要做一次。验证硬币是否还在。离线备份在检查区块链状态方面无能为力。相反,您可以使用在线手表钱包来监控区块链上的任何币值变动,而无需访问秘密数据。

分割和重新分割备份。这是 codex32 最有趣、最强大的功能。Codex32 提供的工具可将秘密分割成多个 "份额",这样就可以通过一定数量的 "份额 "来恢复秘密。典型的阈值为 2 或 3。如果攻击者拥有的共享数量少于这个阈值,他们就什么也学不到。

使用 codex32 的过程是,用户生成阈值数量的随机初始共享,然后使用这些共享,根据需要生成额外的共享,总共最多 31 个。之后,只要有足够多的份额,他们就能重构秘密。

派生过程可确保如果初始共享具有有效的校验和,那么派生的共享和最终密文也会自动具有有效的校验和。这意味着你可以创建初始共享,计算其校验和,派生其他共享,并验证其校验和--如果你在这个繁琐的过程中犯了任何错误,校验和工作表就会发现。

每个输入份额的推导大约需要 5-10 分钟,最后的校验和检查需要 30-60 分钟。

恢复或初始化新钱包。钱包可以使用 codex32 共享来初始化自己。这个过程与使用种子字的现有工作流程大致相同。

目前,比特币核心(Bitcoin Core)有一个支持 codex32 的公开拉取请求,Bails 使用的核心版本中就包含了 codex32。其他几个钱包也表示打算最终支持 codex32,包括 Blockstream Green、Anchorwatch 和 Liana。这种支持的技术难度与 2016 年支持 Segwit 地址的难度相当,只是更容易,因为 codex32 重用了许多相同的逻辑。

下一步是什么?

Codex32 的下一步工作是改进钱包支持。这意味着要改进和完善 rust-codex32 库,并在 BDK 中引入支持。

我们还希望实施纠错逻辑,并扩展 codex32 网站,以支持纠错和更多互动功能。纠错目前需要计算机。但至少对于单个错误,我们计划使用查找表实现手工纠错。

该法典有拆分和校验秘密的说明。但对于下一步该怎么做,它并没有提供很多指导:向你信任的人分发共享信息,并制定计划来验证它们的完整性。

我们希望建议人们每年都核查自己的股票,但目前的程序设置起来很麻烦:你需要重新阅读说明,也许还要组装新的纸质电脑,然后花 30-60 分钟进行核查。如果失败了,在没有纠错表的情况下,你还需要重新做一遍。因此,这不是一个现实的建议。

不过,我们有一个解决方案:快速检查是部分校验和检查,仍能检测出 99.9% 的错误,而且可以包含在一张纸上(指令、查找表等)。一共有七种快速校验,加在一起相当于一个完整的校验和校验。用户可以在股票中存储多份全套副本;然后每年只需抓取下一页,按照说明填写(只需 10-15 分钟,而不是 30-60 分钟),然后销毁。

现在,快速检查只是作为数学存在。我们需要做的工作包括创建工作表、调整参数和编写说明。

上述计划需要我们花点心思,但我们对未来的研究有一些大的想法。是否有可能像 BIP 32 中那样,通过给定的种子计算哈希值,推导出更多的种子?是否有可能执行椭圆曲线乘法,从而推导出地址并签署交易?是否可以执行加密或握手协议?到目前为止,我们还不得而知。

If you have specific preferences, please, mark the topic(s) you would like to read: