В 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
В чем разница между этими двумя наборами функций и когда каждый из них должен использоваться?
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 (поставщик хранилища ключей).
NCrypt*
Функции выполняют много дополнительной работы и менее эффективны, поэтому, если вы не храните ключ в KSP, лучше использовать BCrypt*
функции.
Поскольку большинство долгосрочных хранимых ключей являются асимметричными (RSA, ECDSA, …) ключами, NCrypt*
функции чаще используются с асимметричными алгоритмами. BCrypt*
обычно используется как для асимметричных, так и для симметричных алгоритмов.