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