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*
обычно используется как для асимметричных, так и для симметричных алгоритмов.