Типичное программирование CNG
API CNG реализует расширяемую модель поставщика, которая позволяет загружать поставщика, указывая требуемый алгоритм шифрования, а не конкретный поставщик. Преимущество заключается в том, что поставщик алгоритмов можно заменить или обновить, и вам не придется изменять код каким-либо образом, чтобы использовать новый поставщик. Кроме того, если какой-то алгоритм будет определен как небезопасный в будущем, можно установить более безопасную версию этого алгоритма, не влияя на код. Для большинства API CNG требуется поставщик или объект, созданный поставщиком.
Ниже приведены типичные шаги, связанные с использованием API CNG для криптографических примитивных операций.
- Открытие поставщика алгоритмов
- Получение или настройка свойств алгоритма
- Создание или импорт ключа
- Выполнение криптографических операций
- Закрытие поставщика алгоритмов
Дополнительные сведения см. в разделе Примеры программирования.
Открытие поставщика алгоритмов
Функция BCryptOpenAlgorithmProvider предоставляет дескриптор поставщика алгоритма, который используется в последующих API CNG, таких как BCryptCreateHash или BCryptGenerateKeyPair.
Получение или настройка свойств алгоритма
Вы можете использовать дескриптор поставщика алгоритма для получения сведений о реализации алгоритма, таких как размер ключа или текущий режим работы. Для получения определенных свойств используется функция BCryptGetProperty .
Вы также можете изменить свойства алгоритма. Например, если вы хотите использовать цепочку блочных шифров ECB с AES, необходимо задать для свойства BCRYPT_CHAINING_MODE алгоритма AES значение BCRYPT_CHAIN_MODE_ECB. свойство назначается всем ключам AES, созданным с помощью этого дескриптора алгоритма, без необходимости настройки каждого ключа AES. Для изменения этих свойств используется функция BCryptSetProperty .
Создание или импорт ключа
В зависимости от типа используемого алгоритма может потребоваться создать или загрузить ключ. Например, функция BCryptEncrypt принимает дескриптор ключа для первого параметра. Если вы хотите, чтобы эта функция зашифровывала данные с помощью алгоритма симметричного шифрования, например AES, необходимо сначала получить ключ. Способ получения ключа зависит от типа используемого алгоритма и источника ключа.
Временные ключи можно создавать с помощью функций BCryptGenerateSymmetricKey и BCryptGenerateKeyPair . Вы также можете импортировать временные ключи из большого двоичного объекта памяти с помощью функций BCryptImportKey и BCryptImportKeyPair .
Для сохраненных ключей используйте функции хранилища ключей, чтобы загрузить поставщик хранилища ключей, а затем создать или загрузить ключи. Эти функции также можно использовать для создания или загрузки эфемерных ключей путем передачи null для любых имен контейнеров. Дополнительные сведения о функциях хранилища ключей см. в разделе Функции хранилища ключей CNG.
Выполнение криптографических операций
Теперь все готово для выполнения криптографической операции, например шифрования или расшифровки данных с помощью функций BCryptEncrypt или BCryptDecrypt соответственно.
Закрытие поставщика алгоритмов
Если поставщик больше не нужен, необходимо передать дескриптор функции BCryptCloseAlgorithmProvider , чтобы закрыть поставщик. Это приводит к тому, что поставщик освобождает все ресурсы, выделенные для этого экземпляра поставщика алгоритма. После закрытия дескриптора поставщика его нельзя использовать повторно.
Загрузка поставщика может быть относительно трудоемким процессом. Поэтому следует кэшировать все дескрипторы поставщика, на которые вы будете ссылаться несколько раз в течение времени существования приложения.
Примеры программирования
В следующих примерах описывается выполнение определенных криптографических операций с помощью CNG.