2016-11-14 3 views
7

В API Microsoft CNG (API криптографии: следующее поколение) есть два набора функций, которые, похоже, делают то же самое.CNG: Когда использовать семейство функций BCrypt * vs NCrypt *

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

BCryptExportKey 
BCryptImportKey 
BCryptEncrypt 
BCryptDecrypt 
BCryptSignHash 
BCryptVerifySignature 
BCryptSecretAgreement 
BCryptDeriveKey 

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

NCryptExportKey 
NCryptImportKey 
NCryptEncrypt 
NCryptDecrypt 
NCryptSignHash 
NCryptVerifySignature 
NCryptSecretAgreement 
NCryptDeriveKey 

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

ответ

10

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

+0

Со старым CSP было очень ограниченно и поэтому не было интуитивно понятным, но это как-то заставило сильного механизма хранения ключей. однако с хранилищем ключей NCrypt * немного странно! например, чтобы получить эфемерный ключ, вам все равно нужно позвонить в NCryptCreatePersistedKey. NCrypt каким-то образом пытается перенести память PKCS11, но на самом деле очень странным образом, который далек от интуитивного .. и, следовательно, подвержен ошибкам – Ibrahim

0

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

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

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

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