數字簽名的實現方案
基於RSA的簽名方案
方案的原理:
簽名者使用自己的私鑰對待簽名消息m進行簽名(加密),然后將m和密文發送給接收者,接收者使用簽名者的公鑰進行驗證(解密)。簽名驗證過程與RSA加解密過程相似。
- 方案
(1)參數設置
① 任取兩個大素數p和q;
② 計算n=p*q(注:此時n只有唯一一種分解方法),

③ 隨機選取整數e,滿足:

④ 用歐幾里得擴展算法計算d,滿足:
⑤ 公開密鑰(公鑰): k1=(e,n)
私有密鑰(私鑰):k2=(p,q,d)
(2)簽名(即加密過程)
對於待簽名消息m,簽名:
s=m^dmodn
(3)驗證過程(即解密過程)
s^emodn=m ==> Ver=True
(4)正確性證明

- 簽名與加密的結合
設A:簽名者、發送者 B:接收者、驗證者
方法一:
對於明文m,A利用自己的私鑰計算簽名s,將(m,s)利用B的公鑰加密為(cm,cs),然后將(cm,cs)發送給B,B接收后利用自己的私鑰解密得到(m,s),再利用A的公鑰進行驗證;
方法二:
明文m,A利用B的公鑰加密得到c,對c進行簽名為s,將(c,s)發送給B,B接收后利用A的公鑰進行驗證,驗證通過后再利用自己的私鑰進行解密得到m。
注:方法二有缺點,可被偽造簽名,一般使用方法一。
竊聽者H竊取到A發給B的(c,s),H將密文c用自己的私鑰和簽名算法進行簽名得簽名s',然后將(c,s')發給B,B接收后發現是H發送的,則B利用H的公鑰進行驗證C確實是H發送的,B再用自己的私鑰解密c得明文m,則B誤認為明文m是H發送給B的。
(例如招標標底的提交。)
- Hash函數簽名
前述簽名中s=m^dmodn計算量太大,實際情況是對m利用一個安全的公開的Hash函數來產生消息摘要h(m),然后計算簽名:

驗證過程為:

優點:
①計算更快;
②原有方案可被攻擊,新方案無法攻擊。
Hash函數也稱為散列函數、雜湊函數,它是一種將任意長度的輸入變換為固定長度輸出的不可逆的單向函數,並且沒有陷門。
