基於RSA的簽名方案
Hash函數簽名
s=m^dmodn 計算量太大,實際情況是對m利用一個安全的公開的Hash函數來產生消息摘要h(m),然后計算簽名:
s=[h(m)]^dmodn
驗證過程為:
s^emodn=h(m)=>Ver=True
優點:
①計算更快;
②原有方案可被攻擊,新方案無法攻擊。
Hash函數也稱為散列函數、雜湊函數,它是一種將任意長度的輸入變換為固定長度輸出的不可逆的單向函數,並且沒有陷門。
(1)Hash函數結構
Hash函數一般采取迭代壓縮結構,將輸入消息分為L個固定長度的分組,每個分組長bbit,最后一個分組包含輸入消息的總長度,若最后一個分組不足bbit,可用全0或全1序列填充為bbit。
其中的f函數通常是復雜的非線性函數關系,由其實現單向性。
注:Hash函數主要有:MD4、MD5、SHA1、SHA256、SHA512等。
(2)要求
①Hash函數可應用於任意長度的消息,產生定長的輸出;(至少是160bit)
②對於消息x,計算h(x)容易,但由h(x)值求x在計算上是不可行的,(此稱為單向性)
(所謂計算上不可行是指:理論上存在x,但是無法找到有效的方法計算出,只能窮舉。)
③抗碰撞性:無法找到兩個消息x≠y,但h(x)=h(y)。
(h(x)是多對一函數,但到目前為止,未出現過一次碰撞,即使意外的情況也沒有。)
例 選取參數p=13,q=11,e=13,h(m)=16,進行簽名並驗證。
解:(1)參數
則公鑰:k1=(e,n)=(13,143)
私鑰:k2=d=37
(2)簽名
S=[h(m)]dmodn=1637mod142=3
(3)驗證
semodn=313mod143=16=h(m)
所以Ver=True