本文說明如何使用標準金鑰推導函數來推導金鑰,以及如何使用對稱與非對稱金鑰加密內容。
對稱金鑰
對稱金鑰加密,也稱為秘密金鑰加密,要求用於加密的金鑰同時也用於解密。 你可以使用 SymmetricKeyAlgorithmProvider 類別來指定對稱演算法,並建立或匯入金鑰。 你可以在 CryptographicEngine 類別上使用靜態方法,利用演算法和金鑰來加密和解密資料。
對稱密鑰加密通常使用區塊密碼和區塊密碼模式。 區塊密碼是一種對稱加密函數,作用於固定大小的區塊。 如果你想加密的訊息長度超過區塊長度,你必須使用區塊密碼模式。 區塊密碼模式是一種使用區塊密碼所建構的對稱加密函數。 它以一系列固定大小的區塊加密明文。 以下模式支援應用程式:
- ECB(電子密碼本)模式會分別加密訊息的每個區塊。 這不被視為安全的加密模式。
- CBC(密碼區塊鏈)模式利用先前的密文區塊來混淆當前區塊。 你必須決定第一個區塊要用什麼值。 此值稱為初始化向量(IV)。
- CCM(CBC-MAC計數器)模式結合了 CBC 區塊密碼模式與訊息認證碼(MAC)。
- GCM(伽羅瓦計數器模式)模式結合了計數器加密模式與伽羅瓦認證模式。
某些模式如 CBC 要求你對第一個密文區塊使用初始化向量(IV)。 以下是常見的初始化向量。 你在呼叫 CryptographicEngine.Encrypt 時指定 IV。 大多數情況下,IV絕不能用同一把鑰匙重複使用。
- Fixed 使用相同的 IV 來加密所有訊息。 這會洩漏資訊,且不建議使用。
- 計數器會增加每個方塊的 IV。
- 隨機產生偽隨機的初始化向量(IV)。 你可以用 CryptographicBuffer.GenerateRandom 來建立 IV。
- Nonce-Generated 為每則待加密的訊息使用唯一編號。 通常,nonce 是修改過的訊息或交易識別碼。 隨機數不必保密,但絕不應在使用相同的密鑰時重複使用。
大多數模式要求明文長度必須是區塊大小的整數倍。 這通常需要你填充明文以取得適當的長度。
區塊密碼加密固定大小的資料區塊,而串流密碼則是對稱加密函數,將明文位元與偽隨機位元流(稱為密鑰流)結合以產生密文。 某些區塊密碼模式,如輸出反饋模式(OTF)和計數器模式(CTR),實際上將區塊密碼轉化為串流密碼。 然而,像 RC4 這類實際串流密碼通常運作速度高於區塊密碼模式所能達到的。
以下範例展示了如何使用 SymmetricKeyAlgorithmProvider 類別來建立對稱金鑰,並用它來加密與解密資料。
非對稱鍵
非對稱金鑰密碼學,也稱為公鑰密碼學,利用公鑰與私密金鑰來執行加密與解密。 這些鍵不同,但數學上有關聯。 通常私鑰會被保密,用於解密資料,而公鑰則分發給相關方,並用於加密資料。 非對稱密碼學對於簽章資料也很有用。
由於非對稱密碼學的速度遠慢於對稱密碼學,因此很少用於直接加密大量資料。 相反地,它通常以以下方式來加密金鑰。
- 愛麗絲要求鮑伯只傳送加密訊息給她。
- Alice 建立一對私鑰和公鑰,將私鑰保密,並公開公鑰。
- 鮑勃有個訊息想傳達給愛麗絲。
- Bob 創造了一個對稱鍵。
- 鮑勃用他的新對稱金鑰加密了給愛麗絲的訊息。
- Bob 使用 Alice 的公開金鑰來加密他的對稱金鑰。
- Bob 將加密訊息與對稱加密金鑰封裝後傳送給 Alice。
- Alice 利用她的私鑰(來自私鑰/公鑰對)來解密 Bob 的對稱金鑰。
- 愛麗絲使用鮑勃的對稱金鑰解密訊息。
你可以使用 AsymmetricKeyAlgorithmProvider 物件來指定非對稱演算法或簽署演算法,建立或匯入臨時金鑰對,或匯入金鑰對的公鑰部分。
衍生金鑰
通常需要從共享秘密中推導出額外的金鑰。 你可以使用 KeyDerivationAlgorithmProvider 類別以及 KeyDerivationParameters 類別中的以下專門方法之一來推導金鑰。
| 物件 | 說明 |
|---|---|
| BuildForPbkdf2 | 建立一個用於密碼型金鑰導出函式 2(PBKDF2)的 KeyDerivationParameters 物件。 |
| BuildForSP800108 | 建立一個 KeyDerivationParameters 物件,用於以計數器模式運作的雜湊訊息驗證碼(HMAC)金鑰衍生函式。 |
| BuildForSP80056a | 建立一個用於 SP800-56A 金鑰導出函式的 KeyDerivationParameters 物件。 |