1

私がやりたいことは、特定の公開鍵 (.asc ファイル) で文字列 (電子メールの本文) を暗号化することです。私は Linux にまったく慣れていないので、そのプラットフォームで外部プロセスをどのように利用するのかわかりません。実際の G​​nuPG コマンド ライン構文は、それほど難しくないと思います。

この「パイピング」についてはよく耳にします ;-) 私の C# アプリケーションから (たとえば、Process クラスを介して) それを行うことはできますか? それはどのように機能し、同じことを Windows で行う場合の違いは何ですか?

私のアプリケーションが Linux と Windows で GnuPG を呼び出せるように、そのクロスプラットフォーム スタイルを行う方法はありますか?

4

1 に答える 1

4

Linux または任意のプラットフォームで Mono を使用して PGP 電子メールを実行したい場合は、http://github.com/jstedfast/MimeKit にある私の MimeKit ライブラリを参照することをお勧めします。

API ドキュメントはhttp://jstedfast.github.io/MimeKit/docsにあります。

MimeKit.Cryptography.GnuPGContext をサブクラス化して抽象 GetPassword() メソッドをオーバーライドし、次を呼び出すだけです。

MimeKit.Cryptography.CryptographyContext.Register (typeof (MyGnuPGContext));

それ以降、メッセージを暗号化するには、次のように MimeKit.Cryptography.MultipartEncrypted を使用します。

var message = new MimeMessage ();
// TODO: set the From, To, Subject, etc...

// create the message body
var body = new TextPart () { Text = "This is the message text..." };

// encrypt the body of the message
var encrypted = MultipartEncrypted.Create (message.To.Mailboxes, body);
message.Body = encrypted;

これで、メッセージの本文が RFC 準拠の方法で暗号化されます。

数か月前、MimeKit ライブラリを作成しているときに、PGP サポートを (できれば GnuPG を介して) 追加したいと考えていましたが、System.Diagnostics.Process を使用すると、必要な方法で gpg を呼び出すのに十分な柔軟性がないという問題がありました。 (安全な方法で gpg を使用するには、最初にパスフレーズやその他のコンテキストをディスクに書き込む必要がないように、gpg へのいくつかのパイプを開く必要があります)。私はこれを C で行いましたが、たとえば、Process.Start() では stdin、stdout、および stderr しか管理できず、それだけでは十分ではありませんでした。

GnuPG プロジェクトには libgpgme というライブラリがあります。これは、たとえば C でコードを書くことになった場合に非常に便利ですが、C# には完全なバインディングはありません。私が見つけた最高のものはhttps://github.com/danm-de/gpgme-sharpでしたが、これは 32 ビットでしか機能せず、最近では多くのシステムが 64 ビットです。

とにかく... MimeKit は、pgp 署名、検証、暗号化、復号化、キーのインポート/エクスポート、および署名 + 暗号化や復号化 + 検証などの組み合わせを実行できます。さらに、S/MIME のすべてを実装しています (証明書のみのメッセージや圧縮データ メッセージなど、他の S/MIME ライブラリでサポートされていないものも含まれます)。

README には、MimeKit のビルド方法に関する説明があります (非常に単純ですが、すべての下位レベルの暗号ロジックのために、bc-csharp github リポジトリのクローンを作成する必要があります)。

それが役立つことを願っています。

PS MimeKit は完全にクロスプラットフォームであることを忘れていました。Windows、Linux、および Mac で動作します。MimeKit 自体 (暗号を除く) も iOS と Android で動作します。今週末の私の目標は、暗号化を iOS と Android で動作させ、そのためのパッケージを作成することです。

現在... 残念ながら、MimeKit には互換性のある SmtpClient がまだありませんが、MimeKit を使用して PGP 暗号化を行い、System.Net.Mail 内で使用する暗号化されたコンテンツを次のように抽出できます。

// create a list of recipients
var recipients = new List<MailboxAddress> ();
recipients.Add (new MailboxAddress ("Joe Sixpack", "joe@sixpack.org"));

// create the message body
var body = new TextPart () { Text = "This is the message text..." };

// encrypt the body of the message
var multipart = MultipartEncrypted.Create (recipients, body);

// get the part that contains the ascii-armored pgp content
// (the second mime part of the multipart/encrypted)
var encrypted = (MimePart) multipart[1];

// get the ascii-armored encrypted content
var memory = new MemoryStream ();
encrypted.ContentObject.WriteTo (memory);
memory.Position = 0;

// at this point, 'memory' has the "--- BEGIN PGP MESSAGE ---" data
// and you can create your System.Net.Mail.MimeMessage and add a
// mime part with the memory stream as its content

MimeKit.MimeMessage を System.Net.Mail.MimeMessage に変換するためのメソッドまたはキャスト オペレーターを追加する必要があるかどうかを調べるかもしれませんが、時間がかかることによっては、今週末はそれを回避できない可能性があります。 iOS と Android で動作する暗号化を取得します。

更新: SMTP 経由でメッセージを送信するために使用できるMailKitという別のライブラリがあります。POP3 と IMAP にも対応しています。

また、MimeKit の暗号サポートの iOS および Android への移植も完了しました。そのため、MimeKit は Windows、Mac、Linux、iOS、および Android で完全にサポートされるようになりました。他にいくつの MIME ライブラリがその主張を行うことができますか? :-)

于 2013-11-16T02:21:41.163 に答える