多个收件人的 SMIME 解密

Posted

技术标签:

【中文标题】多个收件人的 SMIME 解密【英文标题】:SMIME decryption for multiple recipients 【发布时间】:2013-09-28 00:31:54 【问题描述】:

我想用 JAVA 开发一个基于 SMIME 的应用程序。这些是我需要对 SMIME 加密/解密进行更多说明的某些领域。 我了解在单个收件人的情况下如何加密和解密消息。

如果只有一个收件人

用于加密消息内容的随机生成的会话密钥。 然后这个随机会话密钥将使用接收方的公钥加密,然后发送 SMIME 消息。 加密的消息将使用接收者的私钥解密并检索 用于在接收方加密消息的会话密钥。

如果有多个收件人,则

用于加密消息内容的随机生成的会话密钥。 如果将消息发送给多个收件人,对称密钥将由每个收件人的公钥分别加密。封装的消息和所有加密的对称密钥使用 PKCS#7 格式打包在一起。 然后这个随机会话密钥将使用每个接收者的公钥加密,然后发送 SMIME 消息。

如果多个接收者加密的会话密钥带有相同的消息,

接收端的解密是如何完成的? 接收方是否迭代所有加密的会话密钥并尝试解密会话密钥? 如果有 50 个接收者,那么接收者是否需要解密所有接收者的加密文本以获得会话密钥?

谁能帮我找到任何有用的资源或为我的问题提供答案?

【问题讨论】:

【参考方案1】:

如果将消息发送给多个收件人,对称密钥将由每个收件人的公钥分别加密。

对称会话密钥也可选择为发送者进行非对称加密。

所有加密的对称密钥都打包在一起

每个接收者都有一个块,带有加密的密钥、使用的证书的序列号等。

然后这个随机会话密钥将使用每个接收者的公钥加密,然后发送 SMIME 消息。

事实并非如此。以上步骤就够了。生成的对称会话密钥需要为每个接收者(和发送者)进行非对称加密,而不是更多。

在CMS RFC5652 和S/MIME RFC5751 中定义。 S/MIME 消息由 MIME 正文和 CMS 内容类型组成。对于每个收件人(和发件人),必须有一个 CMS RecipientInfo Type。在这种类型中是哪个加密密钥属于哪个接收者的信息。

openssl cms -inform smime -in Test_enc.mbox -cmsout -print
CMS_ContentInfo: 
  contentType: pkcs7-envelopedData (1.2.840.113549.1.7.3)
  d.envelopedData: 
    version: <ABSENT>
    originatorInfo: <ABSENT>
    recipientInfos:
      d.ktri: 
        version: <ABSENT>
        d.issuerAndSerialNumber: 
          issuer: C=.., ST=.., L=.., O=.., OU=.., CN=..
          serialNumber: 16756039346226544442
        keyEncryptionAlgorithm:
          algorithm: rsaEncryption (1.2.840.113549.1.1.1)
          parameter: NULL
        encryptedKey:
          0000 - 07 b9 dc b8 97 ed ea b0-8f 9c 30 fa 0c f6 a0   ..........0....
          ...
          01fe - f0 62                                          .b
        
      d.ktri: 
        version: <ABSENT>
        d.issuerAndSerialNumber: 
          issuer: C=.., ST=.., L=.., O=.., OU=.., CN=..
          serialNumber: 16756039346226544442
        keyEncryptionAlgorithm:
          algorithm: rsaEncryption (1.2.840.113549.1.1.1)
          parameter: NULL
        encryptedKey:
          0000 - 07 b9 dc b8 97 ed ea b0-8f 9c 30 fa 0c f6 a0   ..........0....
          ...
          01fe - f0 62                                          .b

由于这封邮件是为我自己加密的,因此该块被包含两次,分别是发件人和收件人。

接收端的解密是如何完成的? 接收方是否迭代所有加密的会话密钥并尝试解密会话密钥? 如果有 50 个接收者,那么接收者是否需要解密所有接收者的加密文本以获得会话密钥?

接收方只需在recipientInfos 列表中搜索相应的issuerserial number 即可找到正确的加密密钥。

【讨论】:

以上是关于多个收件人的 SMIME 解密的主要内容,如果未能解决你的问题,请参考以下文章

使用多个密钥进行加密/解密

用于解密 SMIME.p7m 文件的 Javascript 库

网络安全-非对称加密

CA证书

如何使用 mandrill 生成多个收件人的数组

如何将消息发送给多个收件人