这篇博客详细介绍了环形签名的概念、目标和特性,阐明了如何通过一组公钥和随机数实现匿名性和不可伪造性,解释了环签名在现实案例中的应用,提供了环签名的一种实现方法.
在密码学中,环形签名是一种数字签名,可以由一组用户中的任何成员执行,每个用户都有密钥。因此,一个带有环签名的消息是由特定人群中的某个人背书的。环签名的安全特性之一是,不能通过计算确定哪个组成员的密钥才是签名。
例如,环签名可以用来提供一种来自“白宫高级官员”的匿名签名,而不透露是哪位官员签署了这条信息。环签名适合这个应用,因为环签名的匿名性不能被撤销,而且一个环签名的是可以临时组成的(不需要预先设置)。
以上信息来自百科
环签名的任务
环签名所要达成的目标是:在签名过程中将与私钥相关的信息隐藏在众多公钥之中。
环签名的可用性
在签名过程中,每个公钥都对应这一个随机数(随机数会参与计算),而签名者由于拥有自己的私钥,所以可以计算出一个能够使的环闭合的那个特定的数(之后会放在随机数里),我们无法在一堆随机数里找到这个特定的数,也就是说无法确定是谁的私钥参与了计算。但是可以确定这个签名一定是至少拥有这众多公钥之中某一个对应的私钥,不然是无法使环闭合。这就可以保证一定是环中的某个成员所签名认证的。
利用众多的公钥依次对消息进行加密(其中掺杂这随机数,随机数与公钥存在一一对应关系)
环签名的特性
除了上面所说的匿名性以外,环签名的另一特点是签名者在完成签名之后无法证明改环签名是由自己所签。
因为在随机数列表中他无法证明那个特定的随机数是签名者自己产生的,实际上每个拥有对应私钥的人都可以说某个随机数是他产生的。也都可以说是其他人产生的,因为从一个环的任意一点截断所得到的绳子一定是一样的。
通过现实案例解释环签名
例如你们需要实名举报你们某个人,但是谁都不想在这个签名纸上第一个签下自己的姓名(这相当与发起人),这时你提议所有人以某个点为圆形,在一定的半径上签名,在所有人都签完之后形成一个完整的环,这样也就无法确认这个环的首部在哪里。
当然这个案例所讲述的知识环签名的作用,在实际操作上与上述实例还是有很大的不同。
环签名的一种实现(利用各个公钥的加密算法)
- 签名者需要拥有:多个他人的公钥{P0,P1,P2…….Pn}注意这里的他人有n+1个,以及对应的加密算法Gi,自身的公私钥对
- 签名者首先计算待签名的哈希值用作签名,记做H
- 签名者为每个公钥产生一个对应的R,及产生{R0,R1,R2…….Rn}
- 签名者产生一个随机数V0,用做首次计算
- 签名者利用他人的公钥将Ri加密产生对应的Y,记做{Y0,Y1,Y2,Y3…..Yn}
- 依次计算V1=V0^Y0+H……..最后的到V(n+1):这一步已经利用晚所有的公钥(这里本来是连续亦或,后来发现连续亦或有可能导致H被抵消掉)
- 现在已经形成一个链,如果V0和最后一个V相等则会形成一个环(现在是不等的)
- 于是我们可以计算出那个使环闭合的Y,V0=V(n+1)^Y^H,这里V0,V(n+1),H都已知可以得到这个Y
- 也就是说只要我有一个特定的R,使得用我的公钥加密后的结果为Y,那么这个R就会使环闭合
- 所以这里就到了签名最关键的一步,在已知Y的情况下,签名者用自己的私钥很容易就可以计算出这个特定的R,因为这个Y是用签名者自己的公钥计算出的。
- 将签名者的私钥放在listP的尾部,R放在listR的尾部
- 这里由于会暴露签名者在这个公钥链表的尾部,所以还不急着把V放进去,在已知这是一个环的情况下我们只需要将这个环随机的转动一下,也就是对listP,listR进行一个循环移位,然后将对应的V选取出来得到这个签名S(listP,listR,V)
上述签名的可用性原理
要说明这个签名的可用性主要是要证明这个签名一定是由公钥中的某个人所签的,他人可以验证的到这个签名是正确的
首先在上述签名过程中使环闭合的那个数是由签名者私钥计算得出的,也就是说签名者至少拥有listP中某一个或多个公钥所对应的私钥,这也就说明了签名一定来自与listP中的某个人,在listP之外的人是无法伪造签名的。验证人只需要计算文件的hash然后利用计算出的H验证这个V成环。
先预约一下下次更新:go或者python实现环签名(实际上我已经用go大概实现了原理,但是go语言自带的rsa库中不能用私钥解密一个随机的数据,他还会验证数据是否可用,就是败在最关键的一步)😭,最迟下周6更新