數字簽名一般利用公鑰密碼技術來實作,其中私鑰用來簽名,公鑰用來驗證簽名。比較典型的數字簽名方案有:
· RSA簽名算法(R. L. Rivest, A. Shamir, and L. M. Adleman, 1978)
· ElGamal 簽名算法(T. ElGamal, 1985)
· Schnorr簽名算法(C. P. Schnorr, 1989)
· DSS簽名算法(NIST, 1991)
基于RSA公鑰體制的簽名方案通常稱為RSA數字簽名方案。RSA簽名體制的基本算法如下:
密鑰的生成(與加密系統一樣):
公鑰Pk={e,n};私鑰Sk={d}
簽名過程(d,n):
使用者A對消息M∈Zn進行簽名,計算:
并将S附在消息M後
驗證過程(e,n):
給定(M,S),Ver(M,S)為真,則H(M)=Se(mod n)成立
假設RSA直接對消息進行簽名
一般攻擊:攻擊者任選一個資料Y,用A的公鑰計算 X=Yemodn,于是便可以用Y僞造A對消息X的簽名,因為:
· 實際意義不大:僞造的消息X具有實際意義的機率很小
· Hash函數可以抵禦這種攻擊
· 使用者不要輕易對其他使用者提供的随機資料進行簽名
· 更有效的方法:對資料的Hash值簽名
利用簽名獲得明文:攻擊者截獲密文C=Memod n,選擇随機數r,并計算:
然後攻擊者設法讓發送者對y簽名,獲得:
攻擊者計算:
· 使用者不要輕易對其他使用者提供的随機資料進行簽名
· 更有效的方法:對資料的Hash值簽名
H(M)的另一個作用一加快簽名速度
· 對整個消息簽名,由于公鑰體制速度比較慢,當消息比較長時,簽名與驗證過程都會相當慢
· 對消息的Hash值簽名,則無論消息多長,簽名都隻與Hash值的長度有關
RSA算法比較慢,用私鑰進行簽名和公鑰進行驗證。因上述RSA簽名算法沒有加入随機數,當出現重複性的原始資料,攻擊者會通過相同簽名資訊而猜測出原文。應該怎麼辦呢?
· PSS (Probabilistic Signature Scheme)私鑰簽名流程的一種填充模式。
· 目前主流的RSA簽名包括RSA-PSS和RSA-PKCS#1 V1.5。
· 後者相對應PKCS (Public Key Cryptography Standards)是一種能夠自我恢複簽名,而PSS無法從簽名中恢複原來的簽名。
· OpenSSL-1.1.x以後預設使用更安全的PSS的RSA簽名模式。
RSA-PSS數字簽名算法
密鑰生成
生成一個模數n,一個公鑰e和一個私鑰d。
假設安全參數為k(n是k比特的數),我們定義兩個整數k0和k1并且滿足:k0+k1≤k-1
簽名算法
為了對一個消息m進行簽名,簽名者執行以下步驟:
驗證算法
為了對一個消息m進行的簽名s進行驗證,驗證者執行以下步驟:
今天的課程就到這裡啦,下一堂課我們将介紹經典的數字簽名算法—ElGamal數字簽名算法,帶大家繼續了解數字簽名,敬請期待!