针对多个收件人的SMIME解密

时间:2013-09-23 07:20:08

标签: email encryption javamail smime

我想在JAVA中开发一个基于SMIME的应用程序。这些是我需要更多关于SMIME en / de-crypttion的澄清的特定领域。 我了解如何在单个收件人的情况下进行邮件加密和解密。

如果只有一个收件人

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

如果有多个收件人,则

  • 用于加密邮件内容的随机生成的会话密钥。
  • 如果正在向多个收件人发送邮件,则对称密钥将由每个收件人的公钥单独加密。封装消息和所有加密对称密钥使用PKCS#7格式打包在一起。
  • 然后使用每个接收者的公钥对该随机会话密钥进行加密,然后发送SMIME消息。

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

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

有人可以帮我找到任何有用的资源或为我的问题提供答案吗?

1 个答案:

答案 0 :(得分:3)

  

如果正在向多个收件人发送邮件,则对称密钥将由每个收件人的公钥单独加密。

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

  

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

每个收件人都有一个块,其中包含加密密钥,使用过的证书的序列号等等。

  

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

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

CMS RFC5652S/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个收件人,那么接收方是否需要解密所有收件人的会话密钥加密文本?
  •   

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