產生加密和解密金鑰

建立和管理金鑰是密碼編譯程序中很重要的一部分。 對稱演算法需要建立金鑰和初始化向量 (IV)。 您必須將此金鑰秘密對任何不應該解密資料的人員保密。 初始化向量 (IV) 不一定是秘密,但應該變更每個工作階段。 非對稱演算法需要建立公開金鑰和私密金鑰。 公開金鑰可以讓任何人知道,但解密方只能知道對應的私密金鑰。 本節描述如何產生及管理對稱和非對稱演算法的金鑰。

對稱金鑰

.NET 所提供的對稱加密類別需要一個金鑰和新的 IV 才能加密和解密資料。 當您使用無參數 Create() 方法建立其中一個 Managed 對稱密碼編譯類別的新執行個體時,便會自動建立新的金鑰和 IV。 您允許解密資料的任何人都必須擁有相同的金鑰和 IV,並使用相同的演算法。 一般而言,應該為每個工作階段建立新的金鑰和 IV,且金鑰和 IV 都不應該儲存以用於稍後的工作階段。

若要與遠端的一方溝通對稱金鑰和 IV,通常會使用非對稱加密來加密對稱金鑰。 在不安全的網路中傳送未加密的金鑰並不安全,因為任何人只要攔截金鑰和 IV,就可以解密您的資料。

下列範例顯示如何建立預設實作 Aes 類別演算法的新執行個體:

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

執行上述程式碼會產生新的金鑰和 IV,並分別將其設定為 KeyIV 屬性的值。

有時候您可能需要產生多個金鑰。 在此情況下,您可以建立實作對稱演算法類別的新執行個體。 然後,藉由呼叫 GenerateKeyGenerateIV 方法來建立新的金鑰和 IV。 下列程式碼範例說明在建立非對稱密碼編譯類別的新執行個體之後,如何建立新的金鑰和 IV:

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

執行上述程式碼會建立新的 Aes 執行個體,並產生金鑰和 IV。 呼叫 GenerateKeyGenerateIV 方法時,會建立另一個金鑰和 IV。

非對稱金鑰

.NET 提供非對稱加密的 RSA 類別。 當您使用無參數 Create() 方法來建立新的執行個體時,RSA 類別會建立公開/私密金鑰組。 非對稱金鑰可以儲存以用於多個工作階段,或只針對一個工作階段而產生。 雖然您可以讓公開金鑰可供使用,但必須密切保護私密金鑰。

每當您建立非對稱式演算法類別的新執行個體時,就會產生公開/私密金鑰組。 建立類別的新執行個體之後,您可以使用 ExportParameters 方法來擷取金鑰資訊。 此方法會傳回保存金鑰資訊的 RSAParameters 結構。 此方法也接受布林值,表示是否只傳回公用金鑰資訊,還是同時傳回公開金鑰和私密金鑰資訊。

您也可以使用其他方法來擷取金鑰資訊,例如:

您可以使用 ImportParameters 方法,將 RSA 執行個體初始化為 RSAParameters 結構的值。 或者,您可以使用 RSA.Create(RSAParameters) 方法來建立新的執行個體。

絕對不要在本機電腦上逐字儲存非對稱私密金鑰或純文字。 如果您需要儲存私密金鑰,必須使用金鑰容器。 如需如何將私密金鑰儲存到金鑰容器中的詳細資訊,請參閱如何:將對稱金鑰儲存在金鑰容器中

下列程式碼範例會建立 RSA 類別的新執行個體、建立公開/私密金鑰組,並將公開金鑰資訊儲存至 RSAParameters 結構:

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

另請參閱