2009-09-23 129 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支持。