Keyless 钱包

私钥分片恢复和刷新原理介绍

Keyless 钱包核心使用 MPC 协议中的分布式私钥分片恢复协议实现,此部分首先介绍 Keyshare 的结构,然后介绍私钥分片恢复协议和刷新协议对私钥分片结构的影响,为理解如何使用 Safeheron MPC Node 套件构建 Keyless 钱包打下理论基础。

私钥分片 Keyshare 的结构

一个私钥分片不是简单的一个密钥,而是包含了多个密钥、其他参与方私钥分片公钥及一些公开信息的数据集合。这里我们重点关注私钥分片中的密钥组成,了解完私钥分片中的密钥结构后,我们再来看私钥分片恢复协议和刷新协议对私钥分片结构的影响。

Fig 1. 私钥分片中的密钥分类

一个私钥分片的密钥可以分为两类:

(1)和实际单私钥相关的密钥,即和资产控制权相关的密钥,我们称之为资产密钥(Asset Secret),包含密钥 x 。

(2)多个参与方之间执行 MPC 协议需要的密钥,我们称之为协议密钥(Protocol Secrets),如其中包含了 Paillier 密钥等。

一个私钥分片中如果丢失了 Protocol Secrets 或者和其他参与方的 Protocol Secrets 不配套,将不能正常执行 MPC 协议;但是如果 Asset Secret 存在,我们依然可以使用满足门限个数的 Asset Secret 恢复单私钥。

分布式私钥生成协议

Fig 2. 分布式私钥生成协议生成的私钥分片

分布式私钥生成协议生成一组 KeyId 为 1 的私钥分片 A、B、C,每个私钥分片有各自的 Asset Secret 和 Protocol Secrets。

私钥分片恢复单私钥

恢复单私钥需要 A、B、C 中任意两个私钥分片的 Asset Secret,比如使用私钥分片 B 和私钥分片 C 恢复单私钥,原理上只需要使用 x2、x3 再加上 chaincode 和 BIP44 路径即可恢复单私钥。

私钥分片恢复协议

Fig 3. 执行私钥分片恢复协议后得到的私钥分片

通过 KeyId 1 中的私钥分片 A 和 C,使用私钥分片恢复协议得到新的一组私钥分片A’、B’、C’,这一组私钥分片中,A’ 中的 Asset Secret 和 A 中一致,没有变化,B’ 和 C’ 同理。A’、B’、C’ 三个私钥分片中只有 Protocol Secrets 发生了变化。

由于 B’ 和 B 的 Asset Secret 没有发生变化,因此使用私钥分片 B’ 和私钥分片 C 也可恢复单私钥。

由于 A’、B’、C’ 三个私钥分片中只有 Protocol Secrets 发生了变化,因此无法使用 A 和 B’ 执行 MPC 签名协议。

私钥分片刷新协议

Fig 4. 执行私钥分片刷新协议后得到的私钥分片

通过 KeyId 1 中的私钥分片 A 和 C,使用私钥分片刷新协议得到新的一组私钥分片A*、B*、C*,这一组私钥分片中,A* 中的 Asset Secret 和 A 中发生了变化,B* 和 C* 同理。A*、B*、C* 三个私钥分片中 Protocol Secrets 也发生了变化。因此无法使用私钥分片 B* 和私钥分片 C 恢复单私钥,必须使用同一组 KeyId 中的私钥分片恢复单私钥;也无法使用 A 和 B* 执行 MPC 签名协议,必须使用相同组的私钥分片执行 MPC 协议。

Keyless 钱包场景和核心思路

此部分以一个实际案例介绍如何基于 Safeheron MPC Node 套件构建一个面向 C 端用户的 Keyless 钱包,门限为 2/3,其中开发者服务器持有一个私钥分片 A,开发者的浏览器应用/手机应用中持有两个私钥分片 B 和 C。

图 1 创建钱包和备份时的私钥分片分布

(1)在用户创建钱包时,使用浏览器应用/手机应用和开发者的服务端进行分布式私钥生成,得到 KeyId 1 一组私钥分片,其中服务端生成私钥分片 A,浏览器应用/手机应用生成私钥分片 B 和 C。

(2)在用户使用钱包发送交易时,使用 KeyId 1 浏览器应用/手机应用中的私钥分片 B 和开发者服务端的私钥分片 A 进行分布式签名。

(3)开发者只帮助客户保管了私钥分片 A,私钥分片 B 和 C 由用户自行保管。为了实现 Keyless 效果,我们将用户生成的私钥分片 C 定义为备份私钥分片,开发者在自己的应用中实现将私钥分片 C 备份到用户自己的掌握的云服务中功能, 如备份到 iCloud 或者 Google Drive,备份完成后删除 App 中的私钥分片 C。

iCloud 或者 Google Drive 中的私钥分片是否需要加密?
图 2 使用私钥分片 C 进行分布式私钥恢复后的私钥分片分布

(4)当用户删除应用/手机丢失/更换设备时,私钥分片 B 丢失,此时开发者应用提供恢复功能,将用户云端的私钥分片 C 恢复到应用中,使用 KeyId 1 中的应用私钥分片 C 和服务端私钥分片 A 进行分布式私钥恢复,协议运行完成后,得到一组新的 KeyId 2,服务端生成新的私钥分片 A’,应用中生成新的私钥分片 B‘ 和 C‘。然后删除应用中的私钥分片 C 和 C‘。

为什么要删除应用中的私钥分片 C ?

(5)恢复后使用钱包发送交易时,用户签名使用 KeyId 2 中的服务端私钥分片 A‘ 和 应用中的私钥分片 C’ 进行签名。

服务端私钥分片 A 和应用中私钥分片 B’ 能否执行 MPC 分布式签名协议?
图 3 再次使用私钥分片 C 进行分布式私钥恢复后的私钥分片分布

(6)当用户再次删除应用/手机丢失/更换设备时,私钥分片 B‘ 丢失,此时流程类似步骤(4),开发者应用提供恢复功能,将用户云端的私钥分片 C 恢复到应用中,使用 KeyId 1 中的应用私钥分片 C 和服务端私钥分片 A 进行分布式私钥恢复,协议运行完成后,得到一组新的 KeyId 3,服务端生成新的私钥分片 A’’,应用中生成新的私钥分片 B‘’ 和 C‘’。然后删除应用中的私钥分片 C 和 C‘‘。

如何处理服务端的私钥分片 A’ ?

(7)恢复后使用钱包发送交易时当用户再次签名时,使用 KeyId 3 中的服务端私钥分片 A‘‘ 和应用中的私钥分片 C’’ 进行签名。再次使用私钥分片 C 恢复时重复步骤(5)(6)即可,择机删除服务端的 A’ 以提升安全性。

什么时机删除私钥分片 A’ 最合适?
图 4 私钥分片恢复的核心原理示意图

Keyless 的核心流程为使用 KeyId 1 中的服务端私钥分片 A 和应用中私钥分片 C可以多次恢复一组新的 keyId,和对应的新的一组私钥分片 A’,B’,C‘。开发者务必保证不要删除服务端的 KeyId 1,以及务必保证备份到用户云盘中的私钥分片 C 和服务端的 A 是相同的 keyId,不同 KeyId 的 A 和 C,如 KeyId 1 的 A 和 KeyId 2 的 C 无法进行分布式私钥恢复协议。

(8)恢复单私钥

当用户不想使用开发者服务,希望恢复单私钥时,用户可以使用存储在自己云端的私钥分片 C,以及应用中的 B’ 或者 B’’ 合成单私钥。

除了 C 和 B’ 可以合成单私钥,还有哪些组合可以合成单私钥?
如果新恢复的一组私钥分片 A’、B’、C’ 使用了刷新协议,刷新得到一组新的私钥分片 A’*、B’*、C’*,哪些组合可以合成单私钥?

(9)刷新私钥分片

为了提升安全性行,开发者可以定期刷新私钥分片,如使用 KeyId 为 1 的私钥分片 A、B、C 刷新得到一组新的私钥分片,新的 keyId 为 2,私钥分片为 A*、B*、C*;然后禁用老的私钥分片,后续签名和恢复都使用新的一组私钥分片。需要注意,一旦刷新私钥分片后,如果作废老的私钥分片 A、B、C,则需要用户重新备份 C* 到 iCloud 或者 Google Drive 中。

为什么需要用户重新备份私钥分片 C* ?