0

我有一个收件人的两封邮件(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 结构。两条消息对我来说都不错,所以我猜罪魁祸首在于加密的内容本身。

4

1 回答 1

2

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

几年来,我非常成功且愉快地使用 EnvelopedCms,与许多其他实现交换消息。今年有人决定要求使用 AES 时,我发现至少有一个基于 Java 的系统无法处理我的消息。(他们的错误是“无法创建 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();
}
于 2015-12-10T15:02:14.703 回答