Coconut 签名方案
最近研究Nym 区块链项目,提到 Coconut
签名方案,顺便看一下论文。
Coconut
是一种选择性展示凭证属性的分布式门限盲化签名分发方案,具有公开和私有的属性,重新随机化和多个不可链接的属性展示。
Coconut
签名可以用在匿名支付,匿名投票和去中心化代理等应用中。
![](https://img.haomeiwen.com/i7973505/1bc99cdc5ba28c5f.png)
Coconut
架构如上图所示,首先由用户向授权者发送凭证生成请求,然后由由授权者颁发凭证,由用户将凭证聚合后,生成完整的凭证,然后用户可以对凭进进行重新随机化,并可以选择性展示其私有的属性,实现认证或授权的目的。
形式化定义
Coconut
签名的形式化定义为:
-
: 定义关于安全参数
的系统参数
params
; -
: 由授权者运行,生成各自的私钥
sk
和 验证密钥vk
; -
: 由验证者聚合
个授权者的验证密钥,合成完整的验证密钥
;
-
: 通过用户与授权者之间交互完成,由授权者给用户颁发一个凭证,其中私有属性
满足
定义的约束;
-
: 通过聚合
个部分凭证
生成一个完整的凭证;
-
: 由用户生成证明
, 证明私有的属性
m
满足的约束;
-
: 由验证者通过
验证证明,验证凭证的的有效性。
Coconut
签名满足不可伪造性,盲化性,不可链接/零知道证明属性。
签名方案构造
Pointcheval 签名方案
-
: 选择一个双线性群
, 群的阶为
,
为
位长的素数。 其中
的生成元为
,
的生成元为
, 系统参数为:
.
-
: 选择随机的密钥
, 解析参数
, 发布验证密钥
;
-
: 解析
, 选择随机数
, 设置
, 输出签名为:
;
-
: 解析
,
, 验证
, 则签名有效,否则即失败。
可以对签名 进行随机化,选择一个随机数
, 计算
。
也可以将其改获取具有私有属性的凭证,在 过程中,用户首先选择随机数
, 计算消息
的承诺
, 其中
, 并将承诺的证明发送给授权者,授权者验证证明之后,选择随机数
, 并给用户发送
, 其中
. 用户通过计算
进行去盲化签名,
可以用作凭证。
该签名可以实现盲化,不可链接性,高效和短凭证的特征,但是不支付门限签发属性。 为了克服这种限制, Coconut
引入BLS签名中的hash 函数: , 以此计算群元素
.
Coconut 门限签名方案
Coconut
门限签名方案需要满足:
-
: 选择双线性群
, 其阶为
,
为
位长的素数,其中
的生成元为
,
的生成元为
, 系统的参数为:
;
-
: 选择两个次数为
的多项式
, 其系数在
上。 设定
. 对于每个授权者
的密钥
, 并发布其验证密钥
;
-
: 凭证通过以下三个算法颁发:
-
: 用户生成 El-Gamal 密钥对
, 选一个随机数
, 计算承诺
和群元素
:
$c_m = g_1^mh_1^o$, $h=H(m)$
选择随机数
, 计算
的El-Gamal 加密为:
$c = Enc(h^m) = (g_1^k, \gamma^kh^m)$
输出
, 其中
是和应用相关的关于
的约束,
定义为:
-
: 授权者
解析
,
。 计算
, 利用
验证证明
。 若证明有效,构建
, 输出
.
-
: 用户解析
,
, 计算
, 然后输出
-
-
: 对于
, 解析
为
, 输出
,
为Lagrange 系数:
$l_i = \lgroup\prod_{j=1,j\neq 0}^t(0-j)\rgroup \lgroup \prod_{j=1,j\neq 0}^t(i-j) \rgroup^{-1} mod\ p$
-
: 解析
,
, 挑选随机
, 设定
, 构建
,
. 输出
, 其中
是应用相关的关于
的约束,
为:
$\pi_v = NIZK{(m,r): k = \alpha\beta^m g_2^r \wedge=(h')^r \wedge\phi'(m) = 1}$
-
: 解析
,
, 使用
验证
, 若验证
通过,则说明凭证有效。
多属性凭证
授权者的密钥对变成:
$sk = (x, y_1, \cdots, y_q), vk = (g_2, g_2^x, g_2^{y_1}, \cdots, g_2^{y_q})$
其中 为属性的个数,多属性的凭证在
中,群元素
为:
$c_m = g_1^o \prod_{j=1}^q h_j^{m_j}, h = H(c_m)$
广义的凭证即为:
$\sigma = (h, h^{x+\sum_{j=1}^q m_j y_j})$
凭证总是由两个群元素组成,并不随着属性个数或授权者个数变化。
应用场景
Coin Tumbler
Coin Tumbler
可以用来实现匿名支付:
![](https://img.haomeiwen.com/i7973505/a5e4dc611044f1dc.png)
Coconut 签名用来实现Coin Tumbler
的流程为:
- 用户首先向合约进行存款,其中金额的数量
作为公开属性,私钥
和 随机数
作为私有属性;
- 授权者监控到请求, 并分别给用户颁发凭证;
- 用户聚合部分的凭证,对其进行重新随机化,生成零知识证明,绑定到Merchant 的地址
;
- Merchant 提交证明和凭证和群元素
, 其中
用来防止双花;
- 合约验证证明和凭证后,若有效,则将
代币转给 Merchant.
在上述过程中,Merchant 并不知道用户的地址身份,实现匿名性。
Privacy-perserving petition
Coconut 签名实现匿名投票的流程为:
![](https://img.haomeiwen.com/i7973505/fdbdf1d707d96b9c.png)
- 用户首先向授权者
proof of identity
, 授权者检查其身份,对用户私有属性k
发布一个盲签名,签名只需要生成一次,作为用户长期的身份凭证; - 任意第三方可以创建一个新的投票的实例,通过标识符
;
- 为了进行投票,用户计算值
, 并生成零知识证明, 以确定
是由
计算得到,
用来防止重复投票;
- 合约对用户的证明验证通过后,执行用户的投票结果。
Censorship-resistat distribution of proxies
代理常常用来绕过审查,但是却总是成为审查的目标,可以基于Coconut
签名方案实现抗审查的分布式代理方案。
![](https://img.haomeiwen.com/i7973505/72e4a7d051e92600.png)
- 代理者
V
首先通过获取一个临时公钥, 并向授权者提供身份证明,获取关于私有属性
和 有效期
的凭证;
-
V
将凭证注册到代理合约中,并提供零知识证明验证凭证的有效性; - 用户监控区块链上的注册合约,当发现某个注册时,可以发布请求信息;
- 代理监控到链上的请求信息时,可以和用户发起连接,同时提供关于自身身份的零知识证明;
- 用户验证证明后,获取代理的IP地址和有效期,然后可以通过代理转发数据。
上述方案中,用户无法将代理的IP地址和长期使用的公钥 关联在一起,实现代理的匿名性。
限制
- 对于授权者重新加入或退出需要重新进行密钥生成,来源于Shamir 秘密分享方案的限制,可以通过 Herzberg 方案解决;
- 若恶意授权者数量超过
, Coconut 面临被攻击风险;
- 用以太坊合约实现Coconut 方案代价较大,因为EVM没有
实现的预编译合约,可以通过交换
和
的位置实现。
参考
https://arxiv.org/pdf/1802.07344.pdf
https://github.com/asonnino/coconut