共用方式為


一般 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 執行特定的密碼編譯作業。