BCrypt
семейство функции классифицируются как Cryptographic Primitives, в то время как NCrypt
семейство функций классифицируются как Key Storage and Retrieval.
Основное отличие состоит в том, что функции 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
(есть определения типов в месте, определенные в encryption.h
, чтобы функции в этом файле для реализации общего применения чтобы разрешить использование других криптографических библиотек, таких как CryptoAPI и OpenSSL).
Со старым CSP было очень ограниченно и поэтому не было интуитивно понятным, но это как-то заставило сильного механизма хранения ключей. однако с хранилищем ключей NCrypt * немного странно! например, чтобы получить эфемерный ключ, вам все равно нужно позвонить в NCryptCreatePersistedKey. NCrypt каким-то образом пытается перенести память PKCS11, но на самом деле очень странным образом, который далек от интуитивного .. и, следовательно, подвержен ошибкам – Ibrahim