Typisk CNG-programmering
CNG-API:et implementerar en utökningsbar providermodell som gör att du kan läsa in en provider genom att ange den krypteringsalgoritm som krävs i stället för en viss provider. Fördelen är att en algoritmprovider kan ersättas eller uppgraderas och du behöver inte ändra koden på något sätt för att använda den nya providern. Om en algoritm bedöms vara osäker i framtiden kan en säkrare version av algoritmen installeras utan att din kod påverkas. De flesta CNG-API:er kräver en provider eller ett objekt som skapats av en provider.
De vanliga stegen för att använda CNG-API:et för kryptografiska primitiva åtgärder är följande:
- Öppna algoritmprovidern
- Hämta eller ange algoritmegenskaper
- Skapa eller importera en nyckel
- Utföra kryptografiska åtgärder
- Stänga algoritmprovidern
Mer information finns i Programmeringsexempel.
Öppna algoritmprovidern
Funktionen BCryptOpenAlgorithmProvider ger dig ett algoritmproviderhandtag som används i efterföljande CNG-API:er, till exempel BCryptCreateHash eller BCryptGenerateKeyPair.
Hämta eller ange algoritmegenskaper
Du kan använda algoritmproviderns handtag för att hämta implementeringsinformation för algoritmen, till exempel nyckelstorleken eller det aktuella driftläget. Du använder funktionen BCryptGetProperty för att hämta specifika egenskaper.
Du kan också ändra algoritmens egenskaper. Om du till exempel vill använda ECB-block chifferlänkning med AES anger du egenskapen BCRYPT_CHAINING_MODE för en AES-algoritm till BCRYPT_CHAIN_MODE_ECB. egenskapen tilldelas till alla AES-nycklar som skapats med hjälp av det här algoritmhandtaget, utan att du behöver konfigurera varje AES-nyckel. Du använder funktionen BCryptSetProperty för att ändra dessa egenskaper.
Skapa eller importera en nyckel
Beroende på vilken typ av algoritm du använder kan du behöva skapa eller läsa in en nyckel. Till exempel tar funktionen BCryptEncrypt ett nyckelhandtag för den första parametern. Om du vill att funktionen ska kryptera data med en symmetrisk krypteringsalgoritm, till exempel AES, måste du först skaffa en nyckel. Hur du hämtar nyckeln beror på vilken typ av algoritm som används och källan till nyckeln.
Du kan skapa tillfälliga nycklar med funktionerna BCryptGenerateSymmetricKey och BCryptGenerateKeyPair. Du kan också importera tillfälliga nycklar från en minnesblob med funktionerna BCryptImportKey och BCryptImportKeyPair.
För beständiga nycklar använder du nyckellagringsfunktionerna för att läsa in en nyckellagringsprovider och sedan skapa eller läsa in nycklarna. Du kan också använda dessa funktioner för att skapa eller läsa in tillfälliga nycklar genom att skicka NULL- för alla containernamn. Mer information om viktiga lagringsfunktioner finns i CNG Key Storage Functions.
Utföra kryptografiska åtgärder
Nu är du redo att utföra den kryptografiska åtgärden, till exempel kryptering eller dekryptering av data med hjälp av BCryptEncrypt eller BCryptDecrypt funktioner.
Stänga algoritmprovidern
När providern inte längre behövs måste du skicka handtaget till funktionen BCryptCloseAlgorithmProvider för att stänga providern. Detta gör att providern släpper alla resurser som har allokerats för den algoritmproviderinstansen. När en providerreferens har stängts kan den inte återanvändas.
Att läsa in en provider kan vara en relativt tidsintensiv process. Du bör därför cachelagrar alla providerreferenser som du kommer att referera till flera gånger under programmets livslängd.
Programmeringsexempel
I följande exempel beskrivs hur du utför specifika kryptografiska åtgärder med hjälp av CNG.