Compartir a través de


Codificación y descodificación de un mensaje hash

Los datos con hash constan de contenido de cualquier tipo y un hash del contenido. Se puede usar cuando solo es necesario confirmar que el contenido del mensaje no se ha modificado desde que se creó el hash.

Al crear un mensaje hash, puede haber varios algoritmos hash y varios hashes. En la ilustración siguiente se muestran las tareas necesarias para codificar un mensaje hash. El procedimiento se describe en el texto que sigue a la ilustración.

crear un mensaje con hash

Para crear un mensaje hash

  1. Obtenga un puntero a los datos que se van a aplicar hash.
  2. Seleccione el algoritmo hash que se va a usar.
  3. Coloque los datos a través de una función hash mediante el algoritmo hash.
  4. Incluya los datos originales que se van a aplicar hash, los algoritmos hash y los hashes en el mensaje codificado.

Para usar funciones de mensaje de bajo nivel para realizar las tareas descritas, use el procedimiento siguiente.

Para aplicar un hash y codificar un mensaje mediante funciones de mensaje de bajo nivel

  1. Cree o recupere el contenido que se va a aplicar hash.

  2. Obtenga un proveedor criptográfico.

  3. Inicialice la estructura CMSG_HASHED_ENCODE_INFO .

  4. Llame a CryptMsgCalculateEncodedLength para obtener el tamaño del blob del mensaje codificado. Asigne memoria para ella.

  5. Llame a CryptMsgOpenToEncode, pasando CMSG_HASHED para el parámetro dwMsgType y un puntero a CMSG_HASHED_ENCODE_INFO para el parámetro pvMsgEncodeInfo . Como resultado de esta llamada, obtendrá un identificador para el mensaje abierto.

  6. Llame a CryptMsgUpdate, pasando el identificador recuperado en el paso 5 y un puntero a los datos que se van a aplicar hash y codificar. Se puede llamar a esta función tantas veces como sea necesario para completar el proceso de codificación.

  7. Llame a CryptMsgGetParam, pasando el identificador recuperado en el paso 5 y los tipos de parámetro adecuados para acceder a los datos deseados codificados. Por ejemplo, pase CMSG_CONTENT_PARAM para obtener un puntero a todo el mensaje PKCS #7 .

    Si el resultado de esta codificación se va a usar como datos internos para otro mensaje codificado, como un mensaje sobre, CMSG_BARE_CONTENT_PARAM debe pasarse. Para obtener un ejemplo que muestre esto, vea Código alternativo para codificar un mensaje sobre.

  8. Cierre el mensaje llamando a CryptMsgClose.

El resultado de este procedimiento es un mensaje codificado que contiene los datos originales, los algoritmos hash y el hash de esos datos. Un puntero al BLOB de mensaje codificado se obtiene en el paso 7.

Los dos procedimientos siguientes descodifican y, a continuación, comprueban los datos con hash.

Para descodificar datos hash

  1. Obtenga un puntero al BLOB codificado.
  2. Llame a CryptMsgOpenToDecode y pase los argumentos necesarios.
  3. Llame a CryptMsgUpdate una vez, pasando el identificador recuperado en el paso 2 y un puntero a los datos que se van a descodificar. Esto hace que se realicen las acciones adecuadas en el mensaje, en función del tipo de mensaje.
  4. Llame a CryptMsgGetParam, pasando el identificador recuperado en el paso 2 y los tipos de parámetro adecuados para acceder a los datos deseados y descodificados. Por ejemplo, pase CMSG_CONTENT_PARAM para obtener un puntero al contenido descodificado.

Para comprobar el hash

  1. Llame a CryptMsgControl y pase CMSG_CTRL_VERIFY_HASH para comprobar los hashes.
  2. Llame a CryptMsgClose para cerrar el mensaje.

Para obtener un programa de ejemplo, vea Programa C de ejemplo: Codificación y descodificación de un mensaje hash.