【问题标题】:S/Mime Encrypting a stringS/Mime 加密字符串
【发布时间】:2010-11-30 17:46:02
【问题描述】:

我的任务是使用 S/Mime 加密对字符串进行加密。很久以前,我工作的公司为此购买了一个组件(来自 IPWorks),但我们为让他们的组件在我们的服务器上正常运行而感到难过。不是功能问题,需要更多许可。

总之,我必须自己做。我搜索了 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();
}

谁能看出这里有明显的错误?

我没有“嫁给”这段代码,所以如果你对我如何解决这个问题有其他建议。

好意和感谢,

【问题讨论】:

  • 不要将 byte[] 传递给 X509 构造函数尝试将 byte[] 解析为 X509 证书,“密钥”实际上是证书还是您尝试使用任意字符串进行加密?不确定这是否有帮助:msdn.microsoft.com/en-us/library/ms180959.aspx
  • 谢谢 Laz,但是是的,它是一个读入字符串的证书
  • 我猜另一个问题是,你能解码你的编码例程的输出吗?
  • 不......不幸的是......这就是我的问题。

标签: c# encryption smime


【解决方案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;

也就是说,我正在开发一个比 System.Net.Mail 好得多的 MIME 库。这个库被称为MimeKit,我已经开始研究 S/MIME 支持了。

【讨论】:

    【解决方案2】:

    我认为 StreamReader 的默认编码器/解码器是 UTF-8。如果在构造函数(最后一行)中将其更改为 ASCII 会发生什么?

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2017-08-07
      • 2016-12-22
      • 1970-01-01
      • 2015-05-29
      • 2017-10-24
      • 2011-09-07
      相关资源
      最近更新 更多