2009-09-23 67 views
2

我的任務是使用S/Mime加密來加密字符串。以前,我工作的公司爲此購買了一個組件(來自IPWorks),但是我們有許多令人悲傷的事情讓他們的組件在我們的服務器上很好地發揮作用。不是一個功能問題,更多的許可。S/Mime加密字符串

所以總之,我必須自己做。我已經瀏覽了MSDN和論壇,並將以下代碼放在一起。不幸的是,它創造的輸出不是我所期望的。很多韓文和特殊字符,我不會指望。

public string EncryptString(string toEncrypt, string key) 
{ 
// Convert the body to bytes 
byte[] bodyBytes = Encoding.ASCII.GetBytes(toEncrypt); 

// Encrypt the body 
var envelopedCms = new EnvelopedCms(new ContentInfo(bodyBytes)); 

var certificate = new X509Certificate2(Encoding.ASCII.GetBytes(key)); 

var recipient = new CmsRecipient(certificate); 
envelopedCms.Encrypt(recipient); 
byte[] encryptedBytes = envelopedCms.Encode(); 
var msg = new MailMessage(); 
var ms = new MemoryStream(encryptedBytes); 
var av = new AlternateView(ms, "application/pkcs7-mime; smime-type=enveloped-data;name=smime.p7m; content-transfer-encoding=Base64; content-disposition=attachment; fileName=smime.p7m;"); 
msg.AlternateViews.Add(av); 

return new StreamReader(msg.AlternateViews[0].ContentStream).ReadToEnd(); 
} 

任何人都可以在這裏看到明顯的錯誤嗎?

我不是這個代碼的「結婚」,所以如果你有一個替代的建議,我可以做這個消防。

善良和感謝,

+0

不要向X509構造函數傳遞byte []嘗試將byte []解析爲X509證書,是'key'實際上是一個證書,還是試圖使用任意字符串進行加密?不知道這是否可以幫助:http://msdn.microsoft.com/en-us/library/ms180959.aspx – Lazarus 2009-09-23 12:31:37

+0

謝謝拉茲,但是,它是一個證書讀入一個字符串 – 2009-09-23 12:33:21

+0

我想另一個問題是,你能解碼你的編碼程序的輸出? – Lazarus 2009-09-23 12:39:28

回答

2

你試過問邪惡霸主52的幫助?你可以在陰性海岸的空心火山中找到他。

+0

WAHAHA如此不相關!但很好! – 2011-06-06 08:39:43

0

我認爲StreamReader的默認編碼器/解碼器是UTF-8。如果在構造函數中將其更改爲ASCII(最後一行),會發生什麼情況?

1

這條線的問題是:

var av = new AlternateView(ms, "application/pkcs7-mime; smime-type=enveloped-data;name=smime.p7m; content-transfer-encoding=Base64; content-disposition=attachment; fileName=smime.p7m;"); 

你正在傾倒的多個標頭的值到Content-Type頭。

相反,你需要的是更多的東西是這樣的:

var contentType = new ContentType ("application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m"); 
var attachment = new Attachment (ms, contentType); 
attachment.ContentDisposition.FileName = "smime.p7m"; 
attachment.TransferEncoding = TransferEncoding.Base64; 

這就是說,我工作的一個很遠很遠更好的MIME庫比System.Net.Mail(這是如此糟糕設計的它只能由微軟的一個完整的業餘愛好者設計)。這個庫叫做MimeKit,我已經開始研究S/MIME支持。