盲签名是由David Chaum提出的一种特殊签名方式,盲签名允许消息拥有者先将消息盲化后,把盲化后的消息发送给签名者进行签名,最后消息的拥有者对签名进行去盲因子处理,得到原消息的签名。盲签名就是接收者在不让签名者获取所签署消息具体内容的情况下所采取的一种特殊的数字签名技术,盲签名需要满足如下两个特殊性质:
根据不同的公钥密码体制构造依赖于不同密码假设下的盲签名方案,通常使用的有基于RSA的盲签名算法、基于Elgamal的盲签名算法、基于ECC的盲签名算法以及最近很火的基于格的盲签名。下面依次介绍(除了基于格的盲签名,格真是太难了)。
消息m的拥有者选取一个随机数r,使得,N为RSA中的模数,即选择一个与N互素的数,对消息m的盲化,计算如下:(其中为盲因子,e为签名者的公钥。)
消息的拥有者发送给签名者,签名者的私钥为d,公钥为e,签名者进行如下计算:
签名者将s'发送给拥有者,拥有者进行去盲因子处理,进行如下计算:
由于RSA中公私钥对的性质,使得,因此,消息m的签名是s,正确性如下:
首先介绍下Elgamal的签名算法,其中p为一个大素数,g为中的一个生成元,若私钥为,对应的公钥为,过程如下:
下面我们来介绍基于Elgamal的盲签,假设Alice和Bob的公私钥对分别为、,Alice需要Bob为消息m进行盲签名。过程如下:
Remarks:公式的正确性推导,手算一下就行了,即(r,s)是否为正确的签名结构。
椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则。椭圆曲线在如下两个域中定义:
域,素数域,p为大素数;
域,特征为2的有限域,称之为二元域 或者二进制扩展域。在该域中,元素个数为个。
我们只介绍素数域。一些术语说明如下:
首先介绍下ECDSA,假设签名者的公私钥对为,其中,,G为基点,为消息m进行签名。
签名过程如下:
签名者将签名和消息m发送给验证者,验证者进行验签,验签过程如下:
Remarks:算法正确性的判断,计算生成(x,y)的是否是kG即可。
基于ECC的盲签名有很多方案,我们介绍最为经典的一个方案,Schnnor盲签名。椭圆曲线的参数如上,签名者Bob的公私钥对为,其中,并且Bob每次盲签名都会新生产一对临时签名公私钥对。用户Alice想让签名者对消息m进行盲签名,流程如下:
PS:肯定有小伙伴对Schnnor盲签名的结果有所疑惑,签名结果与ECDSA的签名信息不一致,这是因为Schnnor盲签名的结果对应于Schnnor签名,Schnnor签名与ECDSA是两种不同的基于ECC的签名方案,欲知后事,请听下回详细分解。