
設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)再簽名則不存在該問題,或者簽名和加密使用不同的密鑰對也能避免該問題。
