环签名(ring Signature)
环签名允许一个签名者代表一个签名集合进行签名,同时保证签名者身份的匿名性,签名者在签名时无需集合中其他成员的帮助(协作),甚至于可以不让其他成员知晓,只需要用自己的私钥和其他成员的公钥就能实现。
验证签名的不同点在于,仅可验证签名来自群组成员,但是无法区分某个具体成员。
环签名技术由Ron Rivest, Adi Shamir, 和 Yael Tauman发明的,于2001发表出来的。环签名得名于其环状结构签名算法。
环签名是特殊的一种群签名,关于群签名,暂不扩展,感兴趣可自行查阅。
环签名满足性质:
1.无条件匿名性:
攻击者者无法确定签名是由群组中哪个成员生成,即使在获得环成员私钥的情况下,概率也不超过1/r【r是群组中成员数量】。
2.不可伪造性:
群组中其他成员不能伪造真实签名者签名,攻击者者即使在获得某个有效环签名的基础上,也不能为消息m伪造一个签名。
其他性质,如正确性等是显而易见的。
环签名流程
符号约定:
选定哈希函数Hash,对称加密算法E,密钥k, 待签名消息m, 群组成员公钥(P
1
,P
2
,...,P
r
),第j个成员是真正的签名者,
签名生成过程:
令k = hash ( m ),k作为对称加密函数E的密钥
选择随机值v
随机选取r-1个值 x
1
,x
2
,x
4
,...x
r
, 并计算y
i
=g
i
(x
i
),计算得到相应的y
1
,y
2
,...,y
r
(除了y
j
)
令C
k,v
=(y
1
,y
2
,...,y
r
)=v , 计算出y
j
y
j
公钥加密得到,利用私钥反向计算x
j
=g
j
1
(y
j
)
组合消息m的环签名,是一个2r + 1元组(P
1
,P
2
,...,P
r
;v;x
1
,x
2
,...x
r
) ,
验证签名:
通过公钥P
1
,...,P
r
, 计算y
i
=g
i
(x
i
), 加密得到y
1
,...,y
r
计算 k = Hash ( M ),
验证等式 C
k,v
(y
1
,y
2
,...,y
r
)=v 是否成立
下面介绍具体与RSA结合的方案!
RSA环签名
简单起见,所有成员公钥都具有相同的n,P
i
代表(n,e
i
)
选择对称密钥:k = hash(m);
随机均匀选择初始值v;
签名者为其他环成员均匀随机x
i
,并计算y
i
=g
i
(x
i
);函数gi单向陷门函数,可令g
i
(x)=x
e
i
mod n
根据组合函数C(k,v)的公式, 计算自己的y
j
′
, 其中E
k
(m)=m xor k
5.签名者利用私钥求解x
j
=g
j
1
(y
j
) ;
6.得到消息m上的签名为(P
1
,P
2
,...,P
r
;v;x
1
,x
2
,...x
r
) ;
具体工程代码,可在GitHub中找到很多开源实现。
小结
环签名的过程关键指出在于,如果知道私钥 sk
j
,那么就可以反推出 x
i
,使 y
1
,y
2
,...,y
r
形成一个环。好像签名者找了一根绳索,数学保证只有拥有私钥的人,才能把绳索的两头对接起来,形成环。而且一旦成为环之后,环的接点处也没有任何痕迹,这使得验证者无法判断该环是在哪个位置上接起来的。
环签名可以做到一定程度的匿名性,但是真实的签名者还是会暴露在环中。且在目前的公有链市场上,与环签名相比,零知识证明依然是最佳的匿名方案之一。
BTW,关于环签名还有一个有趣的历史故事,最早可以追溯到十七世纪的法国。相传,法国群臣向国王提意见的时候,为了不让国王查出是谁带的头,便采用了这种环形签名的方式,所有人的姓名以圆环的形式排列,隐匿了顺序,首倡人也就无从查起。