Typowe programowanie CNG
Interfejs API CNG implementuje rozszerzalny model dostawcy, który umożliwia załadowanie dostawcy przez określenie wymaganego algorytmu kryptograficznego, a nie określonego dostawcy. Zaletą jest to, że dostawca algorytmów może zostać zastąpiony lub uaktualniony i nie będzie trzeba zmieniać kodu w żaden sposób, aby korzystać z nowego dostawcy. Ponadto jeśli w przyszłości określony algorytm będzie niebezpieczny, można zainstalować bezpieczniejszą wersję tego algorytmu bez wpływu na kod. Większość interfejsów API CNG wymaga dostawcy lub obiektu utworzonego przez dostawcę.
Typowe kroki związane z używaniem interfejsu API CNG na potrzeby operacji pierwotnych kryptograficznych są następujące:
- Otwieranie dostawcy algorytmów
- Pobieranie lub ustawianie właściwości algorytmu
- Tworzenie lub importowanie klucza
- Wykonywanie operacji kryptograficznych
- Zamykanie dostawcy algorytmów
Aby uzyskać więcej informacji, zobacz Przykłady programowania.
Otwieranie dostawcy algorytmów
Funkcja BCryptOpenAlgorithmProvider udostępnia dojście dostawcy algorytmów używane w kolejnych interfejsach API CNG, takich jak BCryptCreateHash lub BCryptGenerateKeyPair.
Pobieranie lub ustawianie właściwości algorytmu
Możesz użyć uchwytu dostawcy algorytmów, aby uzyskać szczegóły implementacji algorytmu, takie jak rozmiar klucza lub bieżący tryb operacji. Aby uzyskać określone właściwości, należy użyć funkcji BCryptGetProperty.
Można również zmodyfikować właściwości algorytmu. Jeśli na przykład chcesz użyć łańcucha szyfrowania blokowego EBC w usłudze AES, ustaw właściwość BCRYPT_CHAINING_MODE algorytmu AES na BCRYPT_CHAIN_MODE_ECB; właściwość jest przypisywana do wszystkich kluczy AES utworzonych przy użyciu tego uchwytu algorytmu bez konieczności konfigurowania każdego i każdego klucza AES. Aby zmodyfikować te właściwości, należy użyć funkcji BCryptSetProperty.
Tworzenie lub importowanie klucza
W zależności od typu używanego algorytmu może być konieczne utworzenie lub załadowanie klucza. Na przykład funkcja BCryptEncrypt przyjmuje dojście klucza dla pierwszego parametru. Jeśli chcesz, aby ta funkcja szyfrować dane za pomocą algorytmu szyfrowania symetrycznego, takiego jak AES, musisz najpierw uzyskać klucz. Sposób uzyskiwania klucza zależy od typu używanego algorytmu i źródła klucza.
Klucze efemeryczne można tworzyć za pomocą funkcji BCryptGenerateSymmetricKey i BCryptGenerateKeyPair. Możesz również zaimportować klucze efemeryczne z obiektu BLOB pamięci za pomocą funkcji BCryptImportKey i BCryptImportKeyPa ir.
W przypadku trwałych kluczy należy użyć funkcji magazynu kluczy do załadowania dostawcy magazynu kluczy, a następnie utworzyć lub załadować klucze. Za pomocą tych funkcji można również tworzyć lub ładować klucze efemeryczne, przekazując NULL dla dowolnych nazw kontenerów. Aby uzyskać więcej informacji na temat funkcji magazynu kluczy, zobacz funkcji magazynu kluczy CNG.
Wykonywanie operacji kryptograficznych
Teraz możesz przystąpić do wykonywania operacji kryptograficznych, takich jak szyfrowanie lub odszyfrowywanie danych przy użyciu odpowiednio funkcji BCryptEncrypt lub funkcji BCryptDecrypt.
Zamykanie dostawcy algorytmów
Gdy dostawca nie jest już potrzebny, należy przekazać dojście do funkcji BCryptCloseAlgorithmProvider, aby zamknąć dostawcę. Powoduje to, że dostawca zwolni wszelkie zasoby przydzielone dla tego wystąpienia dostawcy algorytmu. Po zamknięciu dojścia dostawcy nie można go ponownie użyć.
Ładowanie dostawcy może być stosunkowo czasochłonnym procesem. W związku z tym należy buforować wszystkie dojścia dostawcy, które będą się odwoływać wielokrotnie w okresie istnienia aplikacji.
Przykłady programowania
W poniższych przykładach opisano sposób wykonywania określonych operacji kryptograficznych przy użyciu CNG.