數字簽名
???——消息到底是誰寫的
數字簽名
從消息認證碼到數字簽名
- 消息認證碼的局限性
?通過前面介紹的消息認證碼,我們尅識別消息是否被篡改或者發送者身份是否被偽裝,也就是可以校驗消息的完整性,還可以對消息進行認證。然而,消息認證碼是無法防止否認。
?消息認證碼值之所以無法防止否認,是因為消息認證碼需要在發送者和接收者兩者之間共享同一個密鑰。因為密鑰是共享的,所以能夠使用消息認證碼計算出正確的MAC值并不只有發送者,接收者也可以計算出正確的MAC值。由于雙方都能計算出正確的MAC值,因此對于第三方來說,我們是無法證明這條消息的確是由發送者生成的。 - 通過數字簽名解決問題
?我們假設發送者使用密鑰是一個只有自己才知道的私鑰。當發送者發送消息時,用私鑰生成一個“簽名”。相對地,接收者則使用一個和發送者不同的密鑰對簽名進行驗證。接收者的密鑰無法根據消息生成簽名,卻可以對簽名進行驗證,也就是說可以知道這個簽名是由發送者的密鑰計算出來的。這就是數字簽名。
簽名的生成和驗證
?在數字簽名技術中,出現了下面的兩種行為。
- 生成消息簽名的行為
- 驗證消息簽名的行為
?生成消息簽名 這一行為是由消息的發送者Alice來完成的,也稱為“對消息簽名”。生成簽名就是根據消息內容計算數字簽名的值,這個行為意味著“我認可該消息的內容”
?驗證數字簽名 這一行為一般是由消息的接收者Bob來完成的,但也可以由驗證消息的第三方來完成,這里的第三方在之前一直被命名為驗證者Victor。驗證簽名就是檢查該消息的簽名是否真的屬于Alice,驗證的結果可以是成功或者失敗,成功就意味著這個簽名是否屬于Alice的,失敗則意味著這個簽名不是屬于Alice的。
?在數字簽名中,生成簽名和驗證簽名者兩個行為需要使用各自專用高德密鑰來完成。這不就是公鑰密碼么,在公鑰密碼中,密鑰分為加密密鑰和解密密鑰,用加密密鑰無法進行解密。此外,解密密鑰只能由需要解密的人持有,而加密密鑰則是任何需要加密的人都可以持有的。實際上,數字簽名就是通過將公鑰密碼“反過來用”而實現的。
公鑰密碼與數字簽名
?先回顧一下前面說的公鑰密碼
? 數字簽名中也會使用到公鑰和私鑰,不過,這兩個密鑰多的用法和公鑰密碼是相反的,即用私鑰加密相當于生成簽名,而用公鑰解密則相當于驗證簽名。
?用私鑰進行加密這一行為只能由持有私鑰的人完成,正事基于這一事實,我們才可以將用私鑰加密的密文作為簽名來對待。
?由于公鑰是對外公開的,因此任何都能夠用公鑰進行解密,這就產生了一個很大的好處,即任何人都能對簽名進行驗證。
數字簽名的方法
?下面我們來介紹兩種生成和驗證數字簽名的方法
- 直接對消息簽名的方法
- 對消息的散列值簽名的方法
?直接對消息簽名的方法比較容易理解,但是在實際過程中,我們并不會使用;對消息散列值簽名的方法,稍微復雜一點,但實際過程中,我們一般都是使用這種方法。
直接對消息簽名的方法
- Alice用自己的私鑰對消息進行加密
- Alice將消息和簽名發送給Bob
- Bob用Alice的公鑰對收到的簽名進行解密
- Bob將簽名解密后得到的消息與Alice直接發送的消息進行對比。
對消息的散列值簽名的方法
- Alice用單向散列函數計算的消息的散列值。
- Alice用自己的私鑰對散列值進行加密。
- Alice將消息和簽名發送給Bob。
- Bob用Alice的公鑰對收到的簽名進行解密。
-
Bob將簽名解密后得到的散列值與Alice直接發送的消息的散列值進行對比。
Alice對消息的散列值簽名,Bob驗證簽名(按時間順序).png
對數字簽名的疑問
疑問:
用私鑰加密消息得到簽名,然后再用公鑰解密消息并驗證簽名,密文為什么能歐具備驗證簽名的意義呢?
解答:
雖然實際進行的處理內容是用私鑰進行加密,但這里的加密并非是為了保證機密性而進行的。
數字簽名時利用了“沒有私鑰的人事實上無法生成使用該私鑰所生成的密文”這一性質來實現的。這里所生成的密文并非被用于保證機密性,而是被用于代表一種只有持有該密鑰的人才能夠生成的信息。
這樣的信息一般稱為認證符號(authenticator),消息認證碼也是認證符號的一種,數字簽名也是一樣的。數字簽名時通過使用私鑰進行加密來產生認證符號的。
疑問:
消息沒有經過加密就發送了,這樣不就無法保證消息的機密性了嗎?
解答:
的確如此,數字簽名的作用本來就不是保證機密性。
如果需要保證機密性,則可以不直接發送消息,而是將消息進行加密之后再發發送。
疑問:
數字簽名只不過是計算機上一種數據,貌似很容被復制。但如果可以輕易復制出相同的內容,那還能用作簽名嗎?
解答:
雖然叫作簽名,但它也僅僅是計算上的一種普通的數據而已。數字簽名可以附加在消息的末尾,也可以和消息分離,單獨作為文件來發送,但無論如何,我們都可以像復制普通文件一樣,很容易的復制出任意個內容相同的副本。
但是,簽名可以被復制,并不意味著簽名就沒有意義,因為簽名所表達的意義是特定的簽名者對特定的消息進行了簽名,即便簽名被復制,也不會改變簽名者和消息的內容。
真正重要的是特定簽名者與特定的消息綁定在了一起這一事實。
疑問:
數字簽名只不過是普通的數據,消息和簽名兩者都是可以任意修改的,這樣的簽名還有意義嗎?
解答:
的確,簽名之后也可以對消息和簽名進行修改,但是這樣修改之后,驗證簽名就會失敗,進行驗證的人就能夠發現這一修改行為。數字簽名所要實現的并不是防止修改,而是識別修改。修改沒問題,但驗證簽名會失敗。
追問:
能不能同時修改消息和簽名,是的驗證簽名能夠成功呢?
解答:
事實上是做不到的。
以對散列值簽名為例,只要消息被修改1個比特,重新計算的散列值都會發生很大的變化,要拼湊出合法的簽名,必須在不知道私鑰的前提下對新產生的散列值進行加密,事實上這是無法做到的,因為不知道私鑰就無法生成用該私鑰才能生成的密文。
疑問:
如果得到了某人的數字簽名,應該就可以把簽名的部分提取出來附加在別的消息后面,這樣的還有效嗎?
解答:
的確,可以將簽名部分提取出來并附加到別的消息后面,但是嚴重簽名會失敗。總之,將一份簽名附加在別的消息后面,驗證簽名就會事變。
疑問:
如果是紙質的借據,只要將原件撕毀就可以作廢。但是帶有數字簽名的借據只是計算機文件,將其刪除也無法保證確實已經作廢,因為不知道其他地方是否還有副本。無法作廢的簽名是不是非常不方便呢?
解答:
的確,帶有數字簽名的借據即便刪除掉也無法作廢,要作廢帶有數字簽名的借據,可以重新創建一份相當于收據的文書,并讓對方在這份文書上加上數字簽名。
疑問:
消息認證碼無法防止否認,為什么數字簽名就能夠防止否認呢?
解答:
防止否認與“誰持有密鑰”這一問題密切相關。
在消息認證碼中,發送者和接收者都能夠計算MAC值,相對地,在數字簽名中,能夠生成簽名的密鑰(私鑰)只有發送者才持有,因此發送者沒法說,“這個簽名不是我生成的”,當然了,如果數字簽名的發送者說“我的私鑰被盜了”,也是有可能進行否認的。
疑問:
紙質借據如果不簽名蓋章的話,總是覺得不太放心。數字簽名真的能夠有效代替現實世界中的簽名和蓋章嗎?
解答:
數字簽名技術有很多優點,例如不需要物理交換文書就能夠簽訂合同,以及可以對計算機的任意數據進行簽名等。然后對于實際上能不能代替簽名這個問題還是有一些不安的因素。其中一個很大的原因恐怕是簽訂合同、進行認證這樣的行為是一種社會的行為。
數字簽名技術在未來將發揮重要的作用,但是單詞認為數字簽名筆普通的印章或手印簽名更可信是很危險的。一種新技術只有先被人民廣泛認知,并對各種問題制定相應的解決辦法只好,才能被社會真正接受。
該系列的主要內容來自《圖解密碼技術第三版》
我只是知識的搬運工
文章中的插圖來源于原著