密碼編譯金鑰

本文說明如何使用標準金鑰衍生函式來衍生金鑰,以及如何使用對稱和非對稱金鑰來加密內容。

對稱金鑰

對稱金鑰加密也稱為秘密金鑰加密,要求用於加密的金鑰也用於解密。 您可以使用 SymmetricKeyAlgorithmProvider 類別指定對稱演算法並建立或匯入密鑰。 您可以使用 CryptographicEngine 類別上的靜態方法透過演算法和金鑰來加密和解密資料。

對稱金鑰加密通常使用分組密碼和分組密碼模式。 分組密碼是一種對固定大小的區塊進行操作的對稱加密函數。 如果要加密的訊息比區塊長度長,則必須使用區塊密碼模式。 分組密碼模式是利用分組密碼建構的對稱加密函數。 它將明文加密為一系列固定大小的區塊。 應用程式支援以下模式:

  • ECB (電子密碼本) 模式分別對訊息的每個區塊進行加密。 這不被視為安全加密模式。
  • CBC (密碼區塊鏈) 模式使用先前的密文塊來混淆目前區塊。 您必須確定第一個區塊使用什麼值。 該值稱為初始化向量 (IV)。
  • CCM (附 CBC-MAC 的計數器) 模式將 CBC 分組密碼模式與訊息驗證碼 (MAC) 結合。
  • GCM (Galois counter mode) 模式將計數器加密模式與 Galois 認證模式結合。

某些模式 (例如 CBC) 要求您對第一個密文區塊使用初始化向量 (IV)。 以下是常見的初始化向量。 您在呼叫 CryptographicEngine.Encrypt 時指定 IV。 對於大多數情況,重要的是 IV 永遠不要與相同的金鑰重複使用。

  • 固定對所有要加密的訊息使用相同的 IV。 這會洩露訊息,不建議使用。
  • 計數器會遞增每個區塊的 IV。
  • 隨機建立一個偽隨機 IV。 您可以使用 CryptographicBuffer.GenerateRandom 來建立 IV。
  • Nonce-Generator 對每個要加密的訊息使用唯一的編號。 通常,隨機數是修改後的訊息或事務標識符。 隨機數不必保密,但絕不能在同一密鑰下重複使用。

大多數模式要求明文的長度是區塊大小的精確倍數。 這通常需要您填充明文以獲得適當的長度。

分組密碼加密固定大小的資料區塊,而流密碼是對稱加密函數,它將明文位元與偽隨機位元串流 (稱為密鑰串流) 組合起來產生密文。 一些分組密碼模式,例如輸出回饋模式 (OTF) 和計數器模式 (CTR),可以有效地將分組密碼轉換為流密碼。 然而,諸如 RC4 之類的實際流密碼通常以比分組密碼模式能夠實現的速度更高的速度執行。

下列範例示範如何使用 SymmetricKeyAlgorithmProvider 類別來建立對稱密鑰,並使用它來加密和解密數據。

非對稱金鑰

非對稱金鑰密碼術也稱為公鑰密碼術,使用公鑰和私鑰來執行加密和解密。 金鑰不同,但在數學上相關。 通常,私鑰是保密的並用於解密資料,而公鑰則分發給感興趣的各方並用於加密資料。 非對稱加密對於資料簽章也很有用。

由於非對稱加密比對稱加密慢得多,因此很少用於直接加密大量資料。 相反,它通常按以下方式使用來加密金鑰。

  • Alice 要求 Bob 只傳送加密的訊息。
  • Alice 建立私鑰/公鑰對,保密她的私鑰並發布她的公鑰。
  • Bob 有一則他想要傳送給 Alice 的訊息。
  • Bob 建立一個對稱金鑰。
  • Bob 使用他新的對稱密鑰,將訊息加密給 Alice。
  • Bob 會使用 Alice 的公鑰來加密他的對稱金鑰。
  • Bob 將加密的訊息和加密的對稱金鑰傳送給 Alice (已封裝)。
  • Alice 使用她的私鑰 (來自於自私鑰/公鑰對) 來解密 Bob 的對稱金鑰。
  • Alice 使用 Bob 的對稱金鑰來解密該訊息。

您可以使用 AmetryKeyAlgorithmProvider 物件指定非對稱演算法或簽章演算法、建立或匯入臨時金鑰對,或匯入金鑰對的公鑰部分。

衍生金鑰

通常需要從共用秘密中衍生額外的金鑰。 您可以使用 KeyDerivationAlgorithmProvider 類別和 KeyDerivationParameters 類別中的以下專用方法之一來衍生金鑰。

Object 描述
BuildForPbkdf2 建立一個 KeyDerivationParameters 物件以在基於密碼的金鑰衍生函數 2 (PBKDF2) 中使用。
BuildForSP800108 建立一個 KeyDerivationParameters 對象,用於計數器模式、基於雜湊的訊息驗證碼 (HMAC) 金鑰衍生函數。
BuildForSP80056a 建立 KeyDerivationParameters 物件,以用於 SP800-56A 密鑰衍生函式。