公開金鑰加密與訊息認證 3.1 訊息認證的方法 3.2 安全雜湊函數及 HMAC 3.3 公開金鑰加密法原理 3.4 公開金鑰加密演算法 3.5 數位簽章 3.6 金鑰管理 3.7 建議閱讀及網站資源 3.8 關鍵詞彙及學習評量
公開金鑰加密與訊息認證
3.1 訊息認證的方法
3.2 安全雜湊函數及 HMAC
3.3 公開金鑰加密法原理
3.4 公開金鑰加密演算法
3.5 數位簽章
3.6 金鑰管理
3.7 建議閱讀及網站資源
3.8 關鍵詞彙及學習評量
3-2 網路安全精要
除了訊息機密性,訊息認證在網路安全也扮演重要的角色。本章將探討
3 個有關訊息認證的議題。首先,我們討論訊息認證所使用的訊息認證碼和
雜湊函數。接著,討論公開金鑰加密原理和兩個公開金鑰演算法。這些演算
法在交換傳統加密所使用的金鑰時非常好用。接著我們探討如何用公開金鑰
加密來產生數位簽章,並藉其提供進階的訊息認證。最後我們將再討論金鑰
管理的議題。
3.1 訊息認證的方法
加密可以防止被動式攻擊(如竊聽)。然而,我們需要另一個機制以防
止主動式攻擊(如偽造資料或交易)。防範主動式攻擊的方法就是使用訊息
認證。
訊息、檔案、文件或其他種類的資料,在非偽造、並且由可信任來源取
得的情況下,我們就說它是經過認可的資料。訊息認證,是一個讓參與通訊
的通訊者認證所收發訊息為真的程序。這裡有兩個確認要點:(1) 確認收到的
訊息內容沒有被變更過;(2) 確認訊息來源為真。另外,我們還需確認訊息的
傳遞時程(也就是在過程中並無人工上的延遲或被重新傳送),以及訊息是
否依照發送順序到達。
以傳統加密方法認證
僅使用傳統的加密方法來做認證工作是可行的。假設只有發送者和接收
者共用某把金鑰,那麼只有真正的發送者所加密的訊息,才能正確地被接收
者接受。再者,如果訊息中包含了錯誤檢查碼和序號,則接收者就能確定訊
息內容未經變更且序號正確無誤。或者,如果訊息中也有時間戳記,那接收
者可以確定訊息未被不當延遲,是在預期時間之內抵達。
第 3 章 公開金鑰加密與訊息認證 3-3
未加密的訊息認證
我們將在本節介紹幾種不需加密的訊息認證方法。這些方法會在每個傳
送的訊息附加認證標籤,由於訊息本身並未加密,故抵達目的端後,不需解
密即可逕由認證函數處理。
因為本節所介紹的方法並不對訊息加密,所以這些方法不提供訊息保密
性。既然傳統加密法可提供認證,又可以在現實中的產品普遍使用,那為什
麼不設計一種方法可以兼顧訊息的保密性和認證?[DAVI89] 提出在下列三
種情況中,並不需要訊息保密性:
1. 有一些程式會將相同的訊息廣播到多個目的地(兩個例子包括發送網路
斷線訊息以通知使用者,以及控制中心的警告訊息)。當只有一個目的
端需要負起監控認證責任時,系統建置所需費用會相對較低,也比較穩
定。因此,此類訊息在廣播時,必須是以明文並加上訊息認證標籤傳送。
負責認證工作的目的端檢查該訊息,如果訊息有問題,就立刻通知其他
目的端。
2. 另一個可能的情況是,通訊某端負載很重,而無法花時間解密所有接收
的訊息。因此認證工作應該要具有選擇性的,隨機挑出一些訊息來作 認證。
3. 電腦程式的明文認證一向是很具吸引力的服務。電腦程式不必每次執行
前解密,那樣太浪費處理器的資源。然而,如果將訊息認證標籤附加到
程式,即可在需要時藉之檢查程式的完整性。
因此實際上會根據需求來決定是否使用認證和加密。
訊息認證碼
有一種認證的技術是使用秘密金鑰來產生一小段區塊資料,並附加到訊
息 , 而 這 個 區 塊 資 料 就 叫 做 訊 息 認 證 碼 ( Message Authentication Code, MAC)。這個技術的通訊雙方 A 和 B,共用一把相同的秘密金鑰 KAB。當 A要傳送訊息給 B 時,先由函數 MACM = F (KAB, M) 將 MAC 計算出來。然後
在傳送訊息時也將 MAC 一併傳送給準接收端。當接收端收到訊息,也將秘
密金鑰和收到的訊息代入相同的函數計算出 MAC,然後將收到訊息中的
3-4 網路安全精要
MAC 和計算出來的結果比對,如圖 3.1。假設只有發送者和接收者知道這把
秘密金鑰,而且計算出的結果和接收到的 MAC 相同,則:
1. 接收者可以確定訊息並未被攻擊者變更過,如果攻擊者曾經竄改資料,
但未變更 MAC,那麼接收端計算出的 MAC 和接收到的 MAC 不會相
同。原因是如果攻擊者不知道秘密金鑰,就無法算出正確的 MAC 來對
應他在訊息中所做的改變。
2. 接收者可以確定訊息是來自原發送者,因為沒有其他人知道秘密金鑰,
也就不會有人可以算出正確的 MAC 以對應預先準備好的訊息。
3. 如果訊息包括循序數值(像是 X.25、HDLC,和 TCP 所使用的),則
接收者可以確定循序數值的正確性,因為攻擊者無法成功的變更循序 數值。
圖 3.1 使用 MAC 的訊息認證
有許多演算法能產生 MAC。NIST 規範書(FIPS PUB 113)建議使用
DES。DES 用來加密訊息,並且在密文訊息最後加入幾個用來當成認證碼的
位元。認證碼一般常用的長度是 16 位元或是 32 位元。
第 3 章 公開金鑰加密與訊息認證 3-5
上述的處理方式和加密十分相像,不同的地方是訊息認證演算法不一定
要可逆;但如果加密後的訊息若要能解密,則加密演算法一定要可逆。也因
為認證訊息演算法擁有如此特殊的數學特性,認證訊息演算法較加密演算法
更不易被攻破。
單向雜湊函數
近來有一種轉型的認證相當受到關注,即為單向雜湊函數。雜湊函數可
以接收不固定長度的訊息 M 作為輸入,然後輸出一固定長度的訊息認證值
H(M)。和 MAC 不同的地方是:不一定要將金鑰輸入雜湊函數。為了要認證
訊息,將訊息認證值附加到訊息再一起傳送出去,因此訊息認證值也得以受
認證。
圖 3.2 解釋了三種訊息認證的方法。訊息認證值可以用傳統方式加密 (a);如果限定只有發送者和接收者共用一把加密金鑰,則該訊息必可認證。
另外,訊息也可以用公開金鑰加密法來加密 (b),會在 3.5 節介紹。公開金鑰
加密有兩個優點:第 1,在訊息認證的同時也提供數位簽章;第 2,不需要分
發金鑰給目的端。
上述的兩個方法,相較於加密整份訊息的方法,有其優勢:這兩個方法
所需的電腦計算量相對較少。接著,大家對於「開發一項可以避免加密整個
訊息的技術」有極大興趣。[TSUD92] 提出以下幾個原因:
加密軟體速度慢,即使是要加密的每個訊息內容都很小,系統中仍持續
不停地有訊息進出,而得一直做加密工作。
加密硬體花費也不可忽略,雖然也有單價低的晶片所發展的 DES,但
是如果整個網路都要有這個能力,那花費就高了。
硬體加密的最佳化常常是針對大量資料,如果資料量小,就會把大部分
的時間都耗費在啟動、起始化的動作。
有些加密演算法可能受到出口限制,像是 DES。
3-6 網路安全精要
圖 3.2 使用單向雜湊函數的訊息認證
圖 3.2(c) 說明如何僅使用雜湊函數而不需加密技術,就能進行訊息認
證。這個技術假設溝通的雙方(A 和 B)共同擁有秘密數值 SAB,當 A 要傳
送訊息給 B,A 先連結秘密數值和訊息,再利用雜湊函數計算出 M DM =
第 3 章 公開金鑰加密與訊息認證 3-7
H(SAB | |M) 。然後將 [M | |M DM] 傳送給 B。當 B 收到時,由於 B 亦擁有秘密
數值 SAB,因此可以利用 SAB 再計算出 H(SAB | |M),然後比對 M DM 和自己所
算出的是否相同。因為在傳送過程並沒有將 SAB 傳送出去,因此攻擊者不可
能修改資料。所以只要秘密數值一直保持秘密不被發現,攻擊者就無法偽造
訊息。
HMAC 是上述第 3 種技術的衍生,後來應用在 IP 安全(將在第 6 章介
紹),而且也定義在於 SNMPv3(將在第 8 章介紹)。
3.2 安全雜湊函數及 HMAC
無論在訊息認證或數位簽章,單向雜湊函數或安全雜湊函數都很重要。
在這一節,我們先討論一個完善安全雜湊函數的基本需求,接著介紹一個非
常重要的雜湊函數:SHA,最後則將解說 HMAC。
雜湊函數的需求
雜湊函數的目的是要產生檔案、訊息、或其他類型資料產生其「指紋」。
為了讓訊息的認證能夠真正有效,雜湊函數 H 必須具備有以下的特性:
1. H 可以對任何長度的資料做運算。
2. H 運算後的輸出結果一定是固定長度資料。
3. 給一個任意的 x,H(x) 也必須容易計算出結果,如此才能讓在軟硬體上
實作雜湊函數 H 是實際可行的。。
4. 給任意 h,無法找出 x,使得 H(x)=h。這項特性有時稱作單向。
|| 代表將兩者資料相連結(concatenation)。
譯註:所謂「無法找出」,實際上的意義為 computationally infeasible;也就是若欲
藉助電腦計算找出結果,在實際面上是不可行的。
3-8 網路安全精要
5. 給任意的 x,無法找出 y,這個 y ≠ x,但是 H(y) = H(x)。這項特性有
時稱作弱碰撞抵抗。
6. 無法找出 (x, y),讓 H(x) = H(y)。這項特性有時稱作強碰撞抵抗 。
前三項特性是雜湊函數實際應用在訊息認證上所必備的條件。第四個特
性為「單向」:要從訊息產生 h 容易,反過來要以 h 求出原始訊息,幾乎是
不可能的。這項技術在使用秘密數值的認證技術上是非常重要的,請參考圖
3.2(c)。秘密數值本身並不被傳送出去;然而,若雜湊函數並非單向時,攻擊
者就能輕鬆找出此秘密數值:若攻擊者能夠觀察或中途攔截訊息的傳輸,拿
到訊息 M 和雜湊值 MDM=H(SAB ||M),那麼攻擊者就可以利用雜湊的反函數
SAB ||M=H−1(MDM) 得到 SAB||M。當攻擊者同時都有 M 和 SAB ||M 時,要找出
SAB 就不難了。
第五項特性則保證,若給定一個訊息,則無法找到第二個不同的訊息,
讓第二個訊息與給定的訊息擁有相同的雜湊值。若訊息認證的過程將雜湊值
加密(如圖 3.2(a) 和 3.2(b)),第五項特性可防範原始訊息遭到竄改。如果
沒有第五項特性,攻擊者有可能會做下列動作:首先,觀察攔截訊息以及其
加密過的雜湊值;接著,以該訊息產生一個未加密的雜湊值;最後,產生另
外一個不同的訊息,而該訊息的雜湊值與原始訊息的雜湊值相同,如此就完
成竄改工作了。
能滿足前五項特性的雜湊函數,稱為弱雜湊函數。如果第六項特性也能
滿足,就稱作強雜湊函數。第六項特性可以保護訊息免於被精心設計過的攻
擊破解。例如生日攻擊法,但這種攻擊的細節已超出本書範圍,詳情可參閱 [YUVA79] 或 [STAL06a]。
不幸的,這些術語的使用並非彼此一致。其他的術語包括:單向雜湊函數 ─ 用在特
性 4、5;碰撞抵抗雜湊函數 ─ 用在特性 4、5、6;弱單向雜湊函數 ─ 用在特性 4、5;強單向雜湊函數 ─ 用在特性 4、5、6。在閱讀文獻時,讀者務必仔細分辨這些術
語,方不致彼此混淆。
第 3 章 公開金鑰加密與訊息認證 3-9
訊息認證值(message digest,或稱訊息摘要)除了可以協助訊息認證外,
亦可協助驗證資料完整性。它的功能與網路通訊的框架檢查相同:如果訊息
中的任何位元在傳輸過程中遭到意外更改,訊息認證值就會有錯誤。
簡易的雜湊函數
所有的雜湊函數運作都依照以下通則。將輸入(訊息、檔案等)視為連
續的區塊資料,區塊以 n 位元為單位,依照順序每次處理一個區塊,這就是
n 位元的雜湊函數。
其中一個最簡單的雜湊函數,是每個區塊逐位元作 XOR 運算,如下:
Ci = bi1 ⊕ bi2 ⊕•••⊕bim
其中:
Ci = 雜湊值的第 i 位元,1 ≦ i ≦ n
m = 總共輸入的區塊數量
bij = j 區塊中的第 i 位元
⊕ = XOR 運算
圖 3.3 使用位元 XOR 的簡易雜湊函數
圖 3.3 解釋了這個運作模式,它對每個區塊中相同位置的位元作 XOR,
並產生一個檢查位元(parity,譯註:也就是 Ci);這項動作稱為縱向同位
檢查。此法對於任意不規則資料的完整性檢查很有效率。雜湊值由 n 個位元
3-10 網路安全精要
構成,其中每個位元地位相同。因此,在傳輸中發生資料錯誤,而雜湊值卻
不變的機率是 2−n。使用已知固定格式的資料會導致雜湊函數的效果變差。例
如,在常見的文字檔案中,每 8 位元中的高位元通常是 0。所以如果在這種
型態的資料使用 128 位元的雜湊函數,其效力不是 2−128,而是 2−112。
有一個簡單的方法可以補強:在每個區塊資料處理完後,將雜湊數值循
環位移一位元。程序摘要說明如下:
1. 先將 n 位元的雜湊數值設定為 0。
2. 對每個位元的區塊處理如下:
a. 雜湊數值向左循環位移一位元,
b. 對區塊資料作 XOR 運算後,得到雜湊數值。
這些動作的效果是將輸入更徹底地打亂,並且克服了規則性輸入產生的
問題。
雖然第二個方法提供了一個不錯的資料完整性檢驗方法,但是若明文訊
息在傳輸時伴隨加密的雜湊碼(如圖 3.2(a) 和 3.2(b)),第二個方法對於資
料完整性的驗證則派不上用場。原因是,如果給一個訊息,要產生另一個新
的訊息而且具有相同的雜湊碼,是一件簡單的事情:只要準備好另一個所需
的訊息,然後附上 n 位元的區塊資料,使新訊息多一個區塊,就可以兜出所
需的雜湊碼。
雖然在僅有雜湊碼被加密(訊息不加密)的狀況之下,採用單純的 XOR或是 RXOR(rotated XOR,也就是前述將雜湊值向左位移一個位元)的方
式,皆不足以提供資料完整性驗證,但是你也許會覺得,在訊息以及雜湊碼
都加密的情況之下,上述的方法就會變得實用,然而你仍必須小心。由美國
國家標準局發表的技術,能把訊息切割成以 64 位元為單位的區塊,然後作簡
單的 XOR,再利用 CBC 模式對整個訊息加密。我們可以將系統定義如下:
假設訊息是由一串 64 位元的區塊組成:X1, X2, …, XN,而雜湊碼 C 是所有區
塊經過逐個或全部一起 XOR 運算之後所產生的最後一個區塊:
C = XN+1 = X1 ⊕ X2 ⊕ … ⊕ XN
第 3 章 公開金鑰加密與訊息認證 3-11
然後將整個訊息連同雜湊碼一起用 CBC 模式加密,產生加密訊息:Y1, Y2, …, YN+1。[JUEN85] 提出一些方法可以用來產生訊息的密文,並且無法
由雜湊碼偵測出來。例如由 CBC 的定義(如圖 2.9),我們可以得到,
X1 = IV ⊕ D(K, Y1)
Xi = Yi-1 ⊕ D(K, Yi )
XN+1 = YN ⊕ D(K, YN+1)
但是已知 XN+1 是雜湊碼:
XN+1 = X1 ⊕ X2 ⊕ … ⊕ XN
= [IV ⊕ D(K, Y1) ⊕ [Y1⊕D(K, Y2)] ⊕ … ⊕ [YN−1 ⊕ D(K, YN)]
因為前述方程式可以用任何順序來做 XOR 運算,因此可得雜湊碼不會
因為密文區塊排列方式的更動而有所改變。
安全雜湊函數 SHA-1
安全雜湊演算法(SHA)是由 NIST 發展,並在 1993 年發表在 FIPS PUB 180,1995 年更新的版本則是 FIPS PUB 180-1,通常稱之為 SHA-1。
SHA-1 也列入了 RFC 3174,兩者的內容相同,但 RFC 3174 加入了 C 程式
碼的實作。
SHA-1 會產生 160 位元的雜湊值。在 2002 年,NIST 又修訂此標準並公
佈了 FIPS 180-2,這定義了 SHA 的三個新版本,分別是雜湊值長度為 256、
384、512 的 SHA-256、SHA-384、SHA-512(表 3.1)。這些新版的架構都
相同,也使用如同 SHA-1 的同餘算術和二進位邏輯運算。在 2005 年,NIST表示將逐步淘汰 SHA-1,並且將在 2010 年之前以其他的 SHA 作為正式標
準。這項訊息公佈之後不久,有研究團體發現使用 269 雜湊運算的 SHA-1 隱
含了安全弱點 [WANG05],這項結果也將業界加速轉移到其他版本的 SHA。
3-12 網路安全精要
表 3.1 SHA 參數比較
SHA-1 SHA-256 SHA-384 SHA-512
訊息摘要長度 160 256 384 512
訊息長度 <2128 <2128 <2128 <2128
區塊長度 512 512 1024 1024
字組長度 32 32 64 64
步驟數量 80 64 80 80
安全性 80 128 192 256
注意:1. 所有長度的單位皆為位元。
2. 使用生日攻擊法破解長度為 n 的訊息摘要,需耗費大約 2n /2 的成本
才能產生一次碰撞。
我們將在本節說明 SHA-512,這與其他 SHA 版本的架構非常類似。這
個演算法所輸入的最大訊息長度必須小於 2128 位元,並且會產生 512 位元的
訊息摘要為輸出。輸入的訊息會以 1024 位元的區塊處理。圖 3.4 描述了
SHA-512 的整個處理過程。處理的過程包含以下步驟:
步驟 1: 附加填充位元。在訊息之後附加填充位元,讓訊息長度符合 896 mod 1024。附加填充位元是必要步驟,縱使訊息本身的長度已經符合需
求。因此,附加的填充位元數量從 1 到 1024,而填充位元的組成,
是先加一個 1 位元,後續再補上所需長度的 0 位元。
步驟 2: 加上長度。在訊息之後加上一段 128 位元區塊。此區塊被視為無正
負號的 128 位元整數(以最高位元為優先),區塊內容是原始訊息
(附加填充位元之前)的長度。
前兩步驟的結果產生長度為 1024 位元整數倍的訊息。在圖 3.4,展
開的訊息代表 1024 位元區塊 M1、M2…MN 的順序,因此展開的訊
息總長度是 N × 1024 位元。
第 3 章 公開金鑰加密與訊息認證 3-13
圖 3.4 使用 SHA-512 來產生訊息摘要
步驟 3: 初始雜湊暫存區。我們使用 512 位元暫存區儲存雜湊函數的中間值
以及最後的結果。整個暫存區可以分成 8 個 64 位元的暫存器(a、b、
c、d、e、f、g、h)。這些暫存器的初始值會如下設定(以 16 進位
表示):
a = 6A09E667F3BCC908 e = 510E527FADE682D1
b = BB67AE8584CAA73B f = 9B05688C2B3E6C1F
c = 3C6EF372FE94F82B g = 1F83D9ABFB41BD6B
c = A54FF53A5F1D36F1 h = 5BE0CDI9137E2179
這些值是以「以高位元結尾」的格式儲存,因此字組最高位元組是
在低位址(最左邊)位元組位置。要取得這些字組,要先計算前 8個質數的平方根,再取平方根的前 64 位元。
步驟 4: 處理 1024 位元(128 字組)區塊裡的訊息。這個演算法的核心是
由 80 個回合所組成的模組。圖 3.4 的 F 就是這個模組,而圖 3.5 則
是這個模組的運作流程。
3-14 網路安全精要
每個回合的輸入是 a、b、c、d、e、f、g、h 等合計 512 位元的暫存
區,並且會更新這些暫存區的值。在第 1 回合的輸入,暫存區取得
雜湊的中間值 Hi -1。每個回合 t 會利用源自目前 1024 位元區塊(Mi)
所要處理的 64 位元的 Wt。利用訊息排程可以得到這些值;隨後會
解說訊息排程。每個回合也會利用加法常數 Kt(0 ≤ t ≤ 79)表示這
80 個步驟。這些字組呈現了前 8 個質數立方根的前 64 位元,而常
數提供了 64 位元樣式的「隨機化」集合,這會排除輸入資料的任何
規律性。
第 80 回合的輸出會加到第 1 回合(Hi−1)的輸入而產生 Hi。相加的
方式,是暫存區每 4 個字組,與 Hi−1 每個相對應的字組,以字組各
自獨立相加,並且取 264 同餘。
圖 3.5 SHA-512 處理單一 1024 位元區塊
第 3 章 公開金鑰加密與訊息認證 3-15
步驟 5: 輸出。處理過所有 N 個 1024 位元區塊之後,第 N 個階段的輸出就
是 512 位元的訊息摘要。
SHA-512 演算法有一個特性:雜湊碼的每個位元都是所有輸入位元的函
數。基本的函數 f t 在反覆使用後,讓產生的結果得以充分混合。也就是說,
不太可能會有兩個隨機選取的訊息卻可以產生一模一樣的雜湊碼。即使選取
的 兩 個 訊 息 有 類 似 規 律 的 內 容 , 也 不 太 可 能 產 生 相 同 的 雜 湊 碼 。 除 非 在
SHA-512 有隱藏的缺點(目前為止還沒有被發現),要發現兩個不同訊息卻
有相同的訊息摘要的困難度為 2256 個運算;而給予一個訊息摘要,卻想要產
生出原來訊息,困難度為 2512 個運算。
其他安全雜湊函數
和對稱性區塊密碼器一樣,設計安全雜湊函數的人其實很不願意使用未
被證實的結構。而 DES 是以菲仕托密文為基礎的加密標準,因此幾乎所有的
區塊加密都遵循菲仕托的設計。因為這樣的設計可以套用來避免有新的密碼
破解的威脅。反之,若使用一個全新的設計來做對稱性區塊加密,才會令人
擔心這個設計結構本身是否開放了更多還沒被想到的新攻擊。目前,最重要
的雜湊函數遵循的基本結構(如圖 3.4),也被拿去做為遞迴雜湊函數的參考,
並由 Merkle 發表在 [MERK79, MREK89]。當初設計這個遞迴雜湊函數的動
機,來自 Merkle [MERK89] 和 Damgard 在 [DAMG89] 當中的觀察,如果
壓縮函數有防制碰撞的特性,那麼遞迴雜湊函數也可以如此。因此這個結構
可以用來產生一個安全的雜湊函數,以運作在任何長度的訊息上。設計一個
安全雜湊函數的問題就降為「如何設計一個輸入為某固定長度的防制碰撞的
壓縮函數」。這已經被證明是一個基本又可靠的方法,而新的設計只要重新
定義其架構,再加上雜湊碼的長度即可。
我們要在這節介紹 SHA 以外的兩個安全雜湊函數,而且都已獲得商業上
的認同。
3-16 網路安全精要
MD5 訊息認證演算法
MD5 演算法(RFC 1321)是由 Ron Rivest 開發完成的。直到最近幾年,
大家對暴力窮舉式攻擊和密碼破解提高關切,MD5 才成為最廣泛使用的安全
雜湊函數。這個演算法可以接受任何長度的訊息作為輸入,而且輸出 128 位
元的訊息摘要。輸入部分分成每 512 位元一個區塊來處理。
近年來處理器速度急遽上升,128 位元雜湊碼的安全性已經開始受到質
疑:找出兩個訊息且擁有相同訊息摘要,困難度是 264 個運算;給定一個訊
息認摘要,而找出其對應的原始訊息,困難度是 2128 個運算。前者所提供的
安全性已經不再足夠。更甚者,有很多密碼分析攻擊方式被提出,指出一些
MD5 難以防守的弱點 [BERS92, BOER93, DOBB96]。
Whirlpool
Whirlpool [BARR03, STAL06b] 是由 Vincent Rijmen 和 Paulo Barreto所發展;前者是來自比利時的 Rijndael(為 AES 所採用)的設計者之一,後
者是巴西的密碼專家。Whirlpool 也是 NESSIE(New European Schemes for Signatures, Integrity, and Encryption)唯二背書的雜湊函數之一 [PREN02]
。NESSIE 計畫是由歐盟贊助,是一項致力於加強各種密碼標準的計畫。
Whirlpool 是以壓縮函數的區塊加密為基礎,使用了專為雜湊函數所設
計的區塊加密法,而這種區塊加密法也不太可能單獨當作加密函數,理由是
設計者希望利用到 AES 區塊加密的安全性和效率,以及相當於 SHA-512 雜
湊長度所提供的安全性。這個想法的結果就是區塊加密法 W,它的結構和
AES 類似,而且基本功能也和 AES 相同,但使用的區塊長度和金鑰長度則是
512 位元。
這個演算法的輸入訊息長度最大不能超過 2256 位元,產生的輸出是 512位元的訊息摘要;其輸入是在 512 位元的區塊進行處理。
另一項是 SHA 的三種變化:SHA-256、SHA-384、SHA-512。
第 3 章 公開金鑰加密與訊息認證 3-17
HMAC 演算法
最近幾年,大家對發展一個由密碼的雜湊值導出 MAC 的技術很感興趣,
引起他們興趣的原因如下:
密碼學的雜湊函數通常執行起來的速度比傳統加密演算法(如 DES)的速度來得快。
密碼學的雜湊函數所使用的函數庫使用較普及。
雜湊函數(像 SHA-1)並不是設計做 MAC 用途,而且也不能直接拿來
這樣用,因為它並不仰賴於秘密金鑰。目前已經有很多「在現存的雜湊演算
法 加 入 秘 密 金 鑰 」 的 建 議 。 其 中 最 受 支 持 的 方 法 是 HMAC[BELL96a, BELL96b]。HAMC 已經在 RFC 2104 發表,並且已經被選為可以作為 IP 安
全防護的 MAC,也被用在其他的網路通訊協定,像是傳輸層安全(TLS,很
快就取代了 SSL)和電子交易安全(Secure Electronic Transaction, SET)。
HMAC 的設計目標
RFC 2104 列出了下面設計要點:
要使用現有的雜湊函數,而且不做任何修改。尤其是指那些在軟體上效
能很好,且為免費的程式碼及普遍使用的雜湊函數。
要允許方便替換原來的內嵌雜湊函數,使之更快更安全。
要能保持原來雜湊函數的效能,不能有顯著的下降。
要能夠以簡單的方式使用及掌控金鑰。
要能夠以內嵌雜湊函數所能提供的合理假設為基礎,進而充分分析了解
此認證機制之安全強度。
前兩項設計目標對於「HMAC 是否能被接受」佔了很重要的地位。HMAC將雜湊函數當成一個黑箱,如此有兩個好處。第一個好處,現有的雜湊函數,
可以用來當成實作 HMAC 中的一個模組。這個方法中,HMAC 的主體程式
已經事先準備好了,而且不需要任何修改調整,就已經可以使用了。第二個
好處,當我們想要換掉目前 HMAC 實作的雜湊函數,只要把現在的雜湊函數
3-18 網路安全精要
移除,把新的模組加入就好了。這個情況有可能發生在我們需要更快速的雜
湊函數時。更重要的,如果內嵌雜湊函數的安全性有問題,我們只要將那個
雜湊函數換成一個更安全的函數,即可恢復 HMAC 的安全性了。
事實上,前述的最後一個設計目的,是導致 HMAC 強過其他以雜湊為基
礎的系統架構的主要優勢。HMAC 可以被證明它確實提供安全性的保障,因
為所內嵌的雜湊函數,有一些合理的密碼學上的威力。我們稍後會再討論這
個部份。現在先介紹 HMAC 的架構。
HMAC 演算法
圖 3.6 呈現了 HMAC 的整個運作過程,定義如下:
H = 內嵌的雜湊函數(例如 SHA-1)
M = HMAC 輸入之訊息(包括內嵌雜湊函數設定的填充位元)
Yi = M 的第 i 個區塊,0 ≤ i ≤ (L − 1)
L = 訊息 M 中區塊的總數
b = 每個區塊中的位元數
n = 由內嵌雜湊函數中產生之雜湊碼的長度
K = 秘密金鑰,如果金鑰長度超過 b,則金鑰要輸入雜湊函數以產生
出 n 位元的金鑰;K 的建議的長度是 ≥ n。
K+ = 在金鑰 K 的左邊填入足夠數量的 0,以湊成 b 的長度。
ipad = 00110110(十六進未表示法的 36),重複 b/8 次。
opad = 01011100(十六進未表示法的 5c),重複 b/8 次。
因此 HMAC 可以表示如下:
HMAC(K, M)=H[ (K+ ⊕ opad)||H[(K+ ⊕ ipad)||M]]
第 3 章 公開金鑰加密與訊息認證 3-19
圖 3.6 HMAC 的結構
文字敘述如下:
1. 在 K 的左邊加入 0 產生出長度為 b 的 K+(例如:如果 K 是 160 位元,
而 b 為 512 位元,則 K 的左邊要附上 44 個零位元組 0x00)。
2. K+ 和 ipad,逐位元做 XOR 運算。
3. 在 Si 加入 M。
4. 將第 3 步驟的結果輸入 H。
5. 將 K+ 和 opad 做 XOR 運算,產生 b 位元的 So。
6. 把第 4 步驟的雜湊結果加入 So。
7. 把第 6 步驟產生的串流輸入 H,輸出結果。
3-20 網路安全精要
要注意的是,和 ipad 做 XOR 運算的結果,會將 K 半數的位元,由 0 變
1,而 1 變 0。同理,和 opad 做 XOR 運算後也會將 K 半數的位元值改成相反,
只不過兩個運算所更改的位元集,是不相同的。事實上,在演算法中,由 Si
到 So 我們已經由 K 模擬隨機產生了兩把金鑰了。
在處理長訊息時,HMAC 會和內嵌雜湊函數幾乎同時間進行。HMAC 內
含三個新增的基本雜湊函數的執行元件(也就是:Si,So,以及內嵌雜湊函
數所產生的區塊)。
3.3 公開金鑰加密法原理
和傳統加密法有相同重要性的公開金鑰加密演算法,在訊息認證和金鑰
分發上扮演重要角色。在這一節中,先介紹公開金鑰加密演算法的基本概念,
以及金鑰分發的議題。在 3.4 節會介紹兩個最重要的公開金鑰加密演算法:
RSA 和迪菲-赫爾曼;3.5 節則會介紹數位簽章。
公開金鑰加密結構
公開金鑰加密方法首先由迪菲和赫爾曼在 1976 年發表 [DIFF76],這是
密碼學幾千年來首度革命性的突破。因為公開金鑰演算法是以數學函數為基
礎,而不是只做位元的運算。更重要的,公開金鑰加密法是非對稱性的加密
演算法,相關使用的金鑰有兩把。相對地,傳統對稱性的加密演算法,卻只
使用一把金鑰。使用兩把金鑰在保密性、金鑰分發,和認證的範疇中,有著
重要深遠的影響。
開始之前,我們應該先提出幾個重要的錯誤概念。其中一個,認為公開
金鑰加密法比傳統加密法在預防密碼破解的方面,具備了更高的安全性。事
實上,抵抗密碼破解的安全性,是取決於 (1) 金鑰的長度和 (2) 破解密碼所
需花費的計算工作。其實並沒有任何關於傳統加密或公開金鑰加密相關的原
理,可以讓其中一種方法比另一個更能抵抗密碼破解的攻擊。第二個錯誤的
觀念,把公開金鑰加密法當成是以淘汰掉傳統加密法為目標的演算法。相反
第 3 章 公開金鑰加密與訊息認證 3-21
地,目前因為公開金鑰加密法的計算量比傳統加密法還多,所以在未來的一
段時間內,傳統加密演算法還不會被公開金鑰演算法完全取代。最後一項,
會造成一種錯覺,以為在使用公開金鑰加密法的金鑰分發問題比傳統的加密
法還簡單,傳統加密法要和金鑰分發中心做複雜的握手協定。但是,事實上
公開金鑰加密法還要和代理中心有一些共同的協定,程序不比傳統加密法的
容易、有效率。
公開金鑰加密系統有六個組成要素(如圖 3.7(a)):
明文:是一個可閱讀的資料或訊息,用來當演算法的輸入。
加密演算法:是一個將明文做多重轉換的演算法。
公開金鑰和私密金鑰:是一對金鑰,其中一把用來加密,另一把用來解
密。而加密演算法真正做的轉換工作,是取決於提供的輸入金鑰是屬於
公開金鑰還是私密金鑰。
密文:是將訊息打亂後,產生出來的輸出結果。由原文和金鑰決定內容。
如果有一個訊息,用兩把不同的金鑰加密,得到的密文就不會相同。
解密演算法:這個演算法需要輸入密文和對應的金鑰,然後產生原來的
明文。
看名字就知道,這對金鑰中的公開金鑰是公開出來給大家都知道的,但
是私密金鑰只有真正擁有者才會知道。一個平常用途的公開金鑰加密演算
法,用一把金鑰來加密,而用另一把對應的金鑰來解密。
基本步驟如下:
1. 每個使用者產生一對金鑰,用來加密與解密。
2. 每個使用者將其中一把金鑰當作公開金鑰,放在公開暫存區,或其他大
家都可以讀取的檔案;而另一把金鑰則保持秘密不公開。如圖 3.7(a) 所示,每個使用者都維持著一份資料,記載著其他人的公開金鑰。
3. 如果鮑伯想要送訊息給愛麗斯,則鮑伯就用愛麗斯的公開金鑰加密訊
息,再將訊息傳送給愛麗斯。
3-22 網路安全精要
4. 當愛麗斯收到訊息後,會用自己的私密金鑰將密文解密。假如其他人收
到這個訊息也無法將它解密成正確的原文,因為只有愛麗斯知道自己的
私密金鑰。
圖 3.7 公開金鑰加密
第 3 章 公開金鑰加密與訊息認證 3-23
在這個方法中,所有的同伴都可以存取大家的公開金鑰。而私密金鑰只
有自己產生給自己使用,因此私密金鑰就不必分發。只要大家都把自己的私
密金鑰保密不要讓別人知道,來往的訊息就可得以保密。任何時間,只要使
用者想要更換自己的金鑰,只要產生新的私密金鑰和對應的公開金鑰,然後
將舊的公開金鑰換成新的公開金鑰即可。
在傳統加密法中所使用的金鑰,通常稱作秘密金鑰;而公開金鑰加密法
中所使用的一對金鑰,則分別稱為私密金鑰以及公開金鑰。私密金鑰也是同
樣保持秘密不公開,但不是指傳統加密法中的秘密金鑰,避免混淆。
公開金鑰加密系統的應用
開始之前,必須先釐清公開金鑰加密法的一個概念,以免產生困惑。公
開金鑰系統的特徵是「使用兩把金鑰」。其中一把保持私密性不公開,而另
一把是公開給大家使用。依照應用的不同,發送訊息的人可以使用自己的私
密金鑰來加密,也可以用接受訊息者的公開金鑰加密,或者要同時使用也可
以。我們可以將公開金鑰加密系統的使用方式分成下面三類:
加密/解密:發送者將訊息以接收者的公開金鑰加密。
數位簽章:發送者用自己的私密金鑰在訊息上簽章,將加密演算法套用
在訊息中,或是一個區塊的資料,當成訊息的函數處理,就完成簽章的
工作。
交換金鑰:溝通的兩方,交換一個連線金鑰。有幾個不同的方法來做交
換金鑰的工作,可以利用單方的私密金鑰或同時使用雙方的私密金鑰。
有些演算法可適用這三類應用,有些演算法只適用於其中一個或兩個應
用。表 3.2 列出那些應用本章討論的演算法(RSA 和迪菲-赫爾曼),也包
含數位簽章標準(DSS)和橢圓曲線密碼學,後二者在本章稍後會討論到。
3-24 網路安全精要
表 3.2 公開金鑰密碼系統的應用
演算法 加密/解密 數位簽章 交換金鑰
RSA 是 是 是
迪菲-赫爾曼 否 否 是
DSS 否 是 否
橢圓曲線 是 是 是
公開金鑰密碼系統的需求
圖 3.7 所示的加密系統是依靠以兩把金鑰為基礎的秘密演算法。迪菲和
赫爾曼假設這個系統存在,但他們並未展示這樣的演算法。然而,他們列出
這些演算法必須完全滿足以下條件 [DIFF76]:
1. 對 B 方來說,想找出一對(公開金鑰 PUb,私密金鑰 PRb)金鑰,要
很好計算。
2. 對發送者 A 來說,知道公開金鑰和要加密傳送的訊息 M 時,可以很容
易計算出對應的密文:
C = E(PUb , M)
3. 對接收者 B 來說,將接收到的密文訊息時,要用自己的私密金鑰解密
的計算可以很容易做到:
M = D(PRb, C) = D[PRb, E(PRb, M)]
4. 如果有人知道公開金鑰 PUb,而想要找出所對應的私密金鑰 PRb,必定
是無法計算出結果的。
5. 假設知道公開金鑰 PUb 和密文 C 時,也無法計算出原文訊息。
我們可以加入第六項需求,對公開金鑰來說是很好用的,但不是絕對必
要的:
6. 兩把金鑰中的任何一把都可以用來加密,而另一把就用來解密。
M = D[PUb, E(PRb, M)] = D[PRb, E(PUb, M)]
第 3 章 公開金鑰加密與訊息認證 3-25
3.4 公開金鑰加密演算法
兩個最普遍使用的公開金鑰加密演算法是 RSA 和迪菲-赫爾曼,我們在
這一節會介紹這兩個加密演算法,然後會簡介其他兩個演算法 。
RSA 公開金鑰加密演算法
Ron Rivest、Adi Shamir、Len Adleman 在 1997 年開發出最早的公開金
鑰加密系統之一,並且在 1978 年 [RIVE78] 首次發表。RSA 公開金鑰系統,
開始成為最廣為接受的公開金鑰加密法。RSA 使用區塊密文,不管明文或密
文都看作用 0 到 N − 1 的整數來表示。RSA 公開金鑰系統是以發明者的姓各
取一字母來命名。
以區塊明文 M,和區塊密文 C 來說,加密和解密的動作如下:
C = Me mod n
M = Cd mod n = (Me)d mod n = Med mod n
不管是發送者或是接收者都必須知道 n 和 e 的值,而且 d 值只有接收者
才知道。這就是以 {e, n} 為公開金鑰 PU,以 {d, n} 為私密金鑰 PR,所得
的公開金鑰加密演算法。為了讓這個演算法能夠達到公開加密演算法的標
準,必須合乎以下需求:
1. 要有辦法找到 e、d、n 的值,使得在所有的 M < n 的情況下,讓 Med =
M mod n
2. 若所有的 M < n,相對容易計算出 Me 和 C
3. 如果知道 e 和 n 的值,必須無法算出 d
前兩項條件,很容易達成。而要達到第三項條件,e 和 n 的值可能會很大。
本節應用了一些數論的基礎,相關資訊請參考附錄 A。
3-26 網路安全精要
圖 3.8 對 RSA 演算法做了摘要說明。首先,選出 p 和 q 兩個質數,並且
算出它們的乘積 n;n 將用來當成加密和解密時的除數。接下來要計算ψ(n),
其代表 n 的 Euler totient 值。ψ(n) 代表小於 n 且與 n 互質的正整數的個數。
然後選一個和ψ(n) 互質的整數 e。最後,找出 d,使 d 和 e 的乘積除以ψ(n)所得之餘數為 1。
我們可以經由證明得知,d 和 e 符合 RSA 架構所需要的特性。
假設 A 已經公佈他的公開金鑰,而 B 想要送訊息 M 給 A,則 B 計算出 C = Me (mod n),然後,將 C 傳送出去,而 A 收到密文時,可以用 M = Cd (mod n) 解密得到原文。
圖 3.8 RSA 演算法
第 3 章 公開金鑰加密與訊息認證 3-27
[SING99] 有一個如下產生金鑰的例子(如圖 3.9):
1. 選定 p = 17,q = 11
2. 計算 n = pq = 17 × 11 = 187
3. ψ(n) = (p − 1)(q − 1) = 16 × 10 = 160
4. 選出 e 與ψ(n) 互質 (ψ(n) = 160),且小於ψ(n),選 e = 7
5. 決定 d 的值,讓 de mod 160 = 1,且 d 小於 160,則 d = 23,因為 23 ×
7 = 161 = 1 × 160 + 1
圖 3.9 RSA 演算法的例子
算出來的兩把金鑰分別是:公開金鑰 PU 為 {7, 187}、私密金鑰 PR{23, 187}。這個例子若以訊息 M = 88 為明文,則密文計算過程為 C = 887 mod 187。我們可以藉助餘數計算的數學特性,計算如下:
887 mod 187 = [(884 mod 187) × (882 mod 187) × (881 mod 187)] mod 187
881 mod 187 = 88
882 mod 187 = 7744 mod 187 = 77
884 mod 187 = 59,696,536 mod 187 = 132
887 mod 187 = (88 × 77 × 132) mod 187 = 894,432 mod 187 = 11
為了解密,我們計算 M = 1123 mod 187
1123 mod 187 = [(111 mod 187) × (112 mod 187) × (114 mod 187) × (118 mod 187) × (118 mod 187)] mod 187
111 mod 187 = 11
112 mod 187 = 121
3-28 網路安全精要
114 mod 187 = 14,641 mod 187 = 55
118 mod 187 = 214,358,881 mod 187 = 33
1123 mod 187 = (11 × 121 × 55 × 33 × 33) mod 187 = 79,720,245 mod 187 = 88
攻擊 RSA 演算法有兩個方法。第一個方法是使用暴力窮舉攻擊法,也就
是試遍所有可能的私密金鑰。因此,如果 d 和 e 的值越大,RSA 演算法就越
安全。然而,金鑰的產生和加解密,也都涉及這些金鑰之間的複雜計算,金
鑰如果越大,系統運作會越慢。
通常討論到 RSA 演算法的密碼分析,幾乎都是將注意力集中在「將 n 因
數分解成兩個質數」。對一個很大的數字 n,要如何計算出它的質因數,是
很困難的問題。但以現在來說,已經比過去簡單一些了,解說如下。RSA 的
發明人在 1977 年向 Scientific American 的讀者挑戰:將他們印在 Martin Gardner 數學專欄 [GARD77] 的密文解碼。他們提供 100 美金作為獎金,只
要能夠回覆正確的原文,就可以贏得獎金。他們認為,在 4 × 1016 年之內,
根本不可能成功解密。結果在 1994 年 4 月,有一群網路工作者贏得這個獎
項。他們使用超過 1600 部電腦,耗時八個月解碼完成 [LEUT94]。這項挑戰
所用的公開金鑰長度是 129 位數字(約是 428 位元長)。這個結果並沒有讓
大家停用 RSA,只是透露出一個事實:RSA 必須使用長度更長的金鑰。而目
前認為 1024 位元長的金鑰(十進位約為 300 位數),不管是對任何應用程
式,都可以提供足夠安全的密碼強度。
迪菲-赫爾曼交換金鑰
第一個公開金鑰演算法是由迪菲和赫爾曼發表在研討會的論文。他們定
義了公開金鑰密碼系統 [DIFF76],名為迪菲-赫爾曼金鑰交換演算法。為數
眾多的商業產品都採用了這個技術。
這個金鑰交換演算法的目的是讓兩個使用者互相交換秘密金鑰,以方便
雙方進行後續的加密。而此演算法本身只限應用在金鑰交換。
第 3 章 公開金鑰加密與訊息認證 3-29
迪菲-赫爾曼演算法的效能取決於計算不連續對數的困難程度。我們 將不連續對數的定義簡要敘述如下。首先,我們將原根定義為:若 a 為質數
p 的原根,則 a 各項指數的乘積會產生所有 1 到 p − 1 的整數。也就是以下 數值:
a mod p, a2 mod p,...,a p−1 mod p
恰好構成整數 1 到 p − 1 的某種排列順序。
給一個任意小於 p 的整數 b,和 p 的原根 a,則可以找到唯一的數字 i,使得:
b = ai mod p 其中 0≦ i ≦(p − 1)
以上算式的指數 i 就是以 a 為基數,b mod p 的不連續對數或指數。我們
會以 dloga ,p(b) 來表示這個值。
演算法
有了相關背景知識之後,接下來可以定義迪菲-赫爾曼金鑰交換演算法
(如圖 3.10)。其中有兩個已知公開的數字:質數 p 和整數 α(α 為 q 的原
根)。假設使用者 A 和 B 想要交換金鑰,則 A 選擇一個任意整數 XA < q 且
計算出 YA = αX A mod q。B 同樣也選擇一個任意整數 XB < q 且計算出 YB = αX B mod q,且雙方都秘密存放 X,而將 Y 公開給對方。A 計算出金鑰 K = (YB)X A mod q,而 B 計算出 K = (YA)XB mod q,而此兩個算是所得之金鑰 K 應該為
相同的結果:
K = (YB)XA mod q
= (αXB mod q)XA mod q
= (αXB)XA mod q
= αXB XA mod q
許多書將不連續對數稱為指數,但這並未獲得認同。
3-30 網路安全精要
= (αXA)XB mod q
= (αXA mod q)XB mod q
= (YA)XB mod q
圖 3.10 迪菲-赫爾曼金鑰交換演算法
結果便是雙方能夠交換金鑰。而因 XA 和 XB 為私有不公開,攻擊者只能
使用下列元素:q、α 、YA、YB。因此只能由不連續對數算出金鑰值。如欲攻
擊 B 的秘密金鑰則必須算出:
XB = dlogα,q(YB)
然後能以 B 相同的方法算出 K。
第 3 章 公開金鑰加密與訊息認證 3-31
迪菲-赫爾曼交換金鑰的安全性建立在以下的事實:要計算出指數除以
質數,相對的比計算不連續對數還要容易許多。計算不連續對數實在太難了,
尤其是大質數,很難算出它的不連續對數。
這裡舉一個交換金鑰的例子。質數 q = 353,而對應的原根 α = 3。A 和
B 選的秘密金鑰分別為 XA = 97,XB = 233。算出各自的公開金鑰:
A:YA = 397 mod 353 = 40
B:YB = 3233 mod 353 = 248
交換公開金鑰後,雙方可算出秘密金鑰:
A:K = (YB)XA mod 353 = 24897 mod 353 = 160
B:K = (YA)XB mod 353 = 40233 mod 353 = 160
我們假設攻擊者擁有以下資訊:
q = 353; α = 3; YA = 40; YB = 248
這個簡單的範例可能以暴力攻擊法找出秘密金鑰是 160。尤其攻擊者 E能算出等式 3a mod 353 = 40 或 3b mod 353 = 248 的結果,而找出共同的金
鑰。暴力攻擊法能算出 3 的乘冪取 353 的同餘,一直到結果等於 40 或 248為止。直到指數為 97 才會出現我們想要的結果,也就是 397 mod 353 = 40。
而且數值越大,問題也會變得更無法解決。
金鑰交換協定
圖 3.11 是利用迪菲-赫爾曼計算的簡單協定。假設 A 希望與使用者 B建立連線,並且以一把秘密金鑰加密連線所傳輸的訊息。使用者 A 可以產生
一把只用一次的秘密金鑰 XA,然後計算 YA 再傳給 B。使用者 B 以產生秘密
金鑰 XB、計算 YB 作為回應,並將 YB 傳給 A。現在雙方都能計算這把金鑰。
過程中必須事先知道必要的公開值 q 和 α,或者讓使用者 A 挑選 q 和 α 的值,
並把這些值置入第一個訊息。
3-32 網路安全精要
圖 3.11 迪菲-赫爾曼金鑰交換
再另舉一個使用迪菲-赫爾曼演算法的例子。假設有一群使用者(例如
LAN 裡的所有使用者),每個使用者都產生一個能長久使用的私密值 Xi(i代表使用者),並且計算公開值 Yi。這些公開值與全域 q、α 都存在集中式的
目錄。使用者 j 隨時都能存取使用者 i 的公開值、計算秘密金鑰,並用在要傳
送給使用者 A 的加密訊息。如果集中式目錄是可受信任,那麼這種通訊方式
提供了機密性及某種程度的認證。因為只有 i 和 j 知道這把金鑰,因此其他使
用者都無法讀取這個訊息(機密性);而接收者 i 知道只有使用者 j 能以這把
金鑰產生訊息(認證)。不過這項技術並無法防止重送攻擊。
駭客居中攻擊
圖 3.11 的協定無法防止駭客居中攻擊。舉例來說,假設愛麗斯和鮑伯希
望交換金鑰,而達思是攻擊者,整個攻擊的過程如下:
1. 達思為攻擊先產生兩個隨意的私密金鑰 XD1 和 XD2,然後計算配對的公
開金鑰 YD1 和 YD2。
2. 愛麗斯傳送 YA 給鮑伯。
3. 達思攔截 YA 並將 YD1 傳給鮑伯,達思同時也計算 K2 = 。
4. 鮑伯收到 YD1 並計算 。
5. 鮑伯傳送 XA 給愛麗斯。
第 3 章 公開金鑰加密與訊息認證 3-33
6. 達思攔截 XA 並將 YD2 傳給愛麗斯,達思同時也計算 K1 = 。
7. 愛麗斯收到 YD2 並計算 。
此時,鮑伯和愛麗斯以為他們共用著秘密金鑰,但其實是鮑伯和達思共
用了秘密金鑰 K1,而愛麗斯和達思共用了秘密金鑰 K2。鮑伯和愛麗斯之間
所有後續的通訊都會以下列方式洩漏出來:
1. 愛麗斯傳送加密訊息 M: E(K2, M)。
2. 達思攔截此加密訊息,並解密而得到 M。
3. 達思將 E(K1, M) 或 E(K1, M') 傳給鮑伯,其中 M' 是任意訊息。在第
一種情況,達思只需要竊聽通訊而不需修改通訊內容。在第二種情況,
達思要修改傳給鮑伯的訊息。
這種金鑰交換協定容易遭受這類的攻擊,因為協定並未認證參與者的身
份。但這個弱點能以數位簽章和公開金鑰憑證加以克服,本章稍後及第 4 章
會說明這些主題。
其他公開金鑰密碼演算法
另外兩個公開金鑰演算法也獲得商業上的採用,分別是 DSS 和橢圓密碼
加密法。
數位簽章標準
美國 NIST 已經發表 FIPS PUB 186,也就是數位簽章標準(Digital Signature Standard, DSS)。DSS 利用 SHA-1 而提出了新的數位簽章技術,
這個新技術就是數位簽章演算法(Digital Signature Algorithm, DSA)。DSS在 1991 年發表,且在 1993 年基於系統安全的考量而作了修改,而且在 1996年又作了小幅度修改。DSS 所採用的演算法是專為提供數位簽章而設計,因
此 DSS 不能用來加密或交換金鑰,這點是 DSS 與 RSA 不同之處。
3-34 網路安全精要
橢圓密碼加密法
多數採用公開金鑰加密法進行加密或者數位簽章的產品和標準都使用
RSA。近年來 RSA 使用的金鑰長度已經增加,這使得應用程式處理負載加
重。對於需要大量安全交易的電子商務網站來說,更是特別沉重的負擔。也
使得近來出現了與 RSA 競爭的系統,也就是橢圓密碼加密法(Elliptic-Curve Cryptography, ECC)。ECC 已經漸漸成為一個標準,例如公開金鑰加密法
所採用的 IEEE P1363 標準。
和 RSA 相比,ECC 吸引人的地方是使用相對來說非常小的位元長度,
卻可以提供相同的安全性,因此可以降低處理的計算量。另一方面,雖然 ECC理論已經出現一段時間,但直到最近才開始有商品出現,也才引起密碼分析
師的注意。因此在安全保密方面,ECC 還比不上 RSA。
ECC 比 RSA 或迪菲-赫爾曼更難去解釋它的基礎,而且全部為數學理
論的說明,也超出了本書的範圍。其技術基礎是建立在橢圓曲線的應用。
3.5 數位簽章
公開金鑰加密法也可以做其他用途,如圖 3.7(b)所示。假設鮑伯想傳送
訊息給愛麗斯,訊息內容是否保密並不重要,重要的是他想要讓愛麗斯知道
訊息真的是由他所發送。這個例子中,鮑伯用自己的私密金鑰來將訊息加密
後,傳送給愛麗斯。愛麗斯收到之後發現用鮑伯的公開金鑰可以將訊息解密,
因此可以證實這個訊息確實是由鮑伯所傳送。因為沒有其他的人知道鮑伯的
私密金鑰,所以也沒有人可以假造一個由鮑伯發送的訊息,卻可以用鮑伯的
公開金鑰解密成功。因此,整個加密的訊息就是一個數位簽章。此外,除非
有辦法讀取鮑伯的私密金鑰,否則就不可能對訊息做修改變更。因此,只要
透過上述方式,「訊息來源」以及「訊息內容完整性」都得以同時獲得認證。
前面所描述的系統會將整份訊息加密。如此作雖然同時認證了作者和內
容,然而卻需要大量的儲存空間。原因是每份文件必須以明文的方式保存,
以做一般實際用途;另外還要以密文的方式保存一份副本,以便於計算錯誤
第 3 章 公開金鑰加密與訊息認證 3-35
發生時,可以核對來源和內容。其實還有一種方法可以同時達到這兩個效果,
就是只對某個區塊做加密,這個區塊稱為認證子或認證碼,必須有下列特性:
沒有改變認證子時,文件內容就不能變更。如果認證子被發送者以私密金鑰
加密,就是當成簽章使用,可以證明來源、內容和順序。像 SHA-1 這樣的安
全雜湊碼,可以達到這種功能(如圖 3.2(b))。
請注意,上述僅對某個區塊作加密的方式並沒有提供訊息保密性。也就
是說,訊息發送後,可以防止被變更,但是無法不被竊聽。在一個以部份加
密為基礎的簽章情況下,其道理是很明白的,因為其他的訊息是以明碼的方
式傳送。即使將整個訊息完全加密過,也是無法對訊息的私密性提供保護。
因為任何在網路上的觀察者,都可以用發送者的公開金鑰將訊息打開閱讀(譯
註:請參考圖 3.2(b),傳送端以自己的私密金鑰將訊息區塊加密,因此即使
傳送端將整個文件加密,任何人皆可利用傳送端的公開金鑰將文件解密)。
3.6 金鑰管理
公開金鑰加密法所扮演的角色之一,是解決金鑰分發的問題。關於公開
加密的應用,有以下兩個不同方面的討論議題:
公開金鑰之分配
利用公開金鑰分配秘密金鑰
我們分別討論如下。
公開金鑰憑證
表面上看起來,公開金鑰所指的是公共公開的金鑰。因此如果有一種廣
泛被大眾接受的公開金鑰加密法(例如 RSA),則任何成員都應該可以發送
自己的公開金鑰或廣播給大家知道。雖然這個方法很便利,但是有一個重要
的弱點:任何人都可能假冒成 A,發公開金鑰給另一個人,或廣播給大家知
道。直到 A 發現自己被別人仿冒,才發出警告訊號給大家。而偽造者可以閱
讀所有本來要給 A 的訊息,還可以用假造的金鑰來做認證。
3-36 網路安全精要
解決的方法是使用公開金鑰憑證。基本上,憑證包含了公開金鑰和擁有
此金鑰之使用者的相關資訊,並且將整個區塊由公正的第三者簽章。正式地
說,此第三者稱為憑證管理中心(certificate authority, CA),是一個使用
者可以信任的機構,如代理管理人,或財政機構。使用者可以將自己的公開
金鑰透過安全的方法送到 CA,然後獲得 CA 所發予的公開金鑰憑證。使用者
接著將該公開金鑰憑證公告於眾。而任何人,只要需要上述使用者的公開金
鑰,都可以獲得該使用者所公告的公開金鑰憑證,如此便能確認該使用者所
使用的公開金鑰為真。圖 3.12 解釋上述之過程。
圖 3.12 使用公開金鑰憑證
X.509 已經獲得全球的採用,作為公開金鑰憑證的格式標準。X.509 憑
證用在多數的網路安全應用上,如 IPSec、SSL、安全電子交易(SET),和
S/MIME。這些都將在本書的第 2 單元作深入討論。X.509 將於第 4 章詳細 介紹。
第 3 章 公開金鑰加密與訊息認證 3-37
透過公開金鑰傳送秘密金鑰
傳統加密法中,為了要使兩方都能安全地溝通,有一個基本的需求,就
是兩者必須共用一把秘密金鑰。假設鮑伯要在他的訊息應用程式使用傳統加
密法,使他可以安全地和網路上的使用者交換電子郵件,則他和他的通信者
愛麗斯必須先想出一個安全的方法共用一把秘密金鑰,而且不能被別人知道
內容。如果他們兩個是隔壁鄰居,那鮑伯只要將金鑰寫在紙上或磁片上,親
手交給愛麗斯就可以了。但是如果他們兩個相隔遙遠,這一招就行不通了。
那麼鮑伯可以將這把秘密金鑰以傳統方法加密後,由電子郵件寄給愛麗斯。
但是這封電子郵件又要用什麼共同的秘密金鑰加密呢?任何一個使用這個新
的電子郵件應用程式的人都會面臨到這個問題:任何一組要通信的人,都需
要一把獨一無二的秘密金鑰。
其中一項方法是使用迪菲-赫爾曼金鑰交換演算法。這個方法的確是普
遍使用中,但此法沒有提供溝通雙方互相認證的功能。
另一個有用的方法是使用公開金鑰憑證。當鮑伯要和愛麗斯通訊時,鮑
伯要做以下所列的事情:
1. 準備訊息
2. 用傳統加密搭配一次傳統連線金鑰加密訊息
3. 用公開金鑰加密搭配愛麗斯的公開金鑰來加密連線金鑰
4. 將加密過的連線金鑰加在訊息,然後發送給愛麗斯
只有愛麗斯可以解開這加密過的連線金鑰,因而能夠閱讀原來的訊息內
容。而如果鮑伯可以拿得到愛麗斯的公開金鑰,表示愛麗斯有公開金鑰憑證,
那麼鮑伯可以確定這是一把正確的金鑰了。
3-38 網路安全精要
3.7 建議閱讀及網站資源
[STIN06] 及 [MENE97],可以發現關於雜湊函數以及訊息認證碼的紮實
說明。
第 2 章所推薦的讀物已經包含公開金鑰和傳統加密法的讀物。[DIFF88] 詳細說明了幾個試圖策劃出雙金鑰安全加密演算法的嘗試,和以他們為基礎
之協定的沿革。[CORM01] 提供關於認證、計算,及 RSA 密碼分析的所有演
算法精確又完整的整理。
CORM01 Cormen, T.; Leiserson, C.; Rivest, R.; and Stein, C. Introduction to Algorithms. Cambridge, MA: MIT Press, 2001.
DIFF88 Diffie,W. ”The First Ten Years of Public-Key Cryptography.” Proceedings of the IEEE, May 1988. Reprinted in [SIMM92].
MENE97 Menezes, A.; Oorshcot, P.; and Vanstone, S. Handbook of Applied Cryptography. Boca Raton, FL: CRC Press, 1997.
SIMM92 Simmons,G., ed. Contemporary Cryptology:The Science of Information Integrity. Piscataway, NJ: IEEE Press, 1992.
STIN06 Stinson,D. Cryptography: Theory and Practice. Boca Raton, FL: CRC Press, 2006.
推薦網站
NIST Secure Hashing Pages:提供關於 SHA FIPS 等相關文件。
Whirlpool:Whirlpool 相關資訊。
RSA Laboratories:提供許多關於 RSA 以及密碼學的技術文件。
第 3 章 公開金鑰加密與訊息認證 3-39
3.8 關鍵詞彙及學習評量
關鍵詞彙
Diffie-Hellman key exchange:迪菲-赫
爾曼金鑰交換
Digital signature:數位簽章
Digital Signature Standard (DSS):數位
簽章標準
Elliptic-curve cryptography (ECC):橢圓
密碼加密法
HMAC
Key exchange:金鑰交換
MD5
Message authentication:訊息認證
Message authentication code (MAC):訊
息認證碼
Message digest:訊息摘要;訊息認證
One-way hash function:單向雜湊函數
Private key:私密金鑰
Public key:公開金鑰
Public-key certificate:公開金鑰憑證
Public-key encryption:公開金鑰加密
RIPEMD-160
RSA
Secret key:秘密金鑰
Secure hash function:安全雜湊函數
SHA-1
strong collision resistance:強碰撞抵抗力
weak collision resistance:弱碰撞抵抗力
學習評量
複習題
3.1 列出可以做到訊息認證的三種方法。
3.2 何謂訊息認證碼?
3.3 請簡要說明圖 3.2 三種不同的運作機制。
3.4 雜湊函數必須擁有哪些特性,才能順利應用在訊息認證?
3.5 應用雜湊函數時,所使用的壓縮函數的意義為何?
3.6 請列出公開金鑰加密系統的基本元件。
3-40 網路安全精要
3.7 請列出並簡要敘述 3 個應用公開金鑰加密系統的時機。
3.8 請說明私密金鑰與秘密金鑰之間的差別。
3.9 何謂數位簽章?
3.10 何謂公開金鑰憑證?
3.11 公開金鑰加密要如何用來分送秘密金鑰?
問題與練習
3.1 以 DES 為基礎的資料認證演算法,是最常用的 MAC 之一。該演算法
不僅是由 FIPS(FIPS PUB 113)所發表,也是 ANSI 的標準(X9.17)。
這個演算法可以定義為使用 CBC 模式的 DES 運算而初始設定值為 0。
(如圖 2.9)待確認的資料像是訊息、檔案,或是程式,都被分成一個
個 64 位元的區塊,P1, P2,..., PN。如果需要的話可以在最後一個區塊
加入填充位元,以補足 64 位元。而 MAC 包含的不是整個密文區塊,
就是區塊最左 M 個位元,16 ≤ M ≤ 64。請證明以密文回饋模式也可以
產生相同的結果。
3.2 假設 H(m) 是能將任意位元長度的訊息對映成 n 位元雜湊值的碰撞抵抗
雜湊函數。對所有訊息 x、x'(x ≠ x')來說,H(x') ≠ H(x')是否正確?
請說明。
3.3 a. 考慮以下的雜湊函數。訊息是十進位數值的序列格式,M = (a1,
a2, …,at);雜湊值 h 是以 算出(n 是預先定義的數
值)。這個雜湊函數能滿足任何 3.4 節所列的雜湊函數要求嗎?請
說明原因。
b. 重複 (a),但雜湊函數改成 。
c. 若 = (189, 632, 900, 722, 349)、n = 989,計算 (b) 的雜湊函數。
第 3 章 公開金鑰加密與訊息認證 3-41
3.4 本題會介紹一種概念上類似 SHA 的雜湊函數,其名為 toy tetragraph hash( tth) ,處理的對象是字母,而非二進位資料。假設有一段由
一串字母組成的訊息,tth 會產生由 4 個字母組成的雜湊值。首先,tth將整段訊息分成 16 個字母為單位的區塊(忽略空格、標點、大寫),
若訊息長度不是 16 的倍數,就在不足的地方填滿 null。每次處理 4 個
數值組成的累計總和,一開始的累計總和是 (0, 0, 0, 0),而這也是處
理第 1 個區塊的壓縮函數的輸入。壓縮函數由兩個回合組成。回合 1:
取得下一個文字區塊,並整理成以列為主的 4 × 4 文字區塊,然後再轉
成(A = 0, B = 1, 等)。以下面的 ABCDEFGHIJKLMNOP 區塊為例
即為:
接著將 mod 26 加到每一行,然後將結果加到累計總和。在此例,累計
總和是 (24, 2, 6, 10)。回合 2:向左旋轉回合 1 所得陣列的列的值;第
1 列向左旋轉 1 個值、第 2 列向左旋轉 2 個值、第 3 列向左旋轉 3 個值、
並反轉第 4 列的順序。以下是本例的結果:
現在將 mod 26 加到每一行,再將結果加到累計總和。新的累計總和是
(5, 7, 9, 11),而此總和現在是下一個文字區塊的壓縮函數的第 1 回
合的輸入。處理過最後的區塊之後,將最後的累計總和轉換成字母。
例如,若訊息是 ABCDEFGHIJKLMNOP,雜湊值則為 FHJL。
我要感謝 Cryptogram 雜誌的 William K. Mason 提供這個範例。
3-42 網路安全精要
a. 以類似圖 3.4 和 3.5 的圖來描繪整體的 tth 邏輯和壓縮函數邏輯。
b. 計算 48 個字母的 "I leave twenty million dollars to my friendly cousin Bill." 雜湊函數。
c. 證明 tth 的弱點,找出能產生相同雜湊的 48 個字母區塊(提示:使
用更多的 A)。
3.5 用雜湊函數建構出一個和 DES 類似結構的區塊加密模式,在某種程度
上是可能的。但由於雜湊函數為單向函數,而區塊加密又必須具有可
逆性(以做解密工作),請說明這是如何辦到的。
3.6 在還沒發明任何公開金鑰系統(像是 RSA)之前,就已經存在一個證
明了,它證明的目的是要顯示出公開金鑰加密法在理論上是可行的。
考慮下列,f1(x1) = z1;f2(x2, y2) = z2;f3(x3 , y3) = z3;所有的值都是介
於 1 和 N 之間的整數(1 ≤ xi , yi, zi ≤ N)。函數 f1 可以表示為一個長度
為 N 的向量 M1;裡面第 k 各元素的值是 f1(k);相同的,f2, f3 也可以
表示成 N × N 的矩陣,M2 和 M3,用意是要讓加密解密的處理可以用
查表法對應得到表格內的值,尤其是當 N 很大時會很好用。雖然表格
會很龐大,但是理論上式可以建構出來的。系統運作如下:用 1 到 N得整數亂數排列,建構出 M1,也就是每個整數在 M1 中只能出現一次。
M2 中每列的數字也都是前面 N 個整數亂數排列得出來的。最後將 M3內的值安排能滿足如下條件:
f3(f2(f1(k), p), k) = p,對所有的 k,p 值,1 ≤ k,p ≤ N
描述如下:
1. M1 的輸入為 k,產生 x 做為輸出。
2. M2 以 x,p 為輸入,產生 z。
3. M3 以 z,k 為輸入,而產生 p。
第 3 章 公開金鑰加密與訊息認證 3-43
在這三個表格產生好了之後,便將之公開。
a. 我們很清楚要產生出 M3 而且滿足上面的條件是可行的,如下圖填
入 M3 的值。
b. 描述如何在兩個使用者之間,用這些表格做加密解密的動作。
c. 評論此系統是否為一個安全的系統。
3.7 利用如圖 3.9 的 RSA 演算法,計算出加密和解密的結果。
a. p = 3;q = 11,e = 7;M = 5
b. p = 5;q = 11,e = 3;M = 9
c. p = 7;q = 11,e = 17;M = 8
d. p = 11;q = 13,e = 11;M = 7
e. p = 17;q = 31,d = 7;M = 2
提示:解密並不是如想像中困難;運用一些技巧吧!
3.8 在使用 RSA 的公開金鑰加密系統中,你截到一個密文 C = 10,而公開
金鑰為 e = 5,n = 35 的使用者發送出來的,請問原文 M 為何?
3.9 RSA 系統有一使用者公開金鑰是 e = 31,n = 3599,請問此使用者之
私密金鑰為何?
3.10 假設我們有一堆由 RSA 加密的區塊,而且不知道私密金鑰為何,假設
n = pq,e 是公開金鑰,如今有人告訴我們說他們發現某一個明文區塊
有公因數 n。請問這對我們有幫助嗎?
3.11 證明 RSA 可以由 M1, M2, M3,矩陣表示,如「問題與練習」3.3。
3-44 網路安全精要
3.12 考慮以下情況:
a. 選擇奇數 E
b. 選擇 P、Q 兩個質數,(P − 1) (Q − 1) − 1 可以被 E 整除。
c. 把 P 乘上 Q,得到 N
d. 計算 。
請問這個系統和 RSA 系統相同嗎?請證明。
3.13 考慮使用 RSA 和已知金鑰來建構單向雜湊函數。然後處理一個包含一
串區塊的訊息如下:首先對第一個區塊加密,將結果與第二個區塊做
XOR 運算然後再加密,以此類推。由解決下面的問題證明這個系統並
不安全。給予一個訊息,由 B1、B2 兩個區塊構成,而其雜湊函數:
RSAH(B1, B2) = RSA(RSA(B1) ⊕ B2
給一個任意區塊 C1,選出 C2 符合 RSAH(C1, C2) = RSAH(B1, B2)。因
此雜湊函數無法滿足弱碰撞抵抗力。
3.14 假設鮑伯以無法在適當時間內找到因數分解的非常大模數 n,並配合
RSA 密碼系統,而愛麗斯以 0 到 25 的整數作為呈現字元的方式傳送訊
息給鮑伯(A → 0、…Z → 25),並且以 RSA 及大數 e、大數 n 分別
加密每個數值。請問這種方法安全嗎?如果不安全,請說明攻擊這種
加密方式最有效的作法。
3.15 已知迪菲-赫爾曼系統及質數 q = 11,原根α = 2。
a. 如果 A 使用者有公開金鑰 YA = 9,請問 A 的私密金鑰 XA = ?
b. 如果 B 使用者有公開金鑰 YB = 3,請問 B 與 A 連線時的共用秘密
金鑰 K 為何?