设RSA算法的私钥为d,公钥为(e,n),则RSA签名算法的思想就是:签名者用自已的私钥d加密文件摘要,其他人用签名者的公钥e就可以验证签名。
RSA算法签名过程是:用户A对消息M进行签名,他先计算M的摘要H(M),再用私钥d签名:
SA=Sig(H(m)=(H(m))d mod n
最后将SA附在M后,作为用户A对消息M的签名。
RSA算法验证签名过程是:如果其他用户要验证用户A对消息M的签名,则他们用A的公钥e计算
M'=SAe mod n
如果M'与M相等,则确定签名是用户A所产生的。可见,RSA签名算法的计算过程就是RSA加密算法的逆过程。
RSA数字签名需要注意以下事项:若用RSA算法达到数字签名,先对消息求消息摘要是必须的,再用私钥签名;或签名的密钥对专用于签名,而用另外一对公钥/私钥对进行加/解密。
这是因为,签名者的公钥e和n是公开的,攻击者如果截获别人发给签名者的密文c(c是别人用签名者的公钥e加密得到的,即c=me mod n),则攻击者可以任选一个与n互素且小于n的数r,计算
x=re mod n
y=xc mod n
将y发给签名者签名,如果他随意就用自己的私钥d给攻击者发来的y签名,即
u=yd mod n
则攻击者获得签名u后,就可以轻松地恢复出c对应的明文m。他首先计算r的乘
法逆元t,即t=r-1 mod n,再把t和u相乘即得到m,这是因为
tu=r-1yd mod n
=r-1(xc)d mod n=r-1xdcd mod n
=r-1redcd mod n=r-1rk∂(n)+1cd mod n
=r-1rcd mod n=cd mod n=m
而如果先对消息y求消息摘要H(y)再签名则不存在该问题,或者签名和加密使用不同的密钥对也能避免该问题。