Codificar e decodificar uma mensagem com hash
Os dados com hash consistem em conteúdo de qualquer tipo e um hash do conteúdo. Ele pode ser usado quando só é necessário confirmar se o conteúdo da mensagem não foi modificado desde que o hash foi criado.
Ao criar uma mensagem com hash, pode haver vários algoritmos de hash e vários hashes. A ilustração a seguir ilustra as tarefas necessárias para codificar uma mensagem com hash. O procedimento é descrito no texto que segue a ilustração.
Para criar uma mensagem com hash
- Obtenha um ponteiro para os dados a serem hash.
- Selecione o algoritmo de hash a ser usado.
- Coloque os dados por meio de uma função de hash usando o algoritmo de hash.
- Inclua os dados originais a serem hash, os algoritmos de hash e os hashes na mensagem codificada.
Para usar funções de mensagem de baixo nível para realizar as tarefas descritas, use o procedimento a seguir.
Para hash e codificar uma mensagem usando funções de mensagem de baixo nível
Crie ou recupere o conteúdo a ser hash.
Obter um provedor criptográfico.
Inicialize a estrutura CMSG_HASHED_ENCODE_INFO .
Chame CryptMsgCalculateEncodedLength para obter o tamanho do BLOB da mensagem codificada. Aloque memória para ele.
Chame CryptMsgOpenToEncode, passando CMSG_HASHED para o parâmetro dwMsgType e um ponteiro para CMSG_HASHED_ENCODE_INFO para o parâmetro pvMsgEncodeInfo . Como resultado dessa chamada, você obtém um identificador para a mensagem aberta.
Chame CryptMsgUpdate, passando o identificador recuperado na etapa 5 e um ponteiro para os dados que devem ser colocados em hash e codificados. Essa função pode ser chamada quantas vezes forem necessárias para concluir o processo de codificação.
Chame CryptMsgGetParam, passando o identificador recuperado na etapa 5 e os tipos de parâmetro apropriados para acessar os dados desejados e codificados. Por exemplo, passe CMSG_CONTENT_PARAM para obter um ponteiro para toda a mensagem PKCS nº 7 .
Se o resultado dessa codificação for ser usado como os dados internos de outra mensagem codificada, como uma mensagem em envelope, CMSG_BARE_CONTENT_PARAM deverá ser passado. Para obter um exemplo mostrando isso, consulte Código alternativo para codificar uma mensagem envelheçada.
Feche a mensagem chamando CryptMsgClose.
O resultado desse procedimento é uma mensagem codificada que contém os dados originais, os algoritmos de hash e o hash desses dados. Um ponteiro para a mensagem codificada BLOB é obtido na etapa 7.
Os dois procedimentos a seguir decodificam e verificam os dados com hash.
Para decodificar dados com hash
- Obtenha um ponteiro para o BLOB codificado.
- Chame CryptMsgOpenToDecode, passando os argumentos necessários.
- Chame CryptMsgUpdate uma vez, passando o identificador recuperado na etapa 2 e um ponteiro para os dados que devem ser decodificados. Isso faz com que as ações apropriadas sejam executadas na mensagem, dependendo do tipo de mensagem.
- Chame CryptMsgGetParam, passando o identificador recuperado na etapa 2 e os tipos de parâmetro apropriados para acessar os dados desejados e decodificados. Por exemplo, passe CMSG_CONTENT_PARAM para obter um ponteiro para o conteúdo decodificado.
Para verificar o hash
- Chame CryptMsgControl, passando CMSG_CTRL_VERIFY_HASH para verificar os hashes.
- Chame CryptMsgClose para fechar a mensagem.
Para obter um programa de exemplo, consulte Exemplo de programa C: codificação e decodificação de uma mensagem de hash.