Programação CNG típica
A API CNG implementa um modelo de provedor extensível que permite carregar um provedor especificando o algoritmo criptográfico necessário em vez de um provedor específico. A vantagem é que um provedor de algoritmos pode ser substituído ou atualizado e você não precisará alterar seu código de forma alguma para usar o novo provedor. Além disso, se algum algoritmo for determinado como não seguro no futuro, uma versão mais segura desse algoritmo poderá ser instalada sem afetar seu código. A maioria das APIs CNG exige um provedor ou um objeto criado por um provedor.
As etapas típicas envolvidas no uso da API CNG para operações primitivas criptográficas são as seguintes:
- Abrindo o provedor de algoritmo
- Obtendo ou definindo propriedades do algoritmo
- Criando ou importando uma chave
- Executando operações criptográficas
- Fechando o provedor de algoritmo
Para obter mais informações, consulte Exemplos de programação.
Abrindo o provedor de algoritmo
A função BCryptOpenAlgorithmProvider fornece um identificador de provedor de algoritmos usado em APIs CNG subsequentes, como BCryptCreateHash ou BCryptGenerateKeyPair.
Obtendo ou definindo propriedades do algoritmo
Você pode usar o identificador do provedor de algoritmos para obter detalhes de implementação para o algoritmo, como o tamanho da chave ou o modo de operação atual. Use a função BCryptGetProperty para obter propriedades específicas.
Você também pode modificar as propriedades do algoritmo. Por exemplo, se você quiser usar o encadeamento de codificação de blocos ECB com o AES, defina a propriedade BCRYPT_CHAINING_MODE de um algoritmo AES como BCRYPT_CHAIN_MODE_ECB; a propriedade é atribuída a todas as chaves AES criadas usando esse identificador de algoritmo, sem a necessidade de configurar cada chave AES. Use a função BCryptSetProperty para modificar essas propriedades.
Criando ou importando uma chave
Dependendo do tipo de algoritmo usado, talvez seja necessário criar ou carregar uma chave. Por exemplo, a função BCryptEncrypt usa um identificador de chave para o primeiro parâmetro. Se você quiser que essa função criptografe dados com um algoritmo de criptografia simétrica, como o AES, primeiro você deve obter uma chave. A maneira como você obtém a chave depende do tipo de algoritmo que está sendo usado e da origem da chave.
Você pode criar chaves efêmeras com as funções BCryptGenerateSymmetricKey e BCryptGenerateKeyPair . Você também pode importar chaves efêmeras de um BLOB de memória com as funções BCryptImportKey e BCryptImportKeyPair .
Para chaves persistentes, use as funções de armazenamento de chaves para carregar um provedor de armazenamento de chaves e, em seguida, crie ou carregue as chaves. Você também pode usar essas funções para criar ou carregar chaves efêmeras passando NULL para qualquer nome de contêiner. Para obter mais informações sobre as funções de armazenamento de chaves, consulte Funções de armazenamento de chaves CNG.
Executando operações criptográficas
Agora você está pronto para executar a operação criptográfica, como criptografar ou descriptografar dados usando as funções BCryptEncrypt ou BCryptDecrypt , respectivamente.
Fechando o provedor de algoritmo
Quando o provedor não for mais necessário, você deverá passar o identificador para a função BCryptCloseAlgorithmProvider para fechar o provedor. Isso faz com que o provedor libere todos os recursos que foram alocados para essa instância do provedor de algoritmos. Depois que um identificador de provedor é fechado, ele não pode ser reutilizado.
Carregar um provedor pode ser um processo relativamente demorado. Portanto, você deve armazenar em cache todos os identificadores de provedor que você fará referência várias vezes durante o tempo de vida do seu aplicativo.
Exemplos de programação
Os exemplos a seguir descrevem como executar operações criptográficas específicas usando CNG.