公有密鑰/私有密鑰加密

如果你的朋友給你發送了一封郵件,老朋友多日未見說了些寒暄的話,最後你的朋友又來了一句,今天晚上六點我請你到北京飯店吃飯吧,怎麼樣?你可能對這句話比較懷疑,這小子今天頭腦是不是有問題?在看看這封郵件的地址,還真是他的郵件地址,但認識這小子很多年了,從來沒請我吃過飯。今天???一連串的問號在你的頭腦中。如果你對這樣的問題比較感興趣,那麼讓我幫你慢慢的解開謎底吧?

實際上產生這樣的問題,原因很簡單,你朋友發的郵件信息是很容易被人竊取到的,竊取人竊取到郵件信息後做適當的修改,然後再發送給你。你看到的郵件實際上已經是被其他人修改過的郵件了,他可能只是給了你一個小的惡作劇而已,更大的問題可能在你的生活中就會遇到了。如果是這樣的話,那麼不是太可怕了嗎?其實解決這樣的問題也不難,請跟我看消息摘要是如何解決以上問題的?

一、消息摘要

我們可以將我們要發送的消息,通過某種數學上的安全散列算法計算出一個值(這個值後面我們就稱之爲消息摘要)。消息摘要我們可以把它比喻成指紋,指紋大家都知道每個人都不一樣,甚至一個人的不同手指也不一樣。這就是說只要我們的消息不同,那麼通過這種安全散列算法計算出的消息摘要肯定是不同的,相同的概率是非常低的,到底有多低呢?根據James Walsh的敘述,一個人死於雷擊的概率爲三萬分之一,現在你選出9個人,比如你非常討厭的9個人,你和這9個人同時死於雷擊的概率,你想想有多低,所以你忽略不計吧。姑且認爲是不太可能重複的(當然,有可能有10個人是同時死於雷擊的,但這10個人不會都是你非常討厭的人吧 )。

MD5和SHA1都是常見的安全散列算法,當然我們不必關心這些算法的具體細節,我們只需要知道他們要解決什麼問題就可以了。最好不要再去使用MD5算法,因爲這個算法已經在2004年被山東大學王小云教授破解。

知道了消息摘要是什麼,那麼我們到底怎麼解決如上問題呢?我們來看,如果將你朋友要發給你的消息我們稱之爲A,通過安全散列算法計算出的消息摘要我們稱之爲AS,然後你的朋友將A和AS一起發送給你。如果竊取者竊取了信息A,然後將其改爲B,再發送給你。這時你接收到的肯定是消息B,之後你計算B的消息摘要我們稱之爲BS,現在BS和AS的值肯定不一樣,所以你就會知道了,這個消息B一定是被修改過的消息,已經非原版了。

消息摘要看似很簡單就解決了問題,但是你要小心了,如果竊取者在竊取到了消息A後,將其改爲B,如果他還是將消息摘要AS發送給你的話,那麼這個竊取者就是個十足的笨蛋,他的水平充其量也就是孫老師這樣的水平。他完全可以再重新計算B的消息摘要,這時我們稱之爲BS,然後將B和BS發送給你。當你收到消息B後,你再計算B的消息摘要,那肯定是BS,那你就可以相信這個消息了嗎?很明顯,非也。那麼我們究竟該怎麼辦呢?答案是藉助數字簽名。

二、數字簽名

剛剛我們已經知道了如果消息改變了,那麼改變後的消息與原消息的消息摘要一定是不同的。我們將消息和消息摘要分別傳送,如果消息摘要沒有被截獲那麼我們還是可以知道消息是否被更改了,但是如果消息和消息摘要都被截獲的話,那麼我們也不會知道消息是否被篡改了。下面我們看一下數字簽名如何解決這個問題。

爲了瞭解數字簽名的工作原理,我們有必要先了解一下公共密鑰加密技術。公共密鑰加密技術是基於公共密鑰和私有密鑰這兩個概念的。它的設計思想是你可以將公共密鑰告訴世界上的任何人,但是隻有你才擁有私有密鑰,最重要的是你一定要保護好你的私有密鑰,不要將它告訴任何人。公共密鑰和私有密鑰是有數學關係的,那你可能會擔心,很多人都知道我的公共密鑰,他們根據公鑰密鑰會不會推斷出我的私有密鑰呢?你的擔心是有道理的,但是你大可放心,幾乎是不可能的?這似乎令人難以相信,但直至今日,還沒有人能夠找到一種能夠通過公共密鑰來推斷私有密鑰的方法。所以在目前看來這種技術是絕對安全的,應該完全去信任它。那麼我們怎麼去使用這兩個密鑰呢?非常簡單,如果消息用公共密鑰去加密,那麼只能通過私有密鑰去解密。如果消息用私有密鑰去加密,那麼只能通過公有密鑰去解密。看起來非常簡單,的確它就是這麼簡單。基於這兩句話,公共密鑰加密技術有兩個非常有用的應用:

1、數據加密

如果某人給你發送數據,他用你的公共密鑰加密數據,那麼這個數據就只有你能夠看得懂,因爲只有你才擁有私有密鑰。其他人根本無法解密數據。

2、數據認證

如果你用私有密鑰加密一個數據,那麼任何持有你公有密鑰的人都可以解密數據,當然這個時候並不是爲了保密數據,而是爲了證明這個數據是不是你發送的。你想想看,如果某人用你的公共密鑰解開了數據,他就會知道這個數據一定是你發送的,因爲通過其他人的公共密鑰是不可能解開數據的。

通過上面的介紹你應該知道了公共密鑰加密技術的用途了,那麼怎麼產生公共密鑰和私有密鑰呢?有很多的算法,其中比較有名的是RSA和DSA。

好了,現在我們就可以通過使用公共密鑰加密技術的數字簽名來徹底解決上面的問題了,我們還是用剛纔的字母來舉例

1) 你的朋友通過某種軟件產生一對密鑰(公共密鑰和私有密鑰)。

2)然後你的朋友和你聯繫,將他的公共密鑰告訴你和其他的人。

3)通過產生的私有密鑰對A加密,產生加密數據,這個加密的數據我們就稱之爲數字簽名,我們用AS表示。

4)你的朋友將A和AS發送給你,如果發送過程中被竊取了,竊取者將A改爲了 B,現在戲劇性的事情發生了,我們來看看這個竊取者怎麼僞造數字簽名?數字簽名是用私有密鑰來加密數據產生的,這個竊取者根本就沒有你朋友的私有密鑰,因爲私有密鑰沒有在網絡上傳送。如果竊取者也通過一個軟件產生了一對密鑰,然後用他的私有密鑰對B加密產生了新的簽名BS,然後他將B和BS一起發送給你。

5)這時我們就能夠完全判斷出這個數據的真僞了。怎麼辦?很簡單,我們用你朋友的公共密鑰去解密數據?結果呢?不能解密?因爲這個數據是用竊取者的私有密鑰加密的,要解密當然得使用竊取者的公共密鑰了。

6)如果A和AS沒有被竊取,那麼你用你朋友的公共密鑰解密,應該是能夠順利解密的,如果不能解密,那麼數據肯定是已經被修改了。

 

通過上面的說明大家應該知道,要想安全的傳輸數據,其實也並不是什麼難的事情,所以我們應該大膽的去使用數字簽名。

基於數字簽名的應用還有很多,各種網上銀行使用的數字證書,國家出臺的電子簽名等等。如果有機會後面給大家介紹。


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