解码信封数据

解码信封邮件所需的常规任务在下图中进行了描述,并在后面的列表中进行了说明。

decoding enveloped data

使用密钥传输密钥管理解码信封数据的事件序列如下图所示:

  • 将检索指向 数字信封 邮件的指针。
  • 证书 存储 区已打开。
  • 从邮件中,将检索收件人 ID (“我的 ID”) 。
  • 收件人 ID 用于检索证书。
  • 检索与该证书关联的 私钥
  • 私钥用于解密 对称 (会话) 密钥。
  • 从消息中检索加密算法。
  • 使用私钥和加密算法解密数据。

以下过程使用低级别消息函数来完成刚刚列出的任务。

解码信封邮件

  1. 获取指向编码 BLOB 的指针。
  2. 调用 CryptMsgOpenToDecode,传递必要的参数。
  3. 调用 CryptMsgUpdate 一次,传入步骤 2 中检索的句柄,以及指向要解码的数据的指针。 这会导致对消息执行相应的操作,具体取决于消息类型。
  4. 调用 CryptMsgGetParam,传入步骤 2 中检索的句柄,并CMSG_TYPE_PARAM验证消息是否为信封数据类型。
  5. 再次调用 CryptMsgGetParam,传入CMSG_INNER_CONTENT_TYPE_PARAM以获取 内部内容的数据类型。
  6. 如果内部内容数据类型为 数据,请继续解密和解码内容。 否则,请运行适用于内容类型的解码过程。
  7. 假设内部内容类型为“data”,初始化CMSG_CTRL_DECRYPT_PARA数据结构,并调用 CryptMsgControl,传入CMSG_CTRL_DECRYPT和结构地址。 内容将被解密。
  8. 调用 CryptMsgGetParam,传入CMSG_CONTENT_PARAM以获取指向解码的内容数据 BLOB (BYTE 字符串) 的指针。
  9. 调用 CryptMsgClose 关闭消息。

此过程的结果是对消息进行解码和解密,并将指针检索到内容数据 BLOB。

示例 C 程序:对信封签名消息进行编码