提到把一把钥匙拆给几个人保管,多数人会想到先把钥匙造出来、再切开分发。这个直觉在门限密码学里恰恰是最危险的一步:完整私钥只要存在过哪怕一微秒,那一刻它就是全网最值钱的靶子——存在内存里能被读走,存在硬盘上能被拷走,存在某个人脑子里那个人就能被收买。分布式密钥生成(Distributed Key Generation,DKG)要解决的就是这件事:让 n 个参与方在没有可信发牌人的前提下共同产出一把钥匙,完整私钥从头到尾没有被任何一个人、任何一个地方完整持有过,最终活下来的只有公开验证钥和每人手里的一份碎片。
从切钥匙到铸钥匙:为什么生成方式本身要设计
Shamir 门限方案只解决『已有秘密怎么分』:先有一个秘密,再用多项式切成 n 份,凑齐 t+1 份才能还原。把它直接搬来做门限签名,就得先有人执行『造私钥』这一步——哪怕是个程序、一台临时服务器,它都成了单点。DKG 的思路是把『造』也摊到 n 方头上:每个参与方各自随机生成一个秘密多项式,把多项式在每个人编号处的取值私下发给对方,同时把多项式系数的承诺公开发出来。最后每个人把自己收到的所有分量相加,得到的就是最终密钥在自己那一份的份额;把所有公开承诺按同规则相加,得到的就是公钥。整个流程里,最终的『秘密多项式』是 n 份小多项式之和,谁也不知道另外 n-1 份长什么样,完整私钥自然也就从未成形。
可验证的秘密分享:防的是中途耍赖
纯相加的方案有一个致命缝隙:某个恶意参与方可以给张三发一个值、给李四发另一个值,然后在最后一刻退出不参与——别人事后发现份额对不上,却已经无法指认是他在捣乱。Feldman 在 1987 年补上的『可验证秘密分享』解决了这一点:发牌方不仅要私下发份额,还要把多项式每个系数的哈希承诺(在椭圆曲线场景就是系数乘上曲线基点得到的公钥点)公开广播。收到份额的人拿自己编号算一下承诺方程是否成立,本地就能判断这份份额真不真;一旦有人交出坏份额,受害者可以公开举证,把坏人踢出集合。可验证的承诺让『暗中使坏』变成『当众被抓』。
Pedersen 的两轮协议与一个藏了十二年的漏洞
Pedersen 在 1991 年把 Feldman 的思路改造成分布式版本:每人轮流当一次可验证发牌方,私下发份额、公开发承诺,一轮发牌、一轮检验、坏人被剔除后大家把留下的承诺求和——正常路径上通信轮数极少,因此被后来的门限方案反复引用。Gennaro、Jarecki、Krawczyk 和 Rabin 在 2007 年发表的分析指出:这个看似对称的流程里藏着一个顺序漏洞。每个参与方可以先看别人的承诺,再决定自己的秘密多项式常数项取什么——比如等所有人都提交后,挑一个能让自己偏好的公钥结果出现的值。密钥分布因此可以被拥有少数席位的攻击者系统性偏置,而这个漏洞在协议被广泛部署的多年里没有人注意到。修补方案是把顺序钉死:先让每人对自己的秘密做承诺(相当于把底牌先扣在桌上),再在下一轮亮出并验证——多花一轮通信,换回密钥分布的真正均匀。这类『先承诺后揭示』的钉子,在区块链世界里其实随处可见。
从论文到万人生成仪式
DKG 在现实里最壮观的一次亮相是以太坊信标链的生成仪式:2020 年底,全球上万名贡献者各自提交一段随机数,流程把所有人的输入像 DKG 一样聚合进创世押金合约——任何人只要自己那一步的随机数是认真的且留了备份,就能确认可疑的创世密钥不可能被单独制造。另一个高频场景是门限签名的密钥聚合:多个节点想对外呈现为一把普通公钥,用 DKG 生成而非共享中心密钥,配合 FROST、PubAgg 这类带证明的变体,既能防内部成员作恶,又保留『链上只看到一把普通钥匙』的简洁。工程上还要回答生成之后怎么办:成员进出要重发份额、硬件报废要轮换,这些属于密钥生命周期管理,DKG 只管出生这一页。
快速问答
DKG 是不是意味着门限系统绝对没有密钥泄露风险?不是。它消灭的是『完整私钥在某一处出现』这个时间窗,但份额仍然存放在各参与方的机器上,凑齐 t+1 份就能还原秘密——风险只是从单点变成了分布式,仍要靠硬件隔离和份额审计兜住。
DKG 和 MPC 钱包是什么关系?MPC 钱包的密钥通常正是用 DKG 或其简化变体生成的,因此宣传口径里的『私钥从未完整存在』这句话,其技术含义就是 DKG 的正确执行;审计一个 MPC 钱包,第一个要问的就是生成仪式是否可验证、坏参与者如何剔除。
小团队能不能自己跑 DKG?协议本身是普通的多轮网络交互,难在组织:需要可靠的公告板、身份体系和时间协调,实践中更多是选用经过审计的门限库而非手搓。
风险提示:本文仅作密码学机制科普,不构成任何投资建议或产品安全性背书。密钥技术的安全性取决于实现与运维,任何承诺『绝对安全』的托管或门限产品都应保持警惕。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。