2016-11-14 39 views
7

W Microsoft CNG API (Cryptography API: Next Generation) istnieją dwa zestawy funkcji, które wydają się robić to samo.CNG: Kiedy używać funkcji BCrypt * vs NCrypt * rodziny funkcji

poniższych funkcji zacząć BCrypt i wykonać klucz import/eksport, szyfrowanie/deszyfrowanie, znak/sprawdzenia i Diffe-Helman wymiana kluczy

BCryptExportKey 
BCryptImportKey 
BCryptEncrypt 
BCryptDecrypt 
BCryptSignHash 
BCryptVerifySignature 
BCryptSecretAgreement 
BCryptDeriveKey 

Ale ten sam zestaw funkcji istnieć które zaczynają się NCrypt:

NCryptExportKey 
NCryptImportKey 
NCryptEncrypt 
NCryptDecrypt 
NCryptSignHash 
NCryptVerifySignature 
NCryptSecretAgreement 
NCryptDeriveKey 

Jaka jest różnica między tymi dwoma zestawami funkcji i kiedy należy je stosować?

Odpowiedz

10

Rodzina funkcji BCrypt są klasyfikowane jako Cryptographic Primitives, natomiast rodzina funkcji NCrypt są klasyfikowane jako Key Storage and Retrieval.

Podstawową różnicą jest to, że funkcje BCrypt używane są tylko w przypadku kluczy efemerycznych, natomiast funkcje NCrypt są używane, gdy wymagane są klucze trwałe.

W praktyce funkcje BCrypt są typowo wykorzystywane do mieszaja i szyfrowania symetrycznego, natomiast funkcje NCrypt są wykorzystywane do szyfrowania kluczy publiczny/prywatny i deszyfrowania, podpisywania kluczy publicznych/prywatnych i weryfikacji i wspólne hasło (np DH i ECDH) negocjacje.

Chociaż niektóre operacje klucza publicznego/prywatnego można wykonywać za pomocą funkcji BCrypt, mogą one być używane tylko z kluczami efemerycznymi i dlatego są ograniczone w użyciu.

Klucze trwałe są przechowywane w kontenerach kluczy specyficznych dla każdego użytkownika (lub systemu). Jest to środek bezpieczeństwa zapewniający, że użytkownicy nie będą mogli przeglądać swoich prywatnych kluczy.

Generalnie, będziemy chcieli, aby korzystać z następujących funkcji dla następujących operacji:

  • BCryptHashData: Służy do mieszaja i HMAC (MD5, SHA1, SHA256, SHA384, SHA512)
    • powiązane: BCryptCreateHash, BCryptFinishHash, BCryptDestroyHash
  • BCryptEncrypt: symetryczny klucz szyfrowania (DES, 3DES, AES).
    • pokrewne: BCryptGenerateSymmetricKey, BCryptDestroyKey
  • BCryptDecrypt: Symetryczny klucz szyfrowania (DES, 3DES, AES).
    • pokrewne: BCryptGenerateSymmetricKey, BCryptDestroyKey
  • NCryptEncrypt: Asymetryczny klucz szyfrowania (RSA)
  • NCryptDecrypt: Asymetryczny klucz szyfrowania (RSA)
  • NCryptSignHash: podpis klucz Asymetric (RSA, DSA, ECDSA)
  • NCryptVerifySignature: Asymetryczna weryfikacja podpisu klucza (RSA, DSA, ECDSA)
  • NCryptSecretAgreement: Asymetryczny klucz dzielenie sekretu (DH, ECDH)
    • pokrewne: NCryptDeriveKey

Przykładami są dostępne w MSDN dla wielu z tych przypadków.

Dla prawdziwego przykład światowej, I zostały wdrożone wszystkie z nich w kodzie źródłowym UFTP, a konkretnie plik encrypt_cng.c (istnieją typedefs na miejscu, określone w encryption.h, aby umożliwić funkcjonowanie w tym pliku realizować wspólną aplikację poziom interfejsu API, aby umożliwić korzystanie z innych bibliotek kryptograficznych, takich jak CryptoAPI i OpenSSL).

+0

Ze starym CSP był bardzo ograniczony, a więc nie intuicyjny, ale w jakiś sposób wymusił silny mechanizm przechowywania kluczy. jednak z kluczem NCrypt * pamięć jest trochę dziwna! na przykład, aby uzyskać efemeryczny klucz, musisz zadzwonić do NCryptCreatePersistedKey .. NCrypt w jakiś sposób próbuje zapamiętać PKCS11, ale naprawdę w bardzo dziwny sposób, który jest daleki od intuicyjnego ... iw konsekwencji podatny na błędy – Ibrahim

0

Użyj funkcji BCrypt*, gdy masz klucz w pamięci swojej aplikacji.

Użyj funkcji NCrypt* podczas przechowywania klucza w KSP (Key Storage Provider).

NCrypt* funkcje zrobić wiele dodatkowej pracy i są mniej wydajne, więc jeśli nie są przechowywane klucz w KSP lepiej jest użyć funkcji BCrypt*.

Ponieważ większość długoterminowych zapisanych kluczy to klucze asymetryczne (RSA, ECDSA, ...), funkcje są częściej używane z algorytmami asymetrycznymi. BCrypt* jest powszechnie stosowany zarówno w algorytmach asymetrycznych, jak i symetrycznych.