编码和解码哈希消息
哈希数据由任何类型的内容和内容的 哈希 组成。 只有在确认自创建哈希以来尚未修改消息内容时,才可使用它。
创建哈希消息时,可以有多个哈希算法和多个哈希。 下图描述了对哈希消息进行编码所需的任务。 此过程在插图后面的文本中介绍。
创建哈希消息
- 获取指向要进行哈希处理的数据的指针。
- 选择要使用的哈希算法。
- 使用哈希算法通过哈希函数放置数据。
- 在编码的消息中包含要哈希处理的原始数据、哈希算法和哈希。
若要使用低级别消息函数来完成刚刚概述的任务,请使用以下过程。
使用低级别消息函数对消息进行哈希和编码
创建或检索要哈希处理的内容。
获取加密提供程序。
初始化 CMSG_HASHED_ENCODE_INFO 结构。
调用 CryptMsgCalculateEncodedLength 以获取编码消息 BLOB 的大小。 为其分配内存。
调用 CryptMsgOpenToEncode,传入 dwMsgType 参数的 CMSG_HASHED,以及指向 pvMsgEncodeInfo 参数CMSG_HASHED_ENCODE_INFO的指针。 由于此调用,你将获得打开的消息句柄。
调用 CryptMsgUpdate,传入步骤 5 中检索的句柄和指向要进行哈希处理和编码的数据的指针。 可以根据需要调用此函数以完成编码过程。
调用 CryptMsgGetParam,传入步骤 5 中检索的句柄和适当的参数类型,以访问所需的编码数据。 例如,传入CMSG_CONTENT_PARAM以获取指向整个 PKCS #7 消息的指针。
如果此编码的结果用作另一个编码消息(如信封消息) 的内部数据 ,则必须传递CMSG_BARE_CONTENT_PARAM。 有关显示此内容的示例,请参阅 用于编码信封邮件的备用代码。
通过调用 CryptMsgClose 关闭消息。
此过程的结果是一条编码的消息,其中包含原始数据、哈希算法和该数据的 哈希 。 在步骤 7 中获取指向编码消息 BLOB 的指针。
以下两个过程解码,然后验证哈希数据。
解码哈希数据
- 获取指向编码 BLOB 的指针。
- 调用 CryptMsgOpenToDecode,传递必要的参数。
- 调用 CryptMsgUpdate 一次,传入步骤 2 中检索的句柄和指向要解码的数据的指针。 这会导致根据消息类型对消息采取相应的操作。
- 调用 CryptMsgGetParam,传入步骤 2 中检索的句柄,以及用于访问所需解码数据的相应参数类型。 例如,传入CMSG_CONTENT_PARAM以获取指向解码内容的指针。
验证哈希
- 调用 CryptMsgControl,传入CMSG_CTRL_VERIFY_HASH以验证哈希。
- 调用 CryptMsgClose 关闭消息。
有关示例程序,请参阅 示例 C 程序:编码和解码哈希消息。