公鑰加密、數字簽名、訊息認證

許佳佳233發表於2018-05-11

網路安全的幾個問題

一、網路是開放的,在上面要傳送一段內容,隨時可能被其他人攔截看到,因此需要加密。
最初想到的是對稱加密,可以通過同一個金鑰加密,也可以通過同一個金鑰解密。(比如加密字串,加密時每個字元ASCII碼同時加2,解密時ASCII同時減2,在這裡金鑰就是2,而ASCII的操作稱作加密解密演算法,加密前的字串稱為明文,加密後的字串稱為密文)
但是對稱加密有一個問題:通訊雙方在網路通訊之前,需要先知道加解密演算法和金鑰。在生活中我們可以通過打電話,或者見面之類的方式。但是每一次通訊都需要這樣交流一次,這顯然不是我們所期望的。
解決辦法便是公鑰加密

二、接收方接收到一個密文,他並不知道是誰傳送給他的,或者說他無法確定是傳送方本人傳送的。黑客完全可以攔截髮送方的密文,然後傳送給接收方不同的密文,並自稱是接收方傳送的。
解決辦法便是數字簽名

三、即使黑客無法解開密文,但是他還是可以攔截密文和修改密文的。倘若黑客不想讓接收方接收到正確的明文,每次都直接修改沒有破解的密文,接收方即使可以解密,但是由於密文已經被修改過,因此也得不到正確的明文。那麼接收方如何知道內容是否被修改過呢?
解決辦法便是訊息認證

公鑰加密

公鑰加密中有兩個金鑰——公鑰和私鑰,使用公鑰進行加密的密文只能使用私鑰進行解密,通過私鑰進行加密的密文只能使用公鑰進行加密。
公鑰人人都可以得到,但是私鑰只有自己有。
加密過程如下圖,首先確認接收方是Bob,因此Bob擁有自己的私鑰,那麼傳送方就需要使用Bob的公鑰進行加密,在Bob接收到之後,直接用自己的私鑰解密即可得到明文。
這裡寫圖片描述

數字簽名

由於接收方公鑰人人都可以獲得,因此人人都可以發訊息給接收方。那麼接收方如何確定接收方是本人呢?數字簽名就解決了這個問題。
在使用公鑰加密之前,首先使用自己的私鑰對明文進行加密。這樣接收方在使用自己私鑰解密之後,再使用接收方的公鑰進行解密,那麼正常情況下就可以得到正確的明文了,並且也確認了傳送方的身份。

那麼為什麼不是先用接收方公鑰加密,然後再用傳送方私鑰加密麼?
理論上也是可行的,但是就類似寫信一樣,一般我們簽名都會在信封內部,直接簽名在信封上的很少吧?

訊息認證

訊息認證的目的:如果密文被修改過了,那麼接收方可以通過認證技術知道自己的密文被修改過。
認證實現的方式理解也比較簡單:主要是通過認證函式,假設明文為M,認證函式生成的認證值為V,那麼最終傳送的內容就是M+V。

那麼什麼是認證函式呢?認證函式主要分為三類:

訊息加密函式:

用完整資訊的密文作為對資訊的認證。通過對明文M加密後生成V。接收方接收到訊息之後,把V解密,如果M和V解密後的內容相同,那麼內容就是沒有被修改過。
這種方法有一個很大的劣勢,比如明文的大小為1G,那麼生成的認證值也會為1G,而且由於本身明文比較大,加密過程也會比較耗時,所以這種方法認證的代價是比較大的。

訊息認證碼:

是金鑰和訊息的公開函式,產生一個固定長度的值V作為認證標識。接收方接收到訊息之後,仍然是通過這個公開函式得到認證標識,如果最終的結果和接收到的V相同,那麼內容就是沒有被修改過。

雜湊函式:

是一個公開函式,它將任意長的資訊對映成一個固定長度的資訊,作為認證值V,比如MD5。接收方接收到訊息,明文通過雜湊函式得到雜湊值,對比得到的V檢視是否相同,如果相同,那麼內容就是沒有被修改過。

相關文章