2012-12-17 69 views
0

对于单个收件人,我有两封邮件(SMIME加密)。一封邮件使用3DES加密,另一封使用AES 256加密。未能使用OpenSSL解密AES加密的SMIME消息

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

我可以成功解密使用

openssl smime -decrypt -in trippledes.eml -inkey keyfile.pem 

然而,3DES消息,如果我尝试这与AES加密文件,OpenSSL的输出一些乱码和这条评论失败:

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

雷鸟不能打开邮件。但是Outlook 2010在打开邮件时没有问题。

解决问题的最佳方法是什么?有没有我可以打开的日志?

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

+0

或者(的格式)的对称密钥。坏的最终块主要是由于填充异常不好造成的,如果使用了错误的键,就会产生乱码,这不太可能包含正确的填充。 –

+0

嗯,但内容可以用Outlook成功解密。所以对称密钥应该没问题,你不觉得吗? –

回答

2

我知道这是晚年,但它可能是帮助他人......

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

我使用ASN info实用程序来分解我发送的内容,并发现EnvelopedCms在内容加密时强制将KeyEncryptionAlgorithm强制为RSA-OAEP设置为AES。 (如果内容已用其他方法加密,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(); 
} 
+0

我在与一些Android代码进行互操作时有过类似的体验。非常不幸的是,你不能用EnvelopedCms类来强制它,否则这个类很好用。 – zaitsman

+0

@KentGeek你是否有解密示例代码?我努力使用坐在智能卡上的私钥解密消息。例如。人们无法访问私钥(我发现用于解密的各种BC方法认为是完全正常的)。 – masi