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

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

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

BCryptExportKey
BCryptImportKey
BCryptEncrypt
BCryptDecrypt
BCryptSignHash
BCryptVerifySignature
BCryptSecretAgreement
BCryptDeriveKey

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

NCryptExportKey
NCryptImportKey
NCryptEncrypt
NCryptDecrypt
NCryptSignHash
NCryptVerifySignature
NCryptSecretAgreement
NCryptDeriveKey

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

2 ответов


на 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).


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

использовать NCrypt* функции при хранении ключа в KSP (Key Storage Provider).

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

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