我为一个收件人提供了两封邮件(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结构。这两条消息看起来都不错,所以我猜罪魁祸首在于加密的内容本身。
答案 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();
}