產生加密和解密金鑰
更新:2007 年 11 月
建立和管理金鑰是密碼編譯處理中重要的一部分。對稱演算法需要建立金鑰和初始化向量 (IV),而這兩者必須對任何不應解密您資料的人保密。非對稱演算法也需要建立公開金鑰和私密金鑰。公開金鑰可對任何人公開,但私密金鑰僅能提供給將使用公開金鑰加密的資料解密的一方。本章節說明如何針對對稱和非對稱演算法來產生和管理金鑰。
對稱金鑰
.NET Framework 所提供的對稱加密類別需要金鑰和新的初始化向量 (IV) 來加密和解密資料。每當您使用預設建構函式 (Constructor) 建立其中一個 Managed 對稱密碼編譯類別的新執行個體時,就會自動建立新的金鑰和 IV。您允許能夠解密資料的人,都必須擁有相同的金鑰和 IV,並使用相同的演算法。一般而言,應針對每一工作階段建立新的金鑰和 IV,並且不論是金鑰或 IV 都不應儲存供稍後的工作階段使用。
若要與遠端的一方溝通對稱金鑰和 IV,通常會使用非對稱加密來加密對稱金鑰和 IV。沒有加密就在不安全的網路上傳送這些值是十分不安全的行為,因為任何人只要攔截到這些值就可以解密您的資料。如需這種加密及傳輸金鑰和 IV 之處理方式的詳細資訊,請參閱建立密碼編譯配置。
下列範例顯示如何建立 TripleDESCryptoServiceProvider 類別的新執行個體,這個執行個體會實作 TripleDES 演算法。
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
在執行前述的程式碼時,產生了新的金鑰和 IV 並分別放置到 Key 和 IV 屬性中。
有時您可能需要產生多個金鑰。在這種情況下,您可以建立實作對稱演算法的新類別執行個體,然後藉由呼叫 GenerateKey 和 GenerateIV 方法來建立新的金鑰和 IV。以下程式碼範例說明如何在產生非對稱密碼編譯類別的新執行個體後,建立新的金鑰和 IV。
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.GenerateIV();
TDES.GenerateKey();
在執行前述的程式碼時,會在建立 TripleDESCryptoServiceProvider 的新執行個體時產生金鑰和 IV。另一個金鑰和 IV 則在呼叫 GenerateKey 和 GenerateIV 方法時建立。
非對稱金鑰
.NET Framework 提供 RSACryptoServiceProvider 和 DSACryptoServiceProvider 類別進行非對稱加密。當您使用預設建構函式來建立新的執行個體時,這些類別會建立公開/私密金鑰組。非對稱金鑰可儲存起來以供多個工作階段使用,或是僅針對某一工作階段而產生。公開金鑰可廣泛地供人使用,但私密金鑰則應該嚴密地加以保護。
每當建立非對稱演算法類別的新執行個體時,就會產生公開/私密金鑰組。建立了類別的新執行個體之後,就可以使用下列任何一種方法來擷取金鑰資訊:
ToXMLString 方法,可傳回金鑰資訊的 XML 表示。
ExportParameters 方法,可傳回保留金鑰資訊的 RSAParameters 結構。
這兩種方法都接受一個表示是否只要傳回公開金鑰資訊、或者要同時傳回公開和私密金鑰資訊的布林值 (Boolean)。使用 ImportParameters 方法,可將 RSACryptoServiceProvider 類別初始化為 RSAParameters 結構的值。
非對稱私密金鑰絕對不應一字不漏或以純文字格式儲存在本機電腦中。如果您需要儲存私密金鑰,您應該使用金鑰容器。如需如何將私密金鑰存放在金鑰容器中的詳細資訊,請參閱 HOW TO:將對稱金鑰儲存在金鑰容器中。
以下程式碼範例建立 RSACryptoServiceProvider 類別的新執行個體、建立公開/私密金鑰組,並將公開金鑰資訊儲存至 RSAParameters 結構。
'Generate a public/private key pair.
Dim RSA as RSACryptoServiceProvider = new RSACryptoServiceProvider()
'Save the public key information to an RSAParameters structure.
Dim RSAKeyInfo As RSAParameters = RSA.ExportParameters(false)
//Generate a public/private key pair.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Save the public key information to an RSAParameters structure.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);