Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

盲签名,群签名与环签名 #132

Open
AlexiaChen opened this issue Mar 2, 2021 · 0 comments
Open

盲签名,群签名与环签名 #132

AlexiaChen opened this issue Mar 2, 2021 · 0 comments
Labels
密码学 主流密码学

Comments

@AlexiaChen
Copy link
Owner

AlexiaChen commented Mar 2, 2021

前言

学习强国App真是个好物,很多Mooc学习资源它都有入口,看到电子科大有一门《现代密码学》所以就简单过了一遍。虽然平时是做区块链,但是涉及隐私计算这部分少,并且我们公司的技术并没有盲签名,群签名(组签名)的应用,所以还是打算简要介绍下。PlatON就是主要做隐私计算的,嗯。

正文

盲签名(Blind Signature)

盲签名是在发送者A和签名者B之间的双方协议,基本套路是:A发送一段信息给B,B对这和消息签名并返回给A,从这个签名中,A能够计算B关于A预先选取的消息m的签名。

以上说法有点绕,平时的签名我们接触到,就是签名者用自己的私钥对消息m(明文),进行签名,也就是签名者是知道消息m的内容的,这样暴露了消息隐私,那么有没有什么方法可以既不让签名者知道消息明文m,又可以对其进行签名并还不知道真实的签名数据呢?答案就是盲签名。盲签名的作用就是让签名者无法知道它对什么东西签了名,也无法知道其真实的签名,那么以后签名者B也不能将所签的消息和发送者A联系起来,也就是签名者貌似是把“眼睛”蒙蔽起来了。

那么盲签名具体有什么应用场景呢?

发送者A(客户)不希望签名者B(银行)能够将一条消息m及其签名Sig_B(m)与客户自己联系起来,可能消息m中有具体的金额数额,当m和Sig_B(m) 提交给B进行支付时,B无法推断原先接收签名的是谁。这就允许了A的匿名性,从而A的消费模式B也不知道。

大概的盲签名协议如下:

  • 签名者B需要一种数字签名机制。用Sig_B(m)记为B对m的签名
  • 函数f和g(只有发送者A知道),满足关系 g(Sig_B(f(m))) = Sig_B(m)。 f叫做盲化函数,g叫做去盲函数,f(m)叫做盲消息

以上协议大致就这样,你看到第二条就知道了,关键就是函数f和g的选择,这样才可以满足第二条的等式关系,你可以从关系等式中看到,对消息明文m进行签名就等价于给消息m“加密“以后的签名再“解密“以得到最原始的签名,也就是签名者B签出来的名不是对原始数据的签名,这样A既达到了签名的目的,也没有泄露自己消息m的隐私。非常强大。

一个比较成熟的盲签名协议---Chaum盲签名协议

这个协议是基于RSA公钥体系的,也是最原始的盲签名协议

  • 首先编码消息明文是m为一个大数字, m满足 0 <= m <= n - 1。 签名者B的RSA公钥和私钥分别是(n, e)和d。k是A随机选择的nonce,满足 0<= k <= n - 1 且 gcd(n, k) = 1
  • A对消息m进行盲化, f(m) = m*(k^e) mod n, 然后发送f(m)给B
  • B对盲化消息f(m)进行签名, Sig_B(f(m)) = f(m)^d mod n, 将它发送给A
  • A对盲化签名Sig_B(f(m))进行去盲得到最后原始签名, s = Sig_B(m) = g(Sig_B(f(m))) = k^(-1)* Sig_B(f(m)), s就是B关于m的签名

当然还有一些其他的盲签名方案,具体看参考。据了解,也有盲签名构造在BLS签名之上的,也有基于Elgamal签名的。盲签名在github上倒是能搜索到很多实现,js,golang的都有,也有基于盲签名构造以太坊上的电子投票。估计落地应用也很多了。

群签名(Group Signature)

1991年,Chaum等人提出了群签名的方法。该方案允许群里(组织)的某个成员以群的名义匿名地签名。满足以下三个条件:

  • 只有群中的成员才能代表群进行签名。
  • 签名的验证者能验证签名是哪一个群(组织)的一个合法签名,但是不能分别具体的签名者。
  • 一旦出现争端异议,可以借助群成员或一个可信的机构识别出签名者

这种机制也非常强大,一个应用就是匿名举报,比如一个单位某个人受贿贪污,在群中的成员可以匿名举报(对举报内容进行签名),并不用担心自己被泄露,如果最后更加上层的机构要奖励举报人,那么可以找到管理者把这个签名者恢复出来,这样就可以奖励举报人了。

一个群签名的基本协议为以下部分:

  • 建立群(Setup), 一个用以产生群公钥和私钥的多项式概率算法。
  • 加入群(join), 一个用户和群管理员之间的交互式协议。执行该协议可以使用户成为群成员,群管理员得到群成员的秘密的成员管理秘钥,并产生群成员的私钥和成员证书
  • 签名(Sign), 一个概率算法,当输入一个消息,一个群成员的私钥和一个群公钥后,输出对该消息的签名
  • 验证签名(Verify), 给定一个消息的签名和一个群公钥后,判断该签名相对于该群公钥是否有效,如果通过,就说明是这个群的某个成员签名的
  • 打开签名(open), 给定一个群签名,群公钥和群私钥的条件下,确定签名者的身份

现在群签名的方案有哪些?

就是斯坦福Dan Boneh他们的成果,简称BBS签名(不是BLS签名,但是用到了Weil Pairing等东西),论文名为Short Group Signatures。Github搜了下这个论文标题,貌似几乎没有什么代码实现,也不知道性能怎样,落地没落地,crypto exchange上也有个哥们儿跟我一样有疑惑,https://crypto.stackexchange.com/questions/81238/practical-group-signatures 哈哈, 密码学的东西真是浩如烟好,都快看不完了,我还是先把BLS签名搞明白吧,毕竟这个是真有落地大量应用了。

环签名(Ring Signature)

现在有大量落地的是环签名(Ring Signature), 环签名是群签名的一种演化,消除了一些群签名的弊端,但是也增加了审计难度,门罗币这些有用到。

环签名中只有环成员没有类似于群签名的管理者, 不需要环成员之间的合作,签名者作为一个环成员,只要利用自己的私钥和其他成员的公钥集合就可以独立对消息m进行签名,任何人都可以通过环签名s,消息m和成员的公钥集合来校验这个签名是否合法。环签名对签名者有无条件匿名的优势,环中其他成员也不能伪造签名者的真实签名(在私钥不泄露的情况下)。

环签名的生成首先要生成一个签名环,环签名的原始方案就是基于RSA的,具体算法细节就不细细研究了。有空看wikipedia吧。

有三种环签名:

  • Threshold ring signatures
  • Linkable ring signatures
  • Traceable ring signature

CryptoNote实现的是Fujisaki和Suzuki那篇论文里的Traceable ring signature。

参考

@AlexiaChen AlexiaChen added the 密码学 主流密码学 label Mar 2, 2021
@AlexiaChen AlexiaChen changed the title 盲签名与群签名 盲签名,群签名与环签名 Mar 2, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
密码学 主流密码学
Projects
None yet
Development

No branches or pull requests

1 participant