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.

criando uma mensagem com hash

Para criar uma mensagem com hash

  1. Obtenha um ponteiro para os dados a serem hash.
  2. Selecione o algoritmo de hash a ser usado.
  3. Coloque os dados por meio de uma função de hash usando o algoritmo de hash.
  4. 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

  1. Crie ou recupere o conteúdo a ser hash.

  2. Obter um provedor criptográfico.

  3. Inicialize a estrutura CMSG_HASHED_ENCODE_INFO .

  4. Chame CryptMsgCalculateEncodedLength para obter o tamanho do BLOB da mensagem codificada. Aloque memória para ele.

  5. 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.

  6. 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.

  7. 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.

  8. 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

  1. Obtenha um ponteiro para o BLOB codificado.
  2. Chame CryptMsgOpenToDecode, passando os argumentos necessários.
  3. 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.
  4. 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

  1. Chame CryptMsgControl, passando CMSG_CTRL_VERIFY_HASH para verificar os hashes.
  2. 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.