2

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();
}

誰かがここで明らかな失敗を見ることができますか?

私はこのコードに「結婚」していないので、この火を消す方法について別の提案があれば.

親切と感謝、

ダン

4

2 に答える 2

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 サポートの作業を開始しています。

于 2013-09-21T17:46:04.523 に答える
0

StreamReader のデフォルトのエンコーダー/デコーダーは UTF-8 だと思います。コンストラクタで ASCII に変更するとどうなりますか (最後の行)。

于 2009-11-03T08:47:47.310 に答える