ECDH 演算法概觀 (CNG 範例)
Elliptic Curve Diffie-Hellman (ECDH) 金鑰協議通訊協定可讓兩個使用者建立共用密碼協議。他們可以在非安全的公用媒體上進行此作業,而先前不需要交換任何私人資訊。共用密碼協議通常用來衍生金鑰內容。像是先進加密標準 (Advanced Encryption Standard,AES) 演算法等對稱演算法可以使用金鑰內容來加密後續訊息。
Cryptography Next Generation (CNG) 安全通訊範例示範 ECDH 和 AES 演算法的 CNG 實作。當 Alice、Bob 和 Mallory 建立 Communicator 物件時,會在其 Run 方法中建立密碼編譯金鑰。
ECDH 演算法
ECDH 通訊協定有賴於兩個公用參數:p 和 g。參數 p 是大質數,而參數 g 是小於 p 的整數。這兩個參數會透過非安全線路交換。在 Alice 和 Bob 收到兩個公用參數之後,他們會選取私用整數。Alice 選擇 a,而 Bob 選擇 b。這些值稱為私密金鑰。
Alice 和 Bob 接著會使用公用參數和私密金鑰建立公開金鑰。Alice 使用 (g^a) mod p,而 Bob 使用 (g^b) mod p。這些是非對稱金鑰,因為兩者不相符。
Alice 和 Bob 會交換這些公開金鑰,然後使用它們來計算共用密碼協議。ECDH 演算法則可保證 Alice 和 Bob 會計算出相同的共用密碼協議,雖然兩個人都不知道彼此的私密金鑰。
注意事項 |
---|
只有 a、b 和 g^ab = g^ba 會保密。所有其他值則都是公開的。 |
攔截交換的任何人將能夠複製 p、g 和兩個公開金鑰。不過,就計算上來說,在不知道 Alice 和 Bob 的私密金鑰的情況下,不可能從這四個公開共用值產生共用密碼協議。
強行 (即嘗試所有可能的金鑰) 解密 ECDH 所加密的訊息,難度與離散對數問題相當。不過,就算金鑰長度較短,ECDH 演算法也能達到相同程度的安全性,因為它依賴的是橢圓曲線,而非對數曲線。
ECDH 範例
下列範例使用小整數來示範 ECDH 演算法。
Alice 和 Bob 同意使用質數 p 和基底整數 g:
p = 83, g = 8
Alice 選擇密碼整數 a = 9,然後將 (g^a) mod p 傳送給 Bob:
(8^9) mod 83 = 5
Bob 選擇密碼整數 b = 21,然後將 (g^b) mod p 傳送給 Alice:
(8^21) mod 83 = 18
Alice 計算 ( ( (g^b) mod p)^a) mod p:
(18^9) mod 83 = 24
Bob 計算 ( ( (g^a) mod p)^b) mod p:
(5^21) mod 83 = 24
Alice 和 Bob 會計算出相同值 (24),因為 g^(ab) = g^(ba)。此值即為共用密碼協議。Alice 和 Bob 會使用此值來衍生金鑰內容,以供 AES 演算法用來加密其訊息。
這個範例會產生值為 24 的共用密碼協議。由於這個值很小,它所產生的加密訊息可能很容易被強行攻擊破解。在真實情況中,p、g、a 和 b 都是大上許多的數字,必須使用電腦來產生對應的共用密碼協議。
這個安全通訊範例使用的 CNG 類別擷取了複雜的數學運算。這些類別可讓您專心實作安全性方案,而無須擔心將大數字相乘。
通訊協定的限制
ECDH 金鑰交換通訊協定無法防止攔截式攻擊,因為它不會驗證公開金鑰的傳送者。如果竊聽者 Mallory 攔截 Alice 的公開金鑰,他可以用自己的公開金鑰取代之,然後傳送給 Bob。Mallory 也可以攔截 Bob 的公開金鑰,以自己的金鑰取代之,然後傳送給 Alice。這樣一來,Mallory 就可以很容易解密 Alice 和 Bob 之間傳送的任何訊息。他可以竄改訊息、用他自己的金鑰重新加密訊息,然後將訊息傳送給接收者。
為解決此問題,Alice 和 Bob 可以在交換公開金鑰之前,先使用數位簽章來簽署金鑰。執行這項作業的方法有兩種:
使用安全媒體 (如語音通訊或信任的信差) 在雙方之間傳送數位簽章金鑰。
使用公共憑證授權單位 (CA) 提供信任的數位簽章金鑰給雙方。
在上述兩種情況,必須使用外部驗證配置來驗證公開金鑰傳送者的身分。CNG 範例示範如果金鑰傳送者未經驗證,會發生什麼情況。這是特別撰寫來產生安全性弱點。
對稱金鑰和非對稱金鑰
非對稱系統 (如 ECDH) 的速度很慢。因此,不適合用來加密大型訊息。這時會改用速度快上許多倍的對稱系統,如 AES。
典型的密碼編譯方案會使用非對稱系統來衍生對稱共用密碼協議。接著再使用這個共用密碼協議衍生對稱演算法用來加密訊息的金鑰內容。
CNG 安全通訊範例示範此行為如下:
它使用非對稱演算法,也就是 ECDH 演算法的 CNG 實作 (ECDiffieHellmanCng 類別) 來衍生對稱加密金鑰 (共用密碼協議)。
CNG ECDiffieHellmanCng.DeriveKeyMaterial 方法接著使用這個金鑰來衍生金鑰內容。對稱 AES 演算法的 CNG 實作 (Aes 類別) 使用金鑰內容加密訊息。