Programmazione CNG tipica
L'API CNG implementa un modello di provider estendibile che consente di caricare un provider specificando l'algoritmo di crittografia richiesto anziché un provider specifico. Il vantaggio è che un provider di algoritmi può essere sostituito o aggiornato e non sarà necessario modificare il codice in alcun modo per usare il nuovo provider. Inoltre, se un algoritmo è determinato come non sicuro in futuro, è possibile installare una versione più sicura di tale algoritmo senza influire sul codice. La maggior parte delle API CNG richiede un provider o un oggetto creato da un provider.
I passaggi tipici relativi all'uso dell'API CNG per le operazioni di primitiva crittografica sono i seguenti:
- Apertura del provider di algoritmi
- Recupero o impostazione delle proprietà dell'algoritmo
- Creazione o importazione di una chiave
- Esecuzione di operazioni di crittografia
- Chiusura del provider di algoritmi
Per altre informazioni, vedere Esempi di programmazione.
Apertura del provider di algoritmi
La funzione BCryptOpenAlgorithmProvider fornisce un handle del provider di algoritmi usato nelle API CNG successive, ad esempio BCryptCreateHash o BCryptGenerateKeyPair.
Recupero o impostazione delle proprietà dell'algoritmo
È possibile usare l'handle del provider di algoritmi per ottenere i dettagli di implementazione per l'algoritmo, ad esempio le dimensioni della chiave o la modalità corrente dell'operazione. Usare la funzione BCryptGetProperty per ottenere proprietà specifiche.
È anche possibile modificare le proprietà dell'algoritmo. Ad esempio, se si desidera utilizzare il concatenamento della crittografia a blocchi BCE con AES, impostare la proprietà BCRYPT_CHAINING_MODE di un algoritmo AES su BCRYPT_CHAIN_MODE_ECB; la proprietà viene assegnata a tutte le chiavi AES create usando questo handle di algoritmo, senza la necessità di configurare ogni chiave AES. Usare la funzione BCryptSetProperty per modificare queste proprietà.
Creazione o importazione di una chiave
A seconda del tipo di algoritmo usato, potrebbe essere necessario creare o caricare una chiave. Ad esempio, la funzione BCryptEncrypt accetta un handle di chiave per il primo parametro. Se si vuole che tale funzione crittografi i dati con un algoritmo di crittografia simmetrica, ad esempio AES, è prima necessario ottenere una chiave. La modalità di recupero della chiave dipende dal tipo di algoritmo usato e dall'origine della chiave.
È possibile creare chiavi temporanee con le funzioni BCryptGenerateSymmetricKey e BCryptGenerateKeyPair . È anche possibile importare chiavi temporanee da un BLOB di memoria con le funzioni BCryptImportKey e BCryptImportKeyPair .
Per le chiavi persistenti, usare le funzioni di archiviazione delle chiavi per caricare un provider di archiviazione delle chiavi e quindi creare o caricare le chiavi. È anche possibile usare queste funzioni per creare o caricare chiavi temporanee passando NULL per qualsiasi nome di contenitore. Per altre informazioni sulle funzioni di archiviazione delle chiavi, vedere Funzioni di archiviazione chiavi CNG.
Esecuzione di operazioni di crittografia
È ora possibile eseguire l'operazione di crittografia, ad esempio crittografare o decrittografare i dati usando rispettivamente le funzioni BCryptEncrypt o BCryptDecrypt .
Chiusura del provider di algoritmi
Quando il provider non è più necessario, è necessario passare l'handle alla funzione BCryptCloseAlgorithmProvider per chiudere il provider. In questo modo il provider rilascia tutte le risorse allocate per tale istanza del provider di algoritmi. Dopo la chiusura di un handle del provider, non può essere riutilizzato.
Il caricamento di un provider può essere un processo relativamente intensivo in fase di esecuzione. È pertanto consigliabile memorizzare nella cache tutti gli handle del provider a cui si farà riferimento più volte durante la durata dell'applicazione.
Esempi di programmazione
Gli esempi seguenti descrivono come eseguire operazioni di crittografia specifiche usando CNG.