非對稱加密和數字證書

hsy0發表於2019-01-17

對稱加密

在之前的章節中,我們知道了 Alice 和 Bob 為了保證他們之間訊息的私密性,他們對訊息進行了加密。並且,我們還注意到一點,就是 Alice 和 Bob 之間的加解密採用了相同的密匙。我們統稱這種加密和解密採用相同密匙的方式為 對稱加密 symmetric encryption

非對稱加密

現在 Alice 有一份檔案,她使用對稱加密的方式對檔案進行了加密,對應的也有一個密匙。如果 Alice 希望將加密檔案分發給不同的人,那麼她也需要將對應的密匙告訴不同的人:

     +-----------------> P1
     |                     
     | +---------------> P2
     | |                   
+----+-++ +------------> P3
|  Key1 |                  
+----+-++ +------------> P4
     | |                   
     | +---------------> P5
     |                     
     +-----------------> P6

複製程式碼

現在 Alice 有非常多的檔案需要加密,那麼她就需要生成非常多的密匙(Key1, Key2, Key3, ...)。於是,Alice 不得不對在本地對非常多的密匙進行妥善的保管。不過,即使她非常小心,由於她將一把密匙告訴了不同的人,其實也增加了密匙被竊取的可能性。於是科學家就開始尋找一種方式來改善這種局面。

經過探索,科學家們發現了另一種加密方式,稱為非對稱加密 asymmetric encryption。這種加密方式使用兩把密匙,稱為 公匙私匙。公匙和私匙之間有一個奇妙的關係,就是公匙加密的內容,只可以使用與其對應的私匙解密;反之,私匙加密的內容,只可以使用與之對應的公匙進行解密

在使用非對稱加密前,Alice 和 Bob 各自生成一對公匙和私匙,然後只把各自的公匙交給對方,各自把自己的私匙妥善保管起來,看起來像是這樣:

+--------------+                                       +--------------+
|              |                                       |              |
| Public-key1  |                                       | Public-key2  |
| Private-key1 |                                       | Private-key2 |
|              |                                       |              |
+------^-------+             Public-key1               +------^-------+
       |          +-------------------------------->          |        
       +                                                      +        
     Alice        <--------------------------------+         Bob       
                             Public-key2                               
+--------------+                                        +-------------+
|              |                                        |             |
| Public-key2  |                                        | Public-key1 |
|              |                                        |             |
+--------------+                                        +-------------+
                                                            
複製程式碼

然後,在 Alice 給 Bob 傳送資訊前,她使用 Bob 給她的公匙將資訊加密,Bob 接收到密文之後,使用自己的私匙解密;Bob 給 Alice 傳送資訊前,使用 Alice 給他的公匙將訊息進行加密,然後 Alice 在接收到密文後,使用自己的私匙解密。看起來像是這樣:

                                                              M1       
                                                              ^        
                                                              |        
                                                       +------+-------+
                                                       |              |
                                                       | Private-key2 |
                                                       |              |
                                                       +------^-------+
                                                              |        
       +---->M1             Public-key2-M1                    +        
       +        +--------------------------------->                    
     Alice                                                   Bob       
                <---------------------------------+           +        
       +                    Public-key1-M2          M2 <------+        
       |                                                               
+------v-------+                                                       
|              |                                                       
| Private-key1 |                                                       
|              |                                                       
+------+-------+                                                       
       |                                                               
       v                                                               
       M2                                                              
複製程式碼

如果我們希望和別人通訊,我們就將自己的公匙給他,他使用我們的公匙加密資訊產生密文,而我們使用自己妥善保管的私匙對密文進行解密。由於上面提到的公匙和私匙產生密文的唯一對應的特性,任何使用你的公匙加密的資訊,只有你私匙才可以解密。這樣通過將加密和解密的密匙進行分離,我們不必將解密密匙告訴別人,從而提高加密的安全性。

數字簽名

非對稱加密可以用來對資訊進行簽名。“簽名”,故名思議就是在我們寫完一封信時,通常會在信的末尾處留下自己的簽名,簽名也是一個信件來源者的身份標識資訊。

為了使用數字簽名,首先 Alice 和 Bob 需要這麼做:

  1. 首先 Alice 和 Bob 必須面對面的交換各自的公匙,這樣就可以確保相互得到的公匙是合法的。然後他們之間約定好說,訊息的結尾部分將是各自的簽名。
  2. 在其中一方給對方傳送訊息時,比如 Alice 給 Bob 傳送訊息。Alice 要先對傳送的資訊運用摘要演算法得出一串摘要資訊。摘要演算法可以算出一段給定資訊的摘要內容,並且訊息內容和訊息的摘要內容是唯一對應的。
  3. 在得出了訊息的摘要之後,Alice 使用自己的私匙對摘要進行加密,為了方便描述,我們稱結果為“加密摘要”。
  4. 最後 Alice 將加密摘要放到訊息的結尾處,和原先想要傳送的內容一起傳送給 Bob。到這裡,Alice 完成了對自己資訊的簽名。我們可以看到,簽名的過程實際就是使用自己的私匙對要傳送的訊息的摘要進行加密
  5. Bob 接收到訊息後,根據事先的約定,他知道訊息是分為兩部分的,一部分是實際的訊息內容,另一部分是結尾的加密簽名。於是他找出結尾處的加密簽名,並對其使用 Alice 的公匙進行解密。對加密簽名進行解密運算後將會得到一串資訊,根據公匙和私匙的唯一對應關係、以及訊息摘要和摘要結果的唯一對應關係,如果訊息是 Alice 傳送的,那麼解密後的內容必然是 Bob 接收到的實際資訊的摘要。
  6. 於是,Bob 對實際的訊息內容運算摘要演算法(與 Alice 相同的摘要演算法),得出實際的訊息的摘要資訊。將這一步的摘要資訊與上一步對加密簽名進行解密後得到的摘要資訊對比,如果相同,就說明訊息是 Alice 傳送的。

數字證書

通過數字簽名,我們可以驗證的訊息來源的合法性以及完整性。合法性是通過私匙和公匙的唯一物件關係來確定的,而訊息和其摘要結果的唯一對於關係又可以確定訊息的完整性。在上一節的使用數字簽名的例子中,一個非常重要的注意點就是,Alice 和 Bob 必須確保相互之間公匙的合法性。對於竊聽者 Eve 來說,他可以在 Alice 給 Bob 傳送公匙時替換成自己的,這樣 Bob 接收到的公匙實際是 Eve 的,但是 Bob 以為是 Alice 的;同時 Eve 又將 Bob 發給 Alice 的公匙替換成自己的,這樣 Alice 以為公匙是 Bob 的,這樣就完成了中間人攻擊。

於是,需要有一種方式可以證明 Alice 接收到的證書是 Bob 的,而不是 Eve 的。這就有了數字證書的概念。聯想一下在實際生活中,表示個人身份的工具就是身份證,身份證是由戶口所在地的派出所進行派發的。數字證書的工作方式也是類似的。

合法的數字證書是由 CA(Certificate Authority) 機構進行簽發的。換句話說,CA 機構是一個證書的頒發機構,它並不是只有一個,它們之間的層次結構可以使用樹形結構進行描述,位於頂層的是根 CA,它下面有由它授權的子 CA:

                                
           +------+             
           | 根 CA |             
           +---+--+             
               |                
   +-----------+------------+   
   |                        |   
   |                        |   
+--v---+                +---v--+
| 子 CA |               | 子 CA |
+------+                +------+

複製程式碼

CA 機構也有一對自己的公匙和私匙。簽發的過程就是你去 CA 機構的網站上,填寫自己的公開身份資訊(比如公匙)之後,CA 機構會使用自己的私匙將這些資訊進行數字簽名,你可以想象一下,就好比是一張紙,上面寫著兩部分內容,一部分是你的公開身份資訊,另一部分是 CA 對你的身份資訊的數字簽名(將你的身份資訊進行摘要,對摘要結果使用 CA 的私匙進行加密得出的內容)。

在對計算機的使用中,常常需要驗證檔案來源的合法以及完整性,比如在安裝軟體的時候,軟體安裝程式將會驗證那些需要被安裝的軟體的數字證書。軟體安裝程式在驗證數字證書的時候,必須知道 CA 機構的公匙(稱為 CA證書),因為摘要是用 CA 的私匙加密的。對於 CA 證書,現在的作業系統中都有一個專門的地方去存放它們,而且在作業系統安裝完成之後,就已經預置了一些知名的 CA 證書了。

討厭的 Eve

現在 Eve 切斷了 Alice 和 Bob 的直接通訊,然後分別偽裝成 Alice 和 Bob 其中一個和另一通訊。比如 Eve 偽裝成了 Bob,當 Alice 對 Bob 開始協商密匙時,她實際是在和 Eve 進行協商,協商好密匙之後,她原本期望對 Bob 傳送的訊息實際傳送給了 Eve,因為密匙是她和 Eve 之間生成的,所以訊息對 Eve 而言是沒有隱私的。

可以通過這個圖去理解:

M1                     C1M1=>C2M1                  M1 
             C1                        C2              
Alice +------------------> Eve +------------------> Bob
                                                   
                                                   
                                                   
M1                     C1M2<=C2M2                  M2 
             C1                        C2              
Alice <------------------+ Eve <------------------+ Bob
複製程式碼

上圖中,Alice 發出訊息到 Bob 接收到的過程為:

  • M1 是 Alice 發給 Bob 的明文
  • C1 是 Alice 和 Eve 之間的密匙
  • 於是 Eve 接收到 Alice 的密文為 C1M1
  • Eve 將 C1M1 解密,會得到 M1
  • C2 是 Eve 與 Bob 之間的密匙,然後 Eve 將加密資訊 C2M1 傳送給 Bob
  • Bob 對 C2M1 使用他和 Eve 之間的密匙 C2 進行解密,得到了最初有 Alice 傳送的 M1

逆過程略。

這就是熟知的中間人攻擊 man-in-the-middle attack

瀏覽網站

在瀏覽器訪問一個網站的時候,它首先會向網站請求其數字證書,網站在接受到瀏覽器的請求後,會將數字證書返回給瀏覽器。瀏覽器在驗證訪問的網站的合法性時:

  1. 瀏覽器首先使用其自帶的一些 CA 證書(瀏覽器一般自帶了一些 CA 證書,而不是直接使用系統中預裝的)對網站回傳的數字證書進行驗證,驗證這個證書是由合法的 CA 頒發的。
  2. 如果這個證書是由合法的 CA 機構頒發的,再驗證證書中的公開資訊(比如域名)與現在訪問的網站的 IP 是否一致。

這樣就可以很大程度上防止中間人攻擊,因為我們假定當前使用的 DNS 伺服器具有有效的安全措施,而實際上如果你使用的是 ISP 推薦的 DNS 伺服器的話,那麼你的安全性還是有保障的。

我們一定要確保安裝的 CA 證書是合法的,換句話說,我們只有在確保了 CA 是我們可以信賴的情況下,才可以安裝它。假設有網站 A,它證書中的 “域名 - IP” 資訊為 example.com - 123.456.789.000 證書的頒發機構是 CA1。如果 CA1 沒有原則地頒發了另一個證書,其中的 “域名 - IP” 對應的資訊為 example.com - 000.123.456.789,那麼實際上就給 Eve 使用 000.123.456.789 來完成中間人攻擊造成了契機。CA 機構在給網站頒發證書時的原則就是,對於一個已經頒發了證書的域名,不可以將那個域名再對應到其他的 IP

  1. 比如我們現在知道一個合法的網站 A,它的證書應該是 example.com - 123.456.789.000

  2. 我們在瀏覽器中輸入了域名 example.com。瀏覽器根據當前的 DNS 環境(已被 Eve 修改)得知域名 example.com 被指向到了 000.123.456.789,但是瀏覽器此時並不能意識到危險,於是它瀏覽器向 000.123.456.789 這個機器請求網站的證書

  3. 網站回傳的證書,證書中有它一個偽裝資訊 example.com - 000.123.456.789,根據 CA 的證書頒發原則,它是不能頒發這樣的證書的。但是我們假設 CA 此時頒發了這樣一個證書

  4. 瀏覽器接收到網站回傳的證書後,它開始驗證簽名

  5. 是否是 CA 頒發的?是

  6. 證書資訊和當前訪問的是否一致?是

  7. 於是瀏覽器就不能發現網站地址被篡改的情況了,Eve 則可以順利的藉助 000.123.456.789 在我們和我們實際期望訪問的網站之間展開中間人攻擊了

相關文章