2012-12-17 125 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