共用方式為


一般 CNG 程式設計

CNG API 會實作可延伸的提供者模型,讓您藉由指定必要的密碼編譯演算法而非特定提供者來載入提供者。 優點是演算法提供者可以取代或升級,而且您不需要以任何方式變更程式代碼才能使用新的提供者。 此外,如果某些演算法在未來判斷為不安全,則可以安裝更安全版本的演算法,而不會影響您的程序代碼。 大部分的 CNG API 都需要提供者或提供者所建立的物件。

針對密碼編譯基本作業使用 CNG API 所涉及的一般步驟如下:

  1. 開啟演算法提供者
  2. 取得或設定演算法屬性
  3. 建立或匯入金鑰
  4. 執行密碼編譯作業
  5. 關閉演算法提供者

如需詳細資訊,請參閱程序設計範例。

開啟演算法提供者

BCryptOpenAlgorithmProvider 函式會提供在後續 CNG API 中使用的演算法提供者句柄,例如 BCryptCreateHashBCryptGenerateKeyPair

取得或設定演算法屬性

您可以使用演算法提供者句柄來取得演算法的實作詳細數據,例如密鑰大小或目前的作業模式。 您可以使用 BCryptGetProperty 函式來取得特定屬性。

您也可以修改演算法的屬性。 例如,如果您想要搭配 AES 使用 ECB 區塊加密鏈結,請將 AES 演演算法的 BCRYPT_CHAINING_MODE 屬性設定為 BCRYPT_CHAIN_MODE_ECB;屬性會指派給使用此演算法句柄建立的所有 AES 金鑰,而不需要設定每個和每個 AES 金鑰。 您可以使用 BCryptSetProperty 函式來修改這些屬性。

建立或匯入金鑰

視您使用的演算法類型而定,您可能需要建立或載入金鑰。 例如,BCryptEncrypt 函式會接受第一個參數的索引鍵句柄。 如果您希望該函式使用 AES 等對稱加密演算法來加密資料,您必須先取得金鑰。 取得金鑰的方式取決於所使用的演算法類型,以及金鑰的來源。

您可以使用 BCryptGenerateSymmetricKeyBCryptGenerateKeyPair 函式來建立暫時密鑰。 您也可以使用 BCryptImportKeyBCryptImportKeyPair 函式,從記憶體 BLOB 匯入暫時密鑰。

針對保存的金鑰,您可以使用金鑰儲存函式來載入金鑰儲存提供者,然後建立或載入金鑰。 您也可以使用這些函式來建立或載入暫時密鑰,方法是針對任何容器名稱傳遞 NULL。 如需金鑰儲存函式的詳細資訊,請參閱 CNG 金鑰儲存函式

執行密碼編譯作業

您現在已準備好執行密碼編譯作業,例如分別使用 BCryptEncryptBCryptDecrypt 函式來加密或解密數據。

關閉演算法提供者

不再需要提供者時,您必須將句柄傳遞至 BCryptCloseAlgorithmProvider 函式以關閉提供者。 這會導致提供者釋放已配置給該演算法提供者實例的任何資源。 在提供者句柄關閉之後,就無法重複使用。

載入提供者可能相當耗時的程式。 因此,您應該快取將在應用程式存留期內多次參考的任何提供者句柄。

程序設計範例

下列範例說明如何使用 CNG 執行特定的密碼編譯作業。