Partilhar via


Codificando e decodificando uma mensagem com hash

Dados hash consistem de conteúdo de qualquer tipo e de um hash do conteúdo. Ele pode ser usado quando é necessário apenas confirmar que 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 mostra as tarefas necessárias para codificar uma mensagem com hash. O procedimento é descrito no texto que se segue à ilustração.

criar uma mensagem com hash

Para criar uma mensagem com hash

  1. Obtenha um ponteiro para os dados a serem hashados.
  2. Selecione o algoritmo de hash a ser usado.
  3. Passe os dados por uma função de hash usando o algoritmo de hash.
  4. Inclua os dados originais a serem hashados, os algoritmos de hashing e os hashes na mensagem codificada.

Para usar funções de mensagem de baixo nível para realizar as tarefas que acabamos de descrever, 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 colocado em hash.

  2. Obtenha um provedor de criptografia.

  3. Inicialize a estrutura CMSG_HASHED_ENCODE_INFO.

  4. Chame CryptMsgCalculateEncodedLength para obter o tamanho da mensagem codificada BLOB. 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ê recebe 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. Esta 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âmetros apropriados para acessar os dados codificados desejados. Por exemplo, passe em CMSG_CONTENT_PARAM para obter um ponteiro para a mensagem completa PKCS #7.

    Se o resultado dessa codificação for usado como o de dados internos para outra mensagem codificada, como uma mensagem envelopada, CMSG_BARE_CONTENT_PARAM deverá ser passado. Para obter um exemplo mostrando isso, consulte Código alternativo para codificar uma mensagem envelopada.

  8. Feche a mensagem chamando CryptMsgClose.

O resultado deste 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 em hash.

Para decodificar dados em 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 tomadas na mensagem, dependendo do tipo de mensagem.
  4. Chame CryptMsgGetParam, passando o identificador recuperado na etapa 2 e os tipos de parâmetros 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: Codificando e Decodificando uma Mensagem Criptografada.