对信封数据进行编码

信封数据由任何类型的加密内容和一个或多个收件人的加密内容加密会话密钥组成。 信封邮件保留消息内容机密,仅允许指定的人员或实体检索内容。

CMS) (加密消息语法可用于对信封消息进行编码。 CMS 支持三种密钥管理技术:密钥传输、密钥协议和以前分发的对称密钥加密密钥 (KEK) 。 以前分布式对称 KEK 也称为邮件列表密钥分发。

在这三种方法中,将生成单个会话密钥来加密信封消息。 密钥管理问题涉及发送方加密会话密钥和接收方解密的方式。 可以使用混合密钥管理技术将单个加密邮件分发给多个收件人。

密钥传输密钥管理使用预期接收方的公钥来加密会话密钥。 接收方使用与用于加密的公钥关联的私钥解密会话密钥。 然后,接收方使用解密的会话密钥来解密信封数据。 使用密钥传输时,接收方尚未确认有关发送方身份的信息。

在密钥协议管理中,会生成临时的临时Diffie-Hellman私钥,并将其用于加密会话密钥。 与临时私钥对应的公钥包含在邮件的收件人信息中。 收件人使用收到的临时密钥解密会话密钥,并使用此解密的会话密钥来解密信封邮件。 将临时密钥协议与接收方的私钥结合使用,消息接收方确实已确认有关发送方身份的信息。

对于使用以前分发的 对称密钥的密钥管理,每条消息都包含使用以前分发的密钥加密密钥加密的内容加密密钥。 接收方使用以前分发的密钥加密密钥来解密内容加密密钥,然后使用解密的内容加密密钥来解密信封邮件。

下图显示了用于编码信封数据的典型 CMS 事件序列。

对信封数据进行编码

  • 检索指向 纯文本 消息的指针。
  • 生成对称 (会话) 密钥。
  • 对称密钥和指定的加密算法用于加密消息数据。
  • 证书 存储 区已打开。
  • 从存储中检索收件人的证书。
  • 公钥是从收件人的证书中检索的。
  • 使用接收方的公钥对对称密钥进行加密。
  • 从收件人的证书中检索收件人的 ID。
  • 数字信封邮件中包含以下信息:数据加密算法、加密数据、加密对称密钥和收件人信息结构。

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

对信封邮件进行编码

  1. 创建或检索内容。

  2. 获取加密提供程序。

  3. 获取收件人证书。

  4. 初始化 CMSG_ENVELOPED_ENCODE_INFO 结构。

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

  6. 调用 CryptMsgOpenToEncode,为 dwMsgType 传入CMSG_ENVELOPED,并为 pvMsgEncodeInfo 传入指向CMSG_ENVELOPED_ENCODE_INFO的指针。 由于此调用,你将获得打开的消息的句柄。

  7. 调用 CryptMsgUpdate,传入步骤 6 中检索到的句柄和指向要加密、信封和编码的数据的指针。 可以根据需要多次调用此函数来完成编码过程。

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

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

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

此过程的结果是包含加密数据的编码消息、使用收件人的公钥加密的 对称密钥 以及收件人信息数据结构。 收件人的加密内容和加密对称密钥的组合是该收件人 的数字信封 。 可以为多个收件人封套任何类型的内容。

示例 C 程序:对带信封的带符号消息进行编码