Поделиться через


Типичное программирование CNG

API CNG реализует расширяемую модель поставщика, которая позволяет загрузить поставщика, указав необходимый алгоритм шифрования, а не конкретный поставщик. Преимущество заключается в том, что поставщик алгоритмов можно заменить или обновить, и вам не придется изменять код каким-либо образом для использования нового поставщика. Кроме того, если некоторый алгоритм определен как небезопасный в будущем, можно установить более безопасную версию этого алгоритма, не влияя на код. Большинству API CNG требуется поставщик или объект, созданный поставщиком.

Типичные шаги, связанные с использованием API CNG для криптографических примитивных операций, приведены ниже.

  1. Открытие поставщика алгоритмов
  2. Получение или настройка свойств алгоритма
  3. Создание или импорт ключа
  4. Выполнение криптографических операций
  5. Закрытие поставщика алгоритмов

Дополнительные сведения см. в разделе "Примеры программирования".

Открытие поставщика алгоритмов

Функция BCryptOpenAlgorithmProvider предоставляет обработчик алгоритма, который используется в последующих API CNG, например BCryptCreateHash или BCryptGenerateKeyPair.

Получение или настройка свойств алгоритма

Вы можете использовать дескриптор поставщика алгоритмов для получения сведений о реализации алгоритма, например размера ключа или текущего режима операции. Для получения определенных свойств использует ся функция BCryptGetProperty.

Вы также можете изменить свойства алгоритма. Например, если вы хотите использовать цепочку блочных шифров ECB с AES, задайте для свойства BCRYPT_CHAINING_MODE алгоритма AES значение BCRYPT_CHAIN_MODE_ECB; Свойство назначается всем ключам AES, созданным с помощью этого дескриптора алгоритма, без необходимости настраивать каждый ключ AES. Для изменения этих свойств используется функция BCryptSetProperty.

Создание или импорт ключа

В зависимости от типа используемого алгоритма может потребоваться создать или загрузить ключ. Например, функция BCryptEncrypt принимает дескриптор ключа для первого параметра. Если вы хотите, чтобы эта функция шифровывала данные с помощью алгоритма симметричного шифрования, например AES, сначала необходимо получить ключ. Получение ключа зависит от типа используемого алгоритма и источника ключа.

С помощью BCryptGenerateSymmetricKey можно создать временные ключи и функции BCryptGenerateKeyPair. Кроме того, можно импортировать временные ключи из БОЛЬШОго двоичного объекта памяти с помощью BCryptImportKey и функций BCryptImportKeyPairBCryptImportKeyPair.

Для сохраненных ключей можно использовать функции хранилища ключей для загрузки поставщика хранилища ключей, а затем создания или загрузки ключей. Эти функции также можно использовать для создания или загрузки временных ключей, передав NULL для всех имен контейнеров. Дополнительные сведения о функциях хранилища ключей см. в функциях хранилища ключей CNG.

Выполнение криптографических операций

Теперь вы готовы выполнить криптографическую операцию, например шифрование или расшифровку данных с помощью BCryptEncrypt или функций BCryptDecrypt соответственно.

Закрытие поставщика алгоритмов

Если поставщик больше не нужен, необходимо передать дескриптор функцию BCryptCloseAlgorithmProvider, чтобы закрыть поставщика. Это приводит к тому, что поставщик освобождает все ресурсы, выделенные для этого экземпляра поставщика алгоритмов. После закрытия дескриптора поставщика его нельзя повторно использовать.

Загрузка поставщика может быть относительно интенсивным процессом. Поэтому следует кэшировать все дескрипторы поставщика, которые будут ссылаться несколько раз в течение времени существования приложения.

Примеры программирования

В следующих примерах описывается выполнение определенных криптографических операций с помощью CNG.