密码学入门:阈值签名

本文详细介绍了阈值签名(Threshold Signatures)的工作原理,这是一种多方参与的签名方案,允许在不需要所有参与者签名的情况下生成有效的签名。文章涵盖了密钥生成、签名和验证的步骤,并讨论了多项式和椭圆曲线在其中的应用。

这是关于密码学的一系列更大文章的一部分。如果这是你遇到的第一篇文章,我强烈建议你从 这系列的开始 开始阅读。

上一篇文章 中,我们学习了多项式,并且看到了它们的一些应用。

然而,这篇新的密码学内容似乎与我们迄今为止学习的内容没有关联。然而,有一些很酷的方式可以将它们与之前的概念结合起来,例如 数字签名

本文将专注于解释这样一个例子,其中我们将常用的 签名技术多项式 结合起来,创建一个有趣的 混合方案。我们将以 椭圆曲线 为背景,使用 GH 来表示一个群体 𝔾 的生成元。

我会松散地基于 这篇论文 进行解释,并作出一些调整,以期使事情易于理解。

仍然,友好的免责声明:阈值签名很难解释。我们需要澄清许多细微之处。因此,让我们先看一下它们是什么以及它们的作用的简要总结,然后再深入到其背后的数学。

足够的签名者

阈值签名 是一种 多签名 — 意味着需要多个参与者签署一条消息。但这一次,并不是每个参与者都必须这样做。

想象一下,一个拥有应用程序管理员权限的十人小组。为了执行某些敏感操作,我们需要 至少三个 批准

这样,我们就不必同时打扰所有的管理员;只需要一个可用签名者的子集就足够了。

这感觉像是我们之前探讨的 多签名方案 的一次 升级,其中所有签名者都被要求参与。但实际上,实现这一结果涉及到一些更复杂的 密码学技巧

一个阈值签名,其中至少需要 3 个中的 4 个签名者

我们可以将阈值签名分为 三个主要步骤算法(就像大多数签名方案一样):

  • 密钥生成(KeyGen),这是一个输出一个 共享私钥公钥 对的算法,
  • 签名,处理消息与私钥和一个 随机数(nonce)以获得一对 (r, s)
  • 以及 验证,这是验证签名是否与消息和公钥相符的步骤。

在使用阈值签名方案时,密钥生成签名 步骤,在过去的例子中相对简单,将被更复杂的过程取代,涉及签名者之间的 通讯。幸运的是,验证 仍然保持不变 — 因此我们的关注将放在前两步上。

请注意,要求一定数量的签名者的想法与重建 一个 多项式所需的最低点数量非常相似,借助 插值 可以实现 插值。事实上,这也是阈值签名工作的核心。

此外,为了保持内容的清晰,我们必须说签名者或参与者是 有序的。每个参与者将拥有一个 标识符索引,范围从 1 到 n,即参与者的总数。

我们的目标已经设定,介绍结束。我们可以进入好戏了吧?

初步准备

在阈值协议中,共享信息 是关键。最终,一组签名者共享信息的能力将使他们能够生成签名。

我们已经看到,分享一个秘密可以通过 夏密尔秘密共享 (SSS)来实现。其思想是在许多不同的值上评估一个多项式,然后将结果作为 进行共享。并且有了这些点,我们可以 反插值 回原始多项式。

但这里有一个问题。任何接收者如何检查他们收到的值是否是 正确计算 的?换句话说,是否有办法 证明 这些点确实与原始多项式相关?

你可能会想,为什么 值会不正确?为什么会有人发送错误的值?这里有至少两个原因:通信中的错误恶意活动。攻击者可能试图破坏我们的签名模型—我们不能指望每个人都能正确行为,因此我们必须采取措施来减轻这种可能情况。

为了应对这一担忧,我们需要一个 新工具

可验证的随机秘密共享

我们所做的是要求共享者进行一个 承诺。这将 绑定 共享者与他们的秘密信息(多项式),以便后续他们不能生成无效值。

这个想法就是 可验证的随机秘密共享VRSS),这是一种可以替代 SSS 的方法。我们想做的是承诺我们多项式的 系数——为了做到这一点,我们需要的不是一个,而是 两个 个系数:

你问这是为什么?因为承诺需要 隐藏。我们不想暴露系数,因此它们的承诺应该是 盲化 的。第二个多项式的系数实际上就是这些盲化因子!

因此,通过使用我们的群生成元,参与者 i 计算并 广播 每个多项式中的系数的 承诺Cᵢ

酷!现在剩下的就是 共享。为此,每个人需要 评估 他们的多项式。由于每个参与者都有一个索引 j,我们可以选择针对目标参与者在其索引处评估 共享,即 fᵢ(j)

这意味着个人将从其他参与者 i 获取 fᵢ(j)fᵢ’(j)

在收到这些值后,参与者 j 可以按如下方式 验证 它们:

就这样!我们现在有了一种 可验证 的秘密信息共享机制。有了这个工具,我们可以开始构建我们的签名方案。

密钥生成

由于阈值签名涉及多个方,参与者将持有一个整数 dᵢ 作为其共享(或部分) 私钥

然而,这并不是通常随机选择的整数。相反,参与者之间进行了 交互 的过程,最终生成他们的 私钥份额。这种协议称为 分布式密钥生成(DKG) 算法。

我们可以使用 VRSS 来构建我们的算法。多方便啊!

![](https://img.learnblockchain.cn/2...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Frank Mangone
Frank Mangone
Software developer based in Uruguay. Math and Cryptography enthusiast.