引言

-假设一种场景,对某文件签名,而不让签名者看到文件内容,怎么做呢?

-有同学会说:我知道!让签名者把眼睛闭起来。是的,这也其实是一种办法。
当然更优化的方案是:把文件放到信封里,在信封里放一张复写纸,签名者在信封上签名时,
他的签名便透过复写纸签到文件上。

此时实现了让签名者不知道内容的同时,实现了数字签名,保护了文件的内容安全。
这里只是做一个简单的类比,实际情况中,信封就是消息的盲化操作。
(没耐心的人请直接阅读0x04 本文搬运自@Weisswire 大佬的博客 https://www.cnblogs.com/Severus-Cavendish/p/15587538.html)

0x01 盲签名的定义

是一种数字签名的方式,在消息内容被签名之前,对于签名者来说消息内容是不可见的,也就是盲化。

0x02 性质

不可伪造性:除了签名者本人外,任何人都不能以他的名义生成有效的盲签名。这是一条最基本的性质。
不可抵赖性:签名者一旦签署了某个消息,他无法否认自己对消息的签名。
盲性:签名者虽然对某个消息进行了签名,但他不可能得到消息的具体内容。
不可跟踪性:一旦消息的签名公开后,签名者不能确定自己何时签署的这条消息。
即签名者仅知sig(m'),而不知sig(m)。即使签名者保留sig(m')及其他有关数据,仍难以找出
sig(m)和、sig(m')之间的内在联系,不可对消息m的拥有者进行追踪

0x03 流程

  1. 接收者首先将待签数据进行盲变换,把变换后的盲数据发给签名者。
  2. 经签名者签名后再发给接收者。
  3. 接收者对签名再作去盲变换,得出的便是签名者对原数据的盲签名。

0x04 具体步骤

1.消息盲化。甲将原消息m进行盲化处理得m’,然后将盲消息m’传送给乙。进行盲化处理的方法很多,例如,可随机选取某个数,称该随机数为盲因子,把原消息数值化后,与盲因子相乘即可得到盲消息。

2.对盲消息签名。乙应用通常的数字签名方法对盲消息进行签名,并将其签名sig(m’)送给甲。

3.恢复签名。甲通过除去盲因子的方法,从盲签名sig(m’)中得到相关原消息m的签名:sig(m)。将来出现纠纷时,当甲拿出乙的盲签名,而乙显然不能否认其签名,这样就可以证明原消息的真实性。

传统的方案主要是RSA方案,区块链中多数时候会用到椭圆曲线进行签名。

0x05 应用场景

一切需要匿名签名的情况,比如

  1. 匿名投票
  2. 电子现金:一般的签名,签名者对自己发出的签名,必须是记得的,比如,在何时何地对谁发的,他自己可以记下来。
    但是,如果把签名看作是电子现金的话,就涉及到一个匿名性的问题。
    我们也不希望银行通过追踪自己发出签名,来获得用户的消费情况,于是就设计出盲签名。
欢迎关注我的个人公众号