Schnorr Threshold Signature (FROST)
Table of Contents
1. 论文介绍
2020 年,Chelsea Komlo 和 Ian Goldberg 在论文 FROST: Flexible Round-Optimized Schnorr Threshold Signatures 中提出了一种 Schnorr 门限签名方案,简称为 FROST 协议,本文将介绍它。
1.1. 本文记号
门限方案
2. 基础知识
2.1. Schnorr 签名
在介绍 Schnorr 门限签名之前,先介绍一下常规的 Schnorr 签名。
假设私钥为
- 随机选择
,计算 的 commitment ; - 计算 Challenge
; - 使用私钥
计算 ; - 对
的签名数据就是 。
验证签名过程(输入数据有
- 推导出 Challenge
; - 计算
; - 如果
成立,则说明签名合法。
注:你会在一些资料中会看到采用
3. FROST 协议介绍
3.1. FROST Keygen 协议
FROST 中的 Keygen 协议是 Pedersen's DKG 的一种变种:在 Pedersen's DKG 的基础上引入了对秘密值的零知识证明来防止 Rogue Key Attack(注:Rogue Key Attack 在论文 Randomness Re-use in Multi-recipient Encryption Schemeas 有介绍)。
本文不详细介绍 FROST 中的 Keygen 协议,只给出结论。
3.1.1. 私钥分片
对于门限方案
的私钥分片 ,而完整的私钥 ,其中 是某个 次多项式。也就是说 个私钥分片就是 次曲线上的 个点 。- 所有参与者私钥分片
所对应的 commitment 。
下面介绍一下完整私钥
下面通过实例来验证一下上面的结论。假设门限方案
由于
3.2. FROST 签名协议
FROST 签名协议是一个 Two Rounds 协议。由于第一轮操作不会涉及到待签名消息
FROST 协议中有个 Signature Aggregator 角色,在具体实现时可以去掉这个角色,具体方法是每个签名参与者都充当这个角色,这样以前发送给 Signature Aggregator 的消息就改为发送给所有其它签名参与者。注:如果存在 Signature Aggregator 角色,各个签名参与者只需要和 Signature Aggregator 之间发送消息,并不需要和其它签名参与者相互发送消息,这点从图 1 和图 2 中可知。
注:很多 Two Rounds 协议都不能抵抗 Wagner/Drijvers Attack ,FROST 协议可以抵抗 Wagner/Drijvers Attack,这里不详细介绍细节,可参考 FROST 原论文第 5.2 节。
3.2.1. Round One
FROST 签名第一轮操作:每个签名参与者随机选择
Figure 1: FROST 签名第一轮操作,右边是 Signature Aggregator。摘自:https://www.youtube.com/watch?v=tKR4QKhmXXI
3.2.2. Round Two
先介绍几个记号定义
FROST 签名第二轮操作:Signature Aggregator 选择
Figure 2: FROST 签名第二轮操作。摘自:https://www.youtube.com/watch?v=ReN0kMzDFro
4. 和其它方案的对比
4.1. 对比指标:Robust 和 Non-Robust
Robust 签名方案是指,只要参与者中有
Non-Robust 签名方案是指,发现有恶意参与者(即它们不遵守协议)就退出协议,从而这一次没有办法得到正确的签名,需要把恶意参与者踢除后重新运行签名。
显然,Robust 方案要优于 Non-Robust 方案。不过,本文介绍的 FROST 及 GG18(一个著名的 ECDSA 门限签名方案)都只是 Non-Robust 方案。
4.2. 和 Stinson and Strobl 方案的对比
2001 年,D.R. Stinson and R.Strobl 在论文 Provably Secure Distributed Schnorr Signatures and a (t,n) Threshold Scheme for Implicit Certificates 中提出了一种 Schnorr 门限签名,下面称为 Stinson and Strobl 方案。这个方案是一种 Robust 签名方案,不过它签名所需要的轮次(为 4)比 FROST 方案的轮次(为 2)要多。
Stinson and Strobl 方案和 FROST 方案的对比如表 1 所示。
Rounds of Signing | Robust | |
---|---|---|
Stinson and Strobl 方案 | 4 | Yes (Better) |
FROST | 2 (Better) | No |
注:虽然 FROST 不是 Robust 协议(也就是说存在恶意参与者时协议会失败),但 FROST 可以检测出恶意参与者,这样在发现恶意参与者时可以把它踢除后重新运行签名即可,所以这也不是什么大问题。
5. 兼容 BIP340
Bitcoin 的 Taproot 地址采用了 Schnorr 签名,BIP340 中规定了相关细节。
为了让公钥及签名(Schnorr 签名中有一部分数据就是公钥)更短,BIP340 中编码曲线上的点(如公钥)时,只使用了点的 X 坐标,省略了点的 Y 坐标。根据椭圆曲线逆元素的定义,设点
只使用 X 坐标编码一个点显然会导致一个问题: 每个公钥会对应两个私钥
这里有个隐含的事实:对于椭圆曲线上的两个点
- 假设 P 的 Y 坐标为奇数,即
是奇数。由于椭圆曲线 secp256k1 的 是奇数, ,奇数减去奇数一定是偶数,所以 的 Y 坐标是偶数; - 假设 P 的 Y 坐标为偶数,即
是偶数。由于椭圆曲线 secp256k1 的 是奇数, ,奇数减去偶数一定是奇数,所以 的 Y 坐标是奇数。
FROST 兼容 BIP340 要做的事项:
- Keygen 时,如果发现完整私钥
对应公钥 的 Y 坐标为奇数,则每个参与者把自己的私钥分片 取反,这会使得新的完整私钥 对应公钥的 Y 坐标为偶数,满足 BIP340 要求; - FROST 签名时,如果在 Round Two 中发现
对应公钥 的 Y 坐标为奇数,则每个参与者都把自己的 取反,这会新的 对应公钥的 Y 坐标为偶数,满足 BIP340 要求; - FROST 签名时,Challenge
的计算改为 BIP340 所要求的 。
参考:https://github.com/jesseposner/FROST-BIP340/blob/2c0d86e6e692341b0477968d61d85b8654d5d9c3/frost.py
6. 参考
本文主要参考下面资料:
- FROST: Flexible Round-Optimized Schnorr Threshold Signatures
- FROST: Flexible Round-Optimized Schnorr Threshold Signatures, YouTube, Speaker: Ian Goldberg
- FROST: Flexible Round-Optimized Schnorr Threshold Signatures, YouTube, Speaker: Chelsea Komlo
- FROST Rust 实现:https://github.com/ZcashFoundation/frost