我想做的是用给定的公钥(.asc文件)加密字符串(电子邮件正文)。因为我对linux还不太熟悉,所以我不知道如何在这个平台上使用外部进程。我想实际的gnupg命令行语法应该不会太难。
我听过很多关于“管道”的事;-)
我可以在我的c-应用程序中(例如,通过process类)执行此操作吗?它是如何工作的,在windows上做同样的事情有什么区别?
有没有一种方法可以实现这种跨平台风格,以便我的应用程序能够在linux和windows上调用gnupg?

最佳答案

如果你想在Linux或任何平台上使用Mono编写PGP电子邮件,真的,我建议查看我的MimeKit库http://github.com/jstedfast/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),我所遇到的问题是使用SypStudio.CythCurr.Studio过程不够灵活,以我需要的方式调用GPG(为了安全地使用GPG),您需要打开几个到gpg的管道,这样就不必先将密码短语和其他上下文写入磁盘)。我已经在C中完成了这项工作,但是process.start()只允许我管理stdin、stdout和stderr,这还不够。
gnupg项目有一个名为libgpgme的库,例如,如果您最终用c编写代码,那么这个库非常好,但是在c中没有任何完整的绑定。我能找到的最好的是https://github.com/danm-de/gpgme-sharp,但它只适用于32位,现在很多系统是64位的。
不管怎样…mimekit可以执行pgp签名、验证、加密、解密、导入/导出密钥,以及诸如sign+encrypt和decrypt+verify等组合。另外,它实现了所有的S/mime(包括那些我找不到其他S/mime库支持的东西,比如只支持证书和压缩数据消息)。
自述文件中有关于如何构建mimekit的说明(非常简单,但是需要您克隆我的bc csharp github存储库以及所有低级加密逻辑)。
希望能有所帮助。
另外,我忘了提到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", "[email protected]"));

// 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

我可能会考虑添加一个method或cast操作符来将mimekit.mimemessage转换为system.net.mail.mimemessage会涉及到什么,但我可能不会在这个周末讨论这个问题,这取决于在ios和android上运行密码的时间。
更新:我现在有一个名为MailKit的库,可用于通过smtp发送邮件。它还支持POP3和IMAP。
我现在也已经完成了将mimekit的加密支持移植到ios和android上…因此,mimekit现在在windows、mac、linux、ios和android上完全受支持。还有多少其他的mime库可以声明这一点?:-)

09-05 07:22