六 數字簽名 - 消息到底是誰寫的

在這裏插入圖片描述
從上一篇文章裏面我們知道,消息認證碼可以識別篡改或者發送者身份是否被僞裝,也就是驗證消息的完整性,還可以對消息進行認證。但是消息認證碼的缺陷就在於它的共享密鑰上面。由於雙方都有共享祕鑰,第三方無法確認是哪一方發出,導致無法防止抵賴。

數字簽名就是爲了解決抵賴的問題的。解決的方法是使用公鑰密碼,用私鑰加密相當於生成簽名,用公鑰解密相當於驗證簽名。

公鑰密碼與數字簽名

如下圖對照公鑰密碼和數字簽名的過程:

  • 公鑰密碼
  • 數字簽名

數字簽名的方法

  • 直接對消息簽名的方法
  • 對消息的散列值簽名的方法

直接對消息簽名的方法

對消息的散列值簽名的方法


由於公鑰加密的速度,一般使用對消息的散列值簽名的方法,因爲消息的散列值長度短並且固定。

數字簽名的應用實例

信息安全公告

信息安全組織會在網站上發佈一些關於安全漏洞的警告。由於這些信息需要被更多的人知道,所以沒有必要對消息進行加密。但是需要防止有人僞裝該組織發佈虛假信息,這個時候只需要加上數字簽名即可。這種對明文消息所施加的簽名,一般稱爲明文簽名(clearsign)

軟件下載

爲了保證下載軟件的安全,不是惡意的病毒,軟件作者會對軟件加上數字簽名。用戶在下載完成以後,驗證數字簽名就能識別出下載的是不是被篡改過的軟件。

公鑰證書

驗證數字簽名的時候需要合法的公鑰,但是如何才能知道自己拿到的公鑰是合法的呢?這個時候就需要把公鑰作爲信息,對它加上數字簽名,得到公鑰證書。關於證書的問題再下一篇文章裏面詳細分析。

SSL/TLS

SSL/TLS 在認證服務器身份的時候會使用服務器證書,服務器證書就是加上了數字簽名的服務器公鑰。

數字簽名的實現方式

RSA

  1. 用RSA生成簽名
簽名 = 消息^D mod N (用 RSA 生成簽名)    

上面的 D 和 N 就是簽名者的私鑰。簽名就是對消息的 D 次方求 mod N 的結果。

  1. 用RSA驗證簽名
由簽名求得的消息 = 簽名^E mod N (用 RSA 驗證簽名)

上面的 E 和 N 就是簽名者的公鑰。驗證者計算簽名的 E 次方並求 mod N,得到“由簽名求得的消息”。將這個消息和發送者直接發過來的消息進行對比,如果一致就驗證成功,不一致就驗證失敗。

ElGamal方式

EIGamal 方式是由 Taher ElGamal 設計的公鑰算法,利用了在 mod N 中求離散對數的困難度。ElGamal 方式可以被用於公鑰密碼和數字簽名。

DSA

DSA(Digital Signature Algorithm)是一種數字簽名的算法。是由 NIST(National Institute of Standards and Technology,美國國家標準技術研究所)於 1991 年制定的數字簽名規範(Digital Signature Standard,DSS)。DSA 是 Schnorr 算法和 ElGamal 方式的變體,只能用於數字簽名,不能進行加密解密。

和 DH 算法類似,DSA 算法主要了解的也是其參數。通過參數文件生成密鑰對。p、q、g 是公共參數,通過參數會生成密鑰對,DSA 的公共參數和 DH 的公共參數很像,通過公共參數能夠生成無數個密鑰對,這是一個很重要的特性。

p 是一個很大的質數,這個值的長度建議大於等於 1024 比特(必須是 64 比特的倍數),p-1 必須是 q 的倍數,q 的長度必須是 160 比特。而 g 是一個數學表達式的結果,數值來自 p 和 q。

DSA算法中應用了下述參數:

p:L 比特長的素數。L 是 64 的倍數,範圍是 512 到 1024;
q:p – 1 的 160 比特的素因子;
g:g = h^((p-1)/q) mod p,h 滿足 h < p – 1, h^((p-1)/q) mod p > 1;
x:x < q,x 爲私鑰;
y:y = g^x mod p ,( p, q, g, y )爲公鑰;
H( x ):One-Way Hash函數。DSS 中 選用 SHA( Secure Hash Algorithm )。

DSA 的密鑰對生成就取決於這三個公共參數 p、q、g。計算簽名和驗證簽名也依賴參數文件。

ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm)是一種利用橢圓曲線密碼來實現的數字簽名算法。

就像 DH 算法結合 ECC 一樣,DSA 算法也能結合 ECC,稱爲 ECDSA 數字簽名算法。相比 DSA 算法,ECDSA 算法安全性更高。

在 ECDSA 中,有三個參數很重要:

  • ECDSA 算法選擇的命名曲線。
  • G,橢圓曲線的基點
  • n,相當於 G 基點的打點操作,n * G = 0

數字簽名無法解決的問題

數字簽名所用到的公鑰密碼中的公鑰需要另外認證,防止中間人攻擊。認證用於驗證簽名的公鑰必須屬於真正的發送者。

似乎陷入了一個死循環。數字簽名用來識別消息篡改,僞裝以及防止抵賴。但是我們又必須從沒有被僞裝的發送者得到沒有被篡改的公鑰纔行。

爲了驗證得到的公鑰是否合法,必須使用證書。證書是將公鑰當做一條消息,由一個可信的第三方對其簽名後所得到的公鑰。

參考資料

該系列的主要內容來自《圖解密碼技術第三版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章