编码和解码哈希消息

哈希数据由任何类型的内容和内容的 哈希 组成。 只有在确认自创建哈希以来尚未修改消息内容时,才可使用它。

创建哈希消息时,可以有多个哈希算法和多个哈希。 下图描述了对哈希消息进行编码所需的任务。 此过程在插图后面的文本中介绍。

creating a hashed message

创建哈希消息

  1. 获取指向要进行哈希处理的数据的指针。
  2. 选择要使用的哈希算法。
  3. 使用哈希算法通过哈希函数放置数据。
  4. 在编码的消息中包含要哈希处理的原始数据、哈希算法和哈希。

若要使用低级别消息函数来完成刚刚概述的任务,请使用以下过程。

使用低级别消息函数对消息进行哈希和编码

  1. 创建或检索要哈希处理的内容。

  2. 获取加密提供程序。

  3. 初始化 CMSG_HASHED_ENCODE_INFO 结构。

  4. 调用 CryptMsgCalculateEncodedLength 以获取编码消息 BLOB 的大小。 为其分配内存。

  5. 调用 CryptMsgOpenToEncode,传入 dwMsgType 参数的 CMSG_HASHED,以及指向 pvMsgEncodeInfo 参数CMSG_HASHED_ENCODE_INFO的指针。 由于此调用,你将获得打开的消息句柄。

  6. 调用 CryptMsgUpdate,传入步骤 5 中检索的句柄和指向要进行哈希处理和编码的数据的指针。 可以根据需要调用此函数以完成编码过程。

  7. 调用 CryptMsgGetParam,传入步骤 5 中检索的句柄和适当的参数类型,以访问所需的编码数据。 例如,传入CMSG_CONTENT_PARAM以获取指向整个 PKCS #7 消息的指针。

    如果此编码的结果用作另一个编码消息(如信封消息) 的内部数据 ,则必须传递CMSG_BARE_CONTENT_PARAM。 有关显示此内容的示例,请参阅 用于编码信封邮件的备用代码

  8. 通过调用 CryptMsgClose 关闭消息。

此过程的结果是一条编码的消息,其中包含原始数据、哈希算法和该数据的 哈希 。 在步骤 7 中获取指向编码消息 BLOB 的指针。

以下两个过程解码,然后验证哈希数据。

解码哈希数据

  1. 获取指向编码 BLOB 的指针。
  2. 调用 CryptMsgOpenToDecode,传递必要的参数。
  3. 调用 CryptMsgUpdate 一次,传入步骤 2 中检索的句柄和指向要解码的数据的指针。 这会导致根据消息类型对消息采取相应的操作。
  4. 调用 CryptMsgGetParam,传入步骤 2 中检索的句柄,以及用于访问所需解码数据的相应参数类型。 例如,传入CMSG_CONTENT_PARAM以获取指向解码内容的指针。

验证哈希

  1. 调用 CryptMsgControl,传入CMSG_CTRL_VERIFY_HASH以验证哈希。
  2. 调用 CryptMsgClose 关闭消息。

有关示例程序,请参阅 示例 C 程序:编码和解码哈希消息