无法使用OpenSSL解密AES加密的SMIME消息

时间:2012-12-17 16:04:36

标签: outlook openssl aes thunderbird 3des

我为一个收件人提供了两封邮件(SMIME加密)。一个邮件使用3DES加密,另一个使用AES 256加密。

使用C#EnvelopedCms类创建的邮件。

我可以使用

成功解密3DES消息
openssl smime -decrypt -in trippledes.eml -inkey keyfile.pem

但是,如果我尝试使用AES加密文件,OpenSSL会输出一些乱码和失败的评论:

Error decrypting PKCS#7 structure 4128:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:.\crypto\evp\evp_enc.c:539:

Thunderbird也无法打开邮件。但是Outlook 2010打开邮件没有问题。

解决问题的最佳方法是什么?我可以打开任何日志记录吗?

我已经使用http://lapo.it/asn1js/上的ASN.1解码器检查了两封邮件的ASN.1结构。这两条消息看起来都不错,所以我猜罪魁祸首在于加密的内容本身。

1 个答案:

答案 0 :(得分:2)

我知道这已经晚了几年,但对其他人可能会有所帮助......

我使用EnvelopedCms非常成功并愉快地使用了几年,与许多其他实现交换消息。当今年有人决定要求使用AES时,我发现至少有一个基于Java的系统无法使用我的消息。 (他们的错误是#34;无法创建PKCS#7 MIME内容")

我使用ASN信息实用程序来分解我发送的内容,并发现当内容加密设置为AES时,EnvelopedCms强制将KeyEncryptionAlgorithm转换为RSA-OAEP。 (如果内容是用其他任何东西加密的,则KeyEncryptionAlgorithm只是普通的RSA。)

我找不到解释此行为的文档或RFC,似乎没有任何方法可以更改它。

我对此问题的解决方案是使用BouncyCastle CmsEnvelopedDataGenerator类。到目前为止,它似乎至少与EnvelopedCms一样有效,并且避免了RSA-OAEP密钥加密问题。几乎是替代品(除了使用的证书类别。)

虽然我找不到任何专门说我的收件人的Java库无法使用RSA-OAEP算法的文档,但一旦我删除它,它们的错误就消失了,消息也成功发送了。

使用BouncyCastle的示例代码:

private byte[] CmsEncrypt(byte[] message, string contentEncryptionOid, Org.BouncyCastle.X509.X509Certificate recipCertificate)
{
    var cmsGenerator = new CmsEnvelopedDataGenerator();
    var cmsData = new CmsProcessableByteArray(message);

    cmsGenerator.AddKeyTransRecipient(recipCertificate);

    var cmsEnvelope = cmsGenerator.Generate(cmsData, contentEncryptionOid);

    return cmsEnvelope.GetEncoded();
}