Ferveo 加密技术概述
全面介绍 Ferveo 门限加密技术的原理和实现,为分布式系统提供隐私保护。
目录
Ferveo Cryptography Overview
By Joe Bebel in Cryptography — Aug 16, 2021
> Ferveo 包含一个定制设计的分布式密钥生成器和一个定制设计的阈值解密方案,旨在满足底层共识机制的性能和安全要求。
简介
随着金融应用迁移到区块链上,前端运行、矿工可提取价值以及其他形式的区块链套利问题已广为人知。由于交易在链上确认之前会出现在内存池中,验证者(或愿意支付更高费用的其他参与者)通常可以改变交易顺序以符合自身利益。
理想情况下,交易在网络上执行之前不会公开披露。考虑一个假设场景,其中单个可信实体按接收顺序公开执行交易。该可信实体可以生成一个公私钥对;交易可以加密到此密钥对,而该可信实体可以按接收顺序解密并执行交易。然而,在去中心化网络中,保持交易加密直至准备执行则更具挑战性。
假设一个权益证明区块链,有 100 个等量权益的验证者,在至少 67 个验证者没有故障的假设下安全运行。我们希望我们的解密过程也基于同样的假设:如果至少 67 个验证者没有故障,交易将按接收顺序解密和执行。
在权益证明区块链中,有一种自然的方法可以实现这一点:分布式密钥生成和门限密码学。验证者集生成一个共享的公钥,以及相应分布式私钥的各个份额。任何人都可以使用分布式公钥加密交易,并且只有足够大的验证者子集能够解密交易。
假设至少有 67 个验证器不会合谋提前解密交易,那么这些验证器可以在解密前承诺交易的排序。一旦一个交易块被提议,这 67 个验证器可以参与解密协议,恢复未加密的交易,并按照承诺的顺序执行它们。由于交易的内容只有在协议承诺按特定顺序解密和执行时才会被解密,因此一旦验证器发现另一个交易的内容,他们就不能在同一块中插入自己的交易。
秘密共享
如何让 100 个不同的验证器共享私钥的一部分,使得只有 67 个验证器能够解密?答案始于 Shamir 秘密共享,这是一个巧妙的方案,其中 100 个人可以共享一个秘密值($alpha$),它是某个有限域 $mathbb{F}$ 的元素,使得任何 67 人的子集都能重建秘密,但任何最多 66 人的子集却不能。
让我们假设一个可信的经销商,Alice,知道重要的秘密 $alpha$ ,并希望将其分享给许多方。那么 Alice 可以构造一个多项式 $p(x)$ :
$p(x) = alpha + alpha_1x + alpha_2x^2 + dots + alpha_{66}x^{66}$
其中 $alpha_1, dots, alpha_{66}$ 是与 $alpha$ 相同的有限域中均匀分布的随机元素。Alice 可以将值 $p(1)$ 分配给第一个人,$p(2)$ 分配给第二个人,以此类推。请注意 $p(0)$ 是秘密值 $alpha$ ,但每个人得到的 $p$ 评估值会"混合"秘密值 $alpha$ 与 $p$ 的其他系数。由于 $alpha_1, dots, alpha_{66}$ 有许多不同的可能值,学习 $p(i)$ 对于 $i
eq 0$ 不会揭示任何关于 $alpha$ 的信息。实际上,即使 66 个人一起比较他们的评估值,也有 $|mathbb{F}|$ 个具有恰好这 66 个评估点的潜在多项式,每个多项式在 0 处有不同的值,因此每个 66 人的子集都不具备关于实际值 $alpha$ 的任何信息。
然而,我们知道一个 66 次多项式总是由 67 个不同的评估唯一确定;因此,任何 67 个人的子集都可以插值他们的评估,并发现秘密 $alpha$ 。
分布式密钥生成
密钥分拆是一种重要的工具,用于在多个实体之间共享一个私钥。一个可信的中间人 Alice 可以分发分布式私钥的份额;然而,在现实世界中依赖可信的中间人是不可取的。实际上,恶意中间人 Eve 有很多方法会破坏密钥分拆:
- •伊芙可以向不同的人发送不同多项式的评估结果
- •伊芙可以向某些人发送多项式的正确评估结果,但向其他人发送 nothing
- •伊芙知道秘密值 $alpha$ ,可以用它做坏事
一个恶意的商人伊芙可能会阻碍分布式密钥生成过程,阻止它产生有效的密钥份额;审查特定验证者的密钥份额,降低分布式密钥的弹性;或者秘密密钥在期望的 67 个验证者多数之外被知晓。
因此,我们需要构建一个基于秘密共享的协议,但具有更好的性质:
- •每个人都应该能够验证他们的评估来自与其他人相同的同一个多项式 $p$
- •每个人都应该能够验证其他人成功收到了他们的评估
- •没有人应该知道生成的私钥
凭借这 3 个特性,分布式密钥生成实现了预期目标:如果至少 67 个中的 100 个验证者诚实地遵循协议,一个秘密分布式密钥将被成功生成,并且所有 100 个验证者都能无审查地获得他们的私钥份额。如果伊芙试图做坏事,她的行为将被检测到。
验证评估一致性
每个参与者必须能够验证庄家使用了一个多项式来获得所有评估。
第一个属性可以通过使用多项式承诺来承诺多项式 $p$ 来实现。设 $G$ 为一个椭圆曲线群,其阶为 $mathbb{F}$ 的素数生成元。那么承诺向量为:
$C_p = ([alpha]G, [alpha_1]G, [alpha_2]G, dots, [alpha_{66}]G)$
该向量承诺多项式 $p$ 而不泄露其系数。然而,如果评估 $p(i)$ 被透露给某人,那么可以通过将 $(1, i, i^2, dots, i^{66})$ 与 $C_p$ 的内积结果与 $[p(i)]G$ 进行比较来验证该评估:
$[p(i)]G = [alpha]G + [alpha_1i]G + [alpha_2i^2]G + dots + [alpha_{66}i^{66}]G$
如果所谓的评估 $p(i)$ 并非实际评估 $p$ 在 $i$ 上的结果,那么这个等式检查将大概率失败。因此,只要每个人都同意共享的多项式承诺 $C_p$ ,他们就知道自己的评估 $p(i)$ 来自于与其他人相同的多项式。
如何验证每个人是否成功收到他们的评估
这种被称为秘密共享的公开可验证性的属性,更难实现。
假设 Eve,这个不可信的中间人,通过在区块链上发布多项式承诺和评估来向每个人广播他们的秘密共享;那么至少每个人都会同意多项式承诺,但每个单独的评估必须加密给每个接收者(否则,如果每个人都知道评估,任何人都可以插值来恢复秘密)。
一种潜在的方法是使用 Diffie-Hellman 密钥交换和对称加密技术,例如 AES 或 ChaCha 密码,来加密评估。然而,这些加密方式并非公开可验证;只有预期的接收者才能解密评估并与其承诺进行核对。这在分布式环境中是一个问题;如果接收者恰好离线,Eve 可能会向他们发送加密的垃圾信息,而其他人将无从知晓!这可以通过增加活性假设、为不良经销商设立投诉机制以及使用加密经济激励来适当缓解,但在区块链环境中总体上并非理想方案。
幸运的是,当在配对友好的椭圆曲线上使用双线性映射(称为配对)时,公开可验证的分布式密钥生成方案可以实现公开可验证的秘密共享(PVSS),例如 BLS12-381。
在 PVSS 方案中,评估使用一种方案进行加密,该方案只能由预期接收者解密评估,但其他人仍然可以检查加密的评估与承诺的多项式是否一致。
在《解密可聚合的 DKG》中,已对完整的 PVSS 方案进行了解释。
幸运的是,在区块链环境下,并不需要完整的可聚合的 DKG 方案,我们可以通过简化的方法得到相同的结果(稍后会有更多说明)。
这种 PVSS 方案的缺点是没有人能完全解密他们的评估 $p(i)$ ;相反,接收者将他们的评估解密到一个椭圆曲线点 $[p(i)]H$ ,其中 $H$ 是一个固定的生成元。因此,分布式密钥共享和分布式私钥 $[p(0)]H$ 是群元素而不是域元素。这使得许多期望私钥由域元素组成的公钥密码方案难以使用。
虽然有一些 PVSS 方案以公开可验证的方式共享域元素,但事实证明这并非必要,简单的群元素就足够了(而且在某些方面,甚至更好!)
我们将一个多项式承诺 $p$ ,连同公开可验证的加密评估 $p$ ,称为一个 PVSS 实例。
确保没有人知道私钥
无论使用哪种秘密共享方法,庄家总会知道所使用的多项式的系数,因此总会知道秘密常数项。然而,我们可以利用 PVSS 方案具有加法同态的性质:通过简单地相加每个多项式的相应系数,可以得到新多项式的系数。此外,两个多项式的和在 $i$ 处的求值等于它们在* i *处的求值之和;并且由于椭圆曲线点也具有加法同态性,两个多项式之和的承诺是它们逐元素的承诺之和!
因此,在秘密共享中的每个系数、求值、加密求值或承诺都可以与来自另一个秘密共享的相应值相加,以获得新秘密共享的完全有效的值。如果 67 个不同的参与者各自生成并求值自己的多项式 $p_j$ ,那么求和多项式 $p = p_1 + dots + p_{67}$ 的系数是完全保密的:即使 66 个参与者向彼此透露他们的秘密多项式,也不足以恢复 $p$ 。
聚合 PVSS 实例
分布式密钥生成的主要性能问题源于成对验证;尽管可能只有 100 个验证者,其中 67 个作为 PVSS 实例的经销商,但直接的成对验证要求所有验证者验证所有秘密分片的正确性,需要进行 6600 次 PVSS 验证操作,这是一个相当高的成本。
利用 PVSS 的加法同态特性,可聚合 DKG 方法观察到验证步骤可以由聚合者执行,聚合者生成一个聚合的 PVSS 实例,该实例是其他 PVSS 实例的总和,其他人只需要检查聚合实例的有效性(以及聚合是否正确完成)。
在异步设置中,这有点不简单,因为每个人必须就使用的 PVSS 实例集达成一致;在同步区块链上则更简单。未验证的 PVSS 实例都发布到区块链上;聚合者验证所有发布的 PVSS 实例并发布聚合结果。
门限密码学
一旦区块链上聚合了足够多的 PVSS 实例,公钥 $[p(0)]G$ 就会被公开,验证者将拥有其私钥份额 $[p(i)]H$ 。
虽然验证者当然可以通过多项式插值来恢复私钥 $[p(0)]H$ ,但验证者应使用他们生成的私钥份额来创建每个交易的解密份额。然后通过解密份额的插值来恢复每个交易的内容。解密份额仅用于解密单个密文;私钥和私钥份额保持秘密,未来的密文也可以加密到相应的公钥。
阈值解密过程的主要问题是性能;由于每个验证者执行其阈值解密协议份额的开销,整个协议必须极其轻量,以便在只有几秒钟的区块时间内,能够由数百个验证者解密数百笔交易。
然而,Ferveo 中使用的尖端方案旨在与我们的 PVSS DKG 生成的椭圆曲线群元素私钥兼容。阈值公钥加密方案并非新事物:一种使用域私钥和基于身份的方案影响了新型高性能、选择密文安全的方案,适用于现代 Type 3 配对友好型椭圆曲线,如 BLS12-381。
概述
设 $e: mathbb{G}_1 imes mathbb{G}_2 o mathbb{G}_T$ 为 BLS12-381 上的配对, $H_{G2}$ 为哈希到群函数,将哈希到 $mathbb{G}_2$ 。 $G in mathbb{G}_1$ 和 $H in mathbb{G}_2$ 是分布式密钥生成中使用的公钥生成器。
阈值加密方案允许加密者从阈值公钥 $Y=[p(0)]G$ 派生出共享密钥* $s$ *,使得持有私钥份额 $Z_i=[p(i)]H$ 的 67 个验证者也能派生共享密钥。加密者和解密者都可以使用共享密钥派生对称密钥。
#### 为了导出共享密钥
- •令 $r$ 为一个随机标量
- •令 $s = e([r]Y, H)$
- •令 $U = [r]G$
- •让 $W = [r]H_{G2}(U)$
- •密文中的公钥部分是 $(U, W)$ ,派生的共享密钥是 $s$ 。
#### 验证密文(用于选择密文安全性)
选择密文安全性要求拒绝无效或恶意构造的密文。给定一个密文 $(U, W)$ ,验证器应检查 $e(U, H_{G2}(U)) = e(G, W)$ 以确认密文的合法性。
#### 阈值解密
从一个密文 $(U, W)$ 中导出共享密钥,验证器必须
- •检查密文 $(U, W)$ 的有效性。
- •构建 $C_i = e(U, Z_i)$ 。
- •一旦有 67 个 $C_i$ 的值,它们可以组合起来得到 $s = prod C_i^{lambda_i(0)}$ ,其中 $lambda_i(0)$ 是插值这些 67 个验证器评估域的拉格朗日系数。请注意,共享密钥是乘法子群 $mathbb{G}_T$ 中的一个元素。
结语
Ferveo 包含一个定制设计的分布式密钥生成器和一个定制设计的阈值解密方案,旨在满足底层共识机制的性能和安全要求。当在方案中添加优化、聚合和摊销时,分布式密钥生成和阈值解密操作能够达到在生产力区块链上规模化运行所需的性能。
---
_由 Joe Bebel 撰写,他是 Heliax 团队中负责零知识密码学研究与协议开发的成员,该团队正在构建 Anoma。_
如果你对零知识密码学、前沿加密协议或 Rust 中的工程职位感兴趣,可以查看 [Heliax 的开放职位]