5.6.1 盲签名
盲签名由Chaum提出,其目的是避免签名者看到消息和自己对该消息的签名,从而无法将所签的消息和求取签名者联系起来。这一点在数字现金、电子投票等领域有着很大的应用价值。例如,在数字现金交易中,求取签名者为付款用户A,签名者为银行B。在用户进行消费时,支付之前用户需要向银行求取对消费金额m的签名SB(m);然后某一实体(如A进行消费的商店)将消费金额和银行的签名都提交给银行以便进行支付。利用盲签名,银行无法根据提交的信息判断该用户是谁,从而保证了用户A的匿名性,进而用户的消费模式不被监视。在此可以把银行对消费金额的签名看成电子支票,就像你用来付款的人民币上不需要也不应该有你的名字一样,根据电子支票银行也无法追踪到用户本人。
盲签名的思想是:求取签名者发送一个消息给签名者,签名者对其签名后发送给求取签名者。根据这个签名,求取签名者可以计算出签名者对于预选消息的签名。这样,当签名完成时,签名者既不知道自己所签的消息,也不知道对该消息的签名。其中,预选消息与发送消息之间的映射称为盲化函数,其逆函数称为反盲化函数。盲签名的原理如图5-5所示。
图5-5 盲签名的原理
盲签名的实现有多种方式,在此只介绍最经典的基于RSA的盲签名。这种签名方式由D.Chaum在1985年提出,它也是第一个盲签名方案。
假设用户A向用户B求取对消息m的签名,用户B的私钥为d,公钥为e,模为n,盲签名的过程为:
(1)A选用盲因子k,1<k<m,计算t=mke mod n,并将t传给B;
(2)B对t进行签名得到s(t)=td=(mke)d mod n,并将签名s(t)传给A;
(3)A计算S=td/k mod n=md mod n,得到A对消息m的签名S。
例5-8 举例说明盲签名过程。假设A的公钥为e=5,私钥为d=77,模为n=119,消息m=3。盲签名的步骤如下:
(1)A选用盲因子k=2,满足1<k<m,计算t=mke mod n=3×25 mod 119,并将t传给B;
(2)B对t进行签名得到s(t)=td=(mke)d mod n=(3×25)77 mod 119,并将签名s(t)传给A;
(3)A计算:
S=td/k mod n=md mod n=(3×25)77/2 mod 119
=377×2/2 mod 119=377 mod 119
从而得到A对消息m的签名S。