瞭解公開金鑰加密

 

上次修改主題的時間: 2005-05-19

本主題將詳細介紹與郵件安全性相關的公開金鑰加密元素。若想對這個主題有更深入的瞭解,請參考其他相關資源。

加密學是研究如何使用密碼與加密來保護資訊的學問。加密學是郵件安全性的基礎。

簡言之,密碼是指一種有組織但不為人知的變更處理,可使資訊無法閱讀。「凱撒加密法」是最早、也是最簡易的密碼之一,其運作方式是以固定間隔將所有字母平移替換。寄件者與收件者都知道平移的字母個數,因而能夠透過此密碼變更資訊,使彼此可以閱讀該資訊,但局外人則無從得知。這種將資訊變更為密碼的過程就是加密,而將密碼回復為資訊的過程則稱為解密。原始的郵件稱為「純文字」(plaintext)。經過變更的郵件則稱為「密碼文字」(ciphertext)。用來將純文字變更為密碼文字的資訊,稱為金鑰。金鑰用來變更資訊的特定方法,則稱為演算法。

note附註:
在此處內容的「純文字」不應與用來表示電子郵件格式的「純文字」混為一談。在電子郵件方面,純文字是用來表示郵件的格式,以便區分 HTML 格式或 RTF 格式。而在郵件的安全性方面,純文字則是用來表示文字並未加密,以便與密碼文字有所區分。

舉例來說,假設寄件者要以這種方法來進行郵件加密,而他知道,純文字中所有的字母 A 只要經過金鑰的處理,在密碼文字中就會變成字母 D;純文字所有的字母 B,在密碼文字中將變成字母 E,依此類推。使用這個金鑰,經過其演算法「將字母往前平移三個順位」的處理後,純文字中的 "help" 這個字將過加密後,將在密碼文字中呈現為 "khos"。

收件者收到密碼文字郵件後,便透過金鑰進行解密,將郵件轉換回純文字。在此例中,則是將字母往回平移三個順位,以回復之前所作的變更。

在此例中,寄件者與收件者都不得透漏金鑰,因為一旦外洩,任何人都能加以利用,進而順利地解密並閱讀該郵件。金鑰一旦遺失,加密就失去意義。此外,演算法的嚴密性也很重要。未經授權的一方有可能取得加密的密碼文字,並根據密碼文字判斷出金鑰,設法破解加密。

請注意,寄件者與收件者所使用的是相同的金鑰。由於雙方都使用相同的金鑰,因此這種類型的加密稱為「對稱式金鑰」加密。

上述範例雖然簡單,但已足以說明加密功能的核心概念。近年來,加密方式雖已有大幅改善與進展,但其本質依然不變。

公開金鑰加密的運作方式

1976 年,Whitfield Diffe 和 Martin Hellman 建立了公開金鑰加密。公開金鑰加密從本質上改變了加密與解密的程序,可說是一項重大進展。

不同於以往只有單一的共用秘密金鑰,Diffe 與 Hellman 提出雙金鑰的概念。其中一個金鑰稱為「私密金鑰」,維持為保密的狀態。私密金鑰並非雙方共有,而是僅由其中一方持有。第二個金鑰稱為「公開金鑰」,無須保密,而可廣泛地共用。這兩個金鑰亦共稱為「金鑰組」,顧名思義,必須在加密或解密作業中搭配使用。金鑰組具有特別的相互關係,因此每個金鑰都只能與金鑰組中的另一個金鑰搭配使用。此關係將兩個金鑰結合成獨一無二的金鑰組:一個公開金鑰會與相對應的私密金鑰形成一組,而不會與其他金鑰產生關聯。

這種配對的形成,是因為公開金鑰與私密金鑰兩者的演算法之間有一種特殊的數學關係。金鑰組彼此具有數學上的關聯,因此同時使用金鑰組,其結果相當於將對稱式金鑰使用兩次。兩個金鑰必須同時使用。若將金鑰個別使用,並不能復原其各自的作業。這表示各個金鑰的作業都是單向作業:單獨的金鑰無法用來回復本身的作業。此外,根據設計,兩個金鑰都有其各自的演算法,因此無法使用一個金鑰來判斷金鑰組中的另一個金鑰。所以,您無法依公開金鑰來判斷私密金鑰。然而相較於對稱式金鑰,用來產生金鑰組的數學基礎卻有一項缺點。所使用的演算法必須十分強大,以徹底防止他人利用已知的公開金鑰,對使用該公開金鑰加密的資訊進行強行解密。公開金鑰使用數學的複雜邏輯及單向特性,來彌補其完全公開性,藉以防止他人順利破解以此金鑰加密的資訊。

若將此概念運用到上述範例中,則寄件者會使用公開金鑰,將純文字加密成為密碼文字。然後收件者再使用私密金鑰,將密碼文字解密而回復為純文字。

由於金鑰組中私密金鑰與公開金鑰的特殊關係,因此使用者可以與許多人共用相同的金鑰組,而不需針對每個人使用不同的金鑰。只要將私密金鑰維持保密,公開金鑰即可盡量與他人共用,安全無虞。能夠多人共用一個金鑰組,可說是加密的一項重大突破,因為金鑰管理的需求可以大幅降低,連帶顯著提昇了加密的可用性。使用者得以和他人共用一個金鑰組,人數不限,而不需針對每個人建立一個保密的金鑰。

結合公開金鑰加密與郵件安全性

公開金鑰加密是郵件安全性的基本要素。在公開金鑰加密問世前,金鑰管理是一件棘手的事,因此若沒有公開金鑰加密,郵件安全性是否能有實質的解決方案都是個問題。瞭解公開金鑰加密的基本概念後,接著則必須學習如何運用這些概念,來確保郵件安全性。

公開金鑰加密與數位簽章

如上一節所討論,數位簽章的核心功能,就是唯一識別郵件寄件者的能力。金鑰組的相互關係,使得唯一識別得以透過公開金鑰加密來進行。

由於金鑰組中的私密金鑰僅屬於其中一方,因此,一旦有人使用私密金鑰,便可斷定此人必為金鑰的擁有者。如此一來,私密金鑰的使用,就如同白紙黑字的簽章,因為簽章必須由本人才能完成。簽章可以證明簽章者的存在,同樣地,私密金鑰的使用也可以證明其擁有者的存在。

若加密作業與解密作業中已成功使用某金鑰組,則其中的私密金鑰必定也已使用於作業的某部份中。由於一個公開金鑰只與一個私密金鑰相關聯,因此相對應的公開金鑰只能用來識別與其相關的私密金鑰。若加密與解密作業中已成功使用某公開金鑰,則可推斷其相對應的私密金鑰必定也已用於作業的某部份中。由於只有金鑰的擁有者能使用私密金鑰,因此,這表示執行加密與解密作業者必為 (且僅可能為) 金鑰擁有者。

使用私密金鑰來建立身分,即表示整個加密與解密作業已順利完成。顯示整個作業完成即表示純文字已透過私密金鑰加密為密碼文字,再透過相對應的公開金鑰解密為純文字。若作業能夠順利,表示所使用的一定是私密金鑰。

進行加密與解密作業前的純文字必須與完成作業後的相符,才表示加密與解密作業成功。必須將兩組純文字直接進行比較,且其結果必須完全相符。而進行比較與驗證時必須要有控制項。

就電子郵件而言,此控制項即為實際的郵件。因為郵件在寄件者與收件者兩端皆存在,實為一個方便的控制項元素。

在這項比較作業中使用郵件時,必須先將它轉換為「雜湊」,也就是以數字方式表現完整的內文。相同的郵件內文將轉換成相同的雜湊值。

私密金鑰的擁有者會取出郵件的雜湊值,並在郵件傳送時將它與私密金鑰結合,證明自己就是傳送郵件的人,而不可能是其他人。

將郵件與私密金鑰結合的方式為,以寄件者的私密金鑰對雜湊值進行加密,其結果即為實際的數位簽章。隨著寄件者的電子郵件系統設定方式之不同,數位簽章有的會附加在郵件的底端,形成「明文簽章」的郵件;有的則會結合到原始郵件的二進位附件中,形成「不透明簽章」的郵件。

由於數位簽章是以附件方式附加到原始郵件,因此不支援 S/MIME 的電子郵件用戶端得以閱讀明文簽章的郵件。在非 S/MIME 用戶端上,簽章會被捨棄,但原始郵件仍可顯示。然而,郵件將無從進行驗證,本質上與未簽章的郵件相同。明文簽章郵件的缺點是,郵件較容易受到郵件閘道的介入而遭到變更,使簽章失去效力。

相反地,就不透明簽章的郵件而言,由於郵件與數位簽章被視為單一的二進位附件,因此在轉送的過程中幾乎不會遭到變更。但是,只有 S/MIME 用戶端有能力閱讀這些附件。非 S/MIME 用戶端收到不透明簽章的郵件時,將無法閱讀該郵件。

建立不透明簽章的郵件,其目的是,解決電子郵件系統在傳送電子郵件期間變更郵件內文的問題。請注意一點,目前符合 S/MIME 標準的電子郵件方案,並不會變更郵件內文。不過,卻有許多用戶端無法讀取不透明簽章的電子郵件。因此,建議傳送明文簽章郵件。

收到郵件後,數位簽章會被擷取,並在解密作業中運用寄件者的公開金鑰,取得郵件的原始雜湊值。接著就會比較這個雜湊值,與所收到的郵件雜湊值是否相同。由於能夠對應公開金鑰的私密金鑰只有一個,且只有公開金鑰的擁有者可以順利地使用它來加密雜湊值,因此,以公開金鑰來解密雜湊,即表示雜湊值是由私密金鑰的擁有者所加密的。雜湊值以數字方式來表現郵件內文,因此,若加密的雜湊值符合所接收郵件的雜湊值,則表示傳送出去的郵件內文符合接收到的內文。再者,由於只有私密金鑰的擁有者能夠傳送郵件,綜合以上兩點,收件者即可確定,郵件必定是由金鑰擁有者所傳送,從而驗證該郵件,並確保其不可否認性。此外,也可以證明郵件並未遭到修改,而保全了資料完整性。若雜湊值不相符,收件者便知道郵件可能已在轉送的過程中遭到修改,或是所使用的公開金鑰與私密金鑰並不相符。不管是上述哪種情形,收件者都將知道這不是有效的郵件,不能信任。

至此,您應該可以瞭解公開金鑰加密所提供的安全性服務與數位簽章搭配運作的方式。

下圖顯示加入公開金鑰加密支援元素簽章的流程。

35451fb8-5e11-4d67-ba6e-e5d4da6febca

  1. 擷取郵件。
  2. 計算郵件的雜湊值。
  3. 擷取寄件者的私密金鑰。
  4. 使用寄件者的私密金鑰,對雜湊值進行加密。
  5. 將加密的雜湊值附加到郵件上,成為數位簽章。
  6. 傳送郵件。

下圖顯示加入公開金鑰加密支援元素的驗證流程。

d1b14a27-5cfb-4df2-89f7-990219378716

  1. 接收郵件。
  2. 從郵件中擷取含有加密雜湊值的數位簽章。
  3. 擷取郵件。
  4. 計算郵件的雜湊值。
  5. 擷取寄件者的公開金鑰。
  6. 使用寄件者的公開金鑰,對已加密的雜湊值進行解密。
  7. 將解密完成的雜湊值與接收時所產生的雜湊值進行比較。
  8. 若兩個值相符,即為有效郵件。

這項流程可說明,公開金鑰加密如何造就數位簽章的核心安全性服務:驗證、不可否認性與資料完整性。

公開金鑰加密與郵件加密

相較於數位簽章,郵件加密與公開金鑰加密之間的關係通常較為直接,因為加密是公開金鑰加密的核心功能。然而,並不是只要透過金鑰組進行郵件的加密與解密,就可以完成郵件加密。郵件加密時會用到金鑰組,但並非針對整個郵件。

郵件加密的目的,是要確保只有經過授權的收件者才能檢視郵件,因此各個收件者的私密金鑰均可用來提供此服務。由於只有私密金鑰的擁有者可以順利地使用該金鑰,因此,在閱讀郵件時使用金鑰,可以確保閱讀郵件者一定是金鑰擁有者。這項功能所提供的機密保護,即為郵件加密的基礎。此外,由於公開金鑰可以廣為流傳,因此全世界的人都可傳送資訊給某個私密金鑰的持有者。

然而,金鑰組並非用於整個郵件中。因為使用金鑰組進行加密與解密作業時,金鑰的演算法必須具備複雜性,所以這是一項昂貴的程序。雖然金鑰組的使用有其必要性,卻不需用於整個郵件。其必須是資訊「鎖定」與「解除鎖定」程序的一部份。只要郵件必須使用私密金鑰才能閱讀,就已達到郵件加密的目的。

如本主題稍早的<公開金鑰加密的運作方式>中所述,公開金鑰使用強大的演算法來彌補其完全公開性。所謂強大的演算法,即意味著它們比舊有的對稱式金鑰更龐大,也因此使用這些演算法計算會更慢。由於私密金鑰只是用來在檢視資訊前予以解除鎖定,並不會用在整個郵件上,因此,較符合經濟效益的做法是,在確保資訊必須透過私密金鑰才能使用的同時,儘可能地少用金鑰組,而多用速度較快的對稱式金鑰來處理資訊。

對稱式金鑰使用的是雙方都知道的秘密金鑰。這個程序有時稱為「金鑰協議」。使用金鑰組時就沒有所謂的金鑰協議,因為公開金鑰可讓許多人使用。金鑰組也可搭配對稱式金鑰,用來處理金鑰協議。您可以選擇某個對稱式金鑰,將其以金鑰組中的公開金鑰進行加密後,再傳送給私密金鑰的擁有者。在傳送給多位收件者時,可對所有的收件者使用相同的對稱式金鑰,再以各個特定收件者的公開金鑰予以加密。由於只有私密金鑰的擁有者能夠解密這個對稱式金鑰,所以知道此對稱式金鑰的人仍然只有已授權的使用者。您可以在某個特定的作業或工作階段中,產生僅能使用一次的對稱式金鑰。這叫做「工作階段金鑰」。公開金鑰加密的作用是補強對稱式金鑰加密,而非取而代之。

郵件加密的目的,是為了確定郵件只有在取得私密金鑰後才能閱讀。在對稱式金鑰協議中,可以使用私密金鑰,以確保轉送對稱式金鑰時的安全性。由於對稱式金鑰可安全地轉送給收件者,因此,您可以使用對稱式金鑰來加密郵件,再以金鑰組中的公開金鑰來加密這個對稱式金鑰。只有私密金鑰擁有者可以將對稱式金鑰解除鎖定,以使用此對稱式金鑰來解密郵件。在這項作業的執行過程中,整個郵件似乎是以金鑰組進行加密與解密。但由於此作業使用速度較快的對稱式金鑰來處理大部份的資訊,因此執行速度會比使用其他方式來得更快。此程序中,在使用私密金鑰前,郵件都會受到保護而維持機密,這便是郵件加密的基本服務。為確保加密與解密程序中資料的完整性,對已加密郵件作任何修改,都將導致解密作業失敗。

雖然有些人從沒想過要使用對稱式金鑰,其效果也並非立竿見影,但它可以加快郵件加密的速度,同時又不會損害郵件的安全性,因而加強郵件的安全性。下圖顯示加密作業搭配公開金鑰加密之支援元素的流程。

21058391-2d70-42f9-bf25-8ead79705b27

  1. 擷取郵件。
  2. 擷取收件者的公開金鑰。
  3. 產生執行一次的對稱式工作階段金鑰。
  4. 使用工作階段金鑰,對郵件進行加密。
  5. 使用收件者的公開金鑰,對工作階段金鑰進行加密。
  6. 將已加密的工作階段金鑰附加於加密的郵件中。
  7. 傳送郵件。

下圖顯示加入公開金鑰加密支援元素的解密流程。

50f0afca-e520-46b5-8e12-6e295dfe86d9

  1. 接收郵件。
  2. 從郵件中擷取加密的郵件與加密的工作階段金鑰。
  3. 擷取收件者的私密金鑰。
  4. 使用收件者的私密金鑰,對工作階段金鑰進行解密。
  5. 使用已解密的工作階段金鑰,對郵件進行解密。
  6. 將未加密的郵件傳回給收件者。

這個流程說明了公開金鑰加密如何支援郵件加密的核心服務:機密保護與資料完整性。

瞭解公開金鑰加密如何與數位簽章和郵件加密兩者搭配運作

數位簽章與郵件加密是互補的服務。分別討論過公開金鑰加密與這兩項服務的整合方式後,接下來要說明如何搭配使用這兩項服務。

下圖顯示加入公開金鑰加密支援元素的簽章與加密流程。

e81cca9b-c780-49d9-a3f9-69cc3c442183

  1. 擷取郵件。
  2. 計算郵件的雜湊值。
  3. 擷取寄件者的私密金鑰。
  4. 擷取收件者的公開金鑰。
  5. 使用寄件者的私密金鑰,對雜湊值進行加密。
  6. 將加密的雜湊值附加到郵件上,成為數位簽章。
  7. 產生執行一次的對稱式工作階段金鑰。
  8. 使用工作階段金鑰,對郵件進行加密。
  9. 使用收件者的公開金鑰,對工作階段金鑰進行加密。
  10. 將已加密的工作階段金鑰附加於加密的郵件中。
  11. 傳送郵件。

下圖顯示解密作業與數位簽章驗證作業搭配公開金鑰加密的流程。

97705e57-0a94-4197-99c3-40bb58a9eaa0

  1. 接收郵件。
  2. 從郵件中擷取加密的郵件與加密的工作階段金鑰。
  3. 擷取收件者的私密金鑰。
  4. 使用收件者的私密金鑰,對工作階段金鑰進行解密。
  5. 使用已解密的工作階段金鑰,對郵件進行解密。
  6. 從郵件中擷取含有加密雜湊值的數位簽章。
  7. 計算郵件的雜湊值。
  8. 擷取寄件者的公開金鑰。
  9. 使用寄件者的公開金鑰,對已加密的雜湊值進行解密。
  10. 將解密完成的雜湊值與接收時所產生的雜湊值進行比較。
  11. 若兩個值相符,即為有效郵件。
  12. 將未加密的郵件傳回給收件者。

這個流程說明了公開金鑰加密如何支援數位簽章與郵件加密。

請注意,某一方是否需要另一方的公開金鑰或私密金鑰,必須視個別的作業而定。例如,寄件者必須要有自己的私密金鑰,才能進行電子郵件的數位簽章,至於傳送加密的電子郵件時,則需要收件者的公開金鑰。為避免造成混淆,請參見下圖,其中說明各項作業中各方所需要的金鑰。

ef4e76b6-4799-45a9-90f8-ec7af508152a

接下來要介紹的項目是數位憑證。數位憑證透過金鑰組的散佈,使數位簽章與加密得以執行。