Partilhar via


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 algoritmo pode ser substituído ou atualizado e você não terá que alterar seu código de forma alguma para usar o novo provedor. Além disso, se algum algoritmo for determinado como inseguro no futuro, uma versão mais segura desse algoritmo pode ser instalada sem afetar seu código. A maioria das APIs CNG requer 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:

  1. Abrindo o provedor de algoritmos
  2. Obtendo ou definindo propriedades do algoritmo
  3. Criando ou importando uma chave
  4. Executando operações criptográficas
  5. Fechando o provedor de algoritmos

Para obter mais informações, consulte Exemplos de programação.

Abrindo o provedor de algoritmos

A funçãoBCryptOpenAlgorithmProvider fornece um identificador de provedor de algoritmo que é usado em APIs CNG subsequentes, como BCryptCreateHash ou BCryptGenerateKeyPair.

Obtendo ou definindo propriedades do algoritmo

Você pode usar o identificador do provedor de algoritmo para obter detalhes de implementação para o algoritmo, como o tamanho da chave ou o modo de operação atual. Use a funçãoBCryptGetProperty para obter propriedades específicas.

Você também pode modificar as propriedades do algoritmo. Por exemplo, se pretender utilizar o encadeamento de cifras de blocos do BCE com 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 utilizado, poderá ter de criar ou carregar uma chave. Por exemplo, a funçãoBCryptEncrypt 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 AES, você deve primeiro obter uma chave. A forma como obtém a chave depende do tipo de algoritmo que está a ser utilizado e da origem da chave.

Você pode criar chaves efêmeras com o BCryptGenerateSymmetricKey e funções de BCryptGenerateKeyPair. Você também pode importar chaves efêmeras de um BLOB de memória com o BCryptImportKey e funções de 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 principais funções de armazenamento, consulte CNG Key Storage Functions.

Executando operações criptográficas

Agora você está pronto para executar a operação criptográfica, como criptografar ou descriptografar dados usando oBCryptEncrypt ou funções de BCryptDecrypt, respectivamente.

Fechando o provedor de algoritmos

Quando o provedor não é mais necessário, você deve passar o identificador para a funçãoBCryptCloseAlgorithmProvider para fechar o provedor. Isso faz com que o provedor libere todos os recursos que foram alocados para essa instância do provedor de algoritmo. 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 qualquer identificador de provedor que você referenciará 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.