CNG: когда использовать семейство функций BCrypt * против NCrypt *

В Microsoft CNG API (Cryptography API: Next Generation) есть два набора функций, которые выполняют одно и то же действие.

Следующие функции начинаются с BCrypt и выполнять импорт / экспорт ключей, шифрование / дешифрование, подпись / проверку и обмен ключами Dif-Helman

BCryptExportKey
BCryptImportKey
BCryptEncrypt
BCryptDecrypt
BCryptSignHash
BCryptVerifySignature
BCryptSecretAgreement
BCryptDeriveKey

Но существует тот же набор функций, которые начинаются с NCrypt:

NCryptExportKey
NCryptImportKey
NCryptEncrypt
NCryptDecrypt
NCryptSignHash
NCryptVerifySignature
NCryptSecretAgreement
NCryptDeriveKey

В чем разница между этими двумя наборами функций и когда каждый из них должен использоваться?

10

Решение

BCrypt Семейство функций классифицируются как Криптографические примитивы, в то время как NCrypt Семейство функций классифицируется как Хранение и поиск ключей.

Основное отличие состоит в том, что BCrypt функции используются только при работе с эфемерными клавишами, а NCrypt Функции используются, когда требуются постоянные ключи.

На практике BCrypt функции обычно используются для хеширования и симметричного шифрования, а NCrypt функции используются для шифрования и дешифрования открытого / секретного ключа, подписи и проверки открытого / секретного ключа и согласования общего секрета (например, DH и ECDH).

Хотя некоторые операции с открытым / закрытым ключом могут быть выполнены с BCrypt функции, они могут использоваться только с эфемерными клавишами и поэтому имеют ограниченное использование.

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

В общем, вы хотите использовать следующие функции для следующих операций:

  • BCryptHashData: Используется для хеширования и HMAC (MD5, SHA1, SHA256, SHA384, SHA512)
    • Связанные с: BCryptCreateHash, BCryptFinishHash, BCryptDestroyHash
  • BCryptEncrypt: Симметричный ключ шифрования (DES, 3DES, AES).
    • Связанные с: BCryptGenerateSymmetricKey, BCryptDestroyKey
  • BCryptDecrypt: Дешифрование симметричного ключа (DES, 3DES, AES).
    • Связанные с: BCryptGenerateSymmetricKey, BCryptDestroyKey
  • NCryptEncrypt: Шифрование асимметричного ключа (RSA)
  • NCryptDecrypt: Расшифровка асимметричного ключа (RSA)
  • NCryptSignHash: Асимметричная подпись ключа (RSA, DSA, ECDSA)
  • NCryptVerifySignature: Проверка подписи асимметричного ключа (RSA, DSA, ECDSA)
  • NCryptSecretAgreement: Совместное использование секретного асимметричного ключа (DH, ECDH)
    • Связанные с: NCryptDeriveKey

Примеры доступны на MSDN для нескольких из этих случаев.

Для примера из реального мира я реализовал все это в UFTP исходный код, а именно encrypt_cng.c file (есть typedefs на месте, определенные в encryption.h, чтобы позволить функциям в этом файле реализовать общий API уровня приложения, чтобы разрешить использование других криптографических библиотек, таких как CryptoAPI и OpenSSL).

16

Другие решения

использование BCrypt* функции, когда у вас есть ключ в памяти вашего приложения.

использование NCrypt* функции, когда вы храните ключ в KSP (поставщик хранилища ключей).

NCrypt* Функции выполняют много дополнительной работы и менее эффективны, поэтому, если вы не храните ключ в KSP, лучше использовать BCrypt* функции.

Поскольку большинство долгосрочных хранимых ключей являются асимметричными (RSA, ECDSA, …) ключами, NCrypt* функции чаще используются с асимметричными алгоритмами. BCrypt* обычно используется как для асимметричных, так и для симметричных алгоритмов.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector