如何使用 C# 加密 OpenPGP 密钥?

How to encrypt for OpenPGP keys using C#?

我的任务是添加一个允许我的公司加密文件的系统,以便我们可以将它们发送给第三方,他们可以 运行 对我们的数据进行一些操作。第三方给了我一个public这种格式的密钥,

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.18 (Darwin)

mQGiBFU1gfQRBACekfIt7mSynzBi0C2hIbvWM6mMh80ypw8NNvdCpOIfSwLVavej
YIESXe5yLGzWUoTnHALa5JHLJ2C3faeDHRBikXRESycRHz0itz3L/mlyIPLo7T1n
4zr2wUL+h0ZEmuhLeVBD+yLKzy68suEWXCcTkeh71vYG1r77RFJLtQHIfwCgu9DW
uJC8IHzXMrspotFIb0XF/VsD/iqdfRgdu7CkvUflwQsT66CmZcyfkkZkWpHXZoov
GP3ZCVKPfGEZqlThwuqgBCBbtsyZFSSmF8m5qjL/Dtz+t3/fxxTo1lXRr9P4f4Pl
n3OYQh+iOs1Z+7nnAZ4mulU1eRPYUY21e+UwKi+hd1Qe1ADOaH/9JVS8nrodePCO
qBFvBACXKEWpP937fZv1hGdqZ2OUM44RIf0PGbQwyG8a+DsksJgd0oY+sb5nTaB/
CgsEFgIDAQIeAQIXgAAKCRDEcHC8uF0CrVnTAJwLdvuBjv/Z8lySVZS7jInljU9y
sACdEtxmspV/GH7EDY0KtIydy3Vn8/eIXgQQEQgABgUCVTWCPAAKCRArjD/JWo9s
KvwNAP9CkZgMGn98wwMAixW5tIVA+J5kvdxnleg/wrR9xHsFYQD+KMraOkHSk10p
1EckgFK6LTuVqMvUoK9Gvr8v0rrHucW5Ag0EVTWB9BAIAP12dtlu0EuQ4s78ZWhM
cDJmpqot5FbMecPF20V5LsDFYbLGylEPPFFxNhwsc/l0Rlvg7auH2fcLSZf5hEp9
NsBhgWD532CAim9bFYF1s2bbjlZ7jUQD/Dt+9j1d9YrgCkF2/9er7RyfYwsRlVDQ
1nRCFLoQWLqisoILG65oloVtjNg6xftyLaLb6UuluW8dRM7q/9EvE0xPAX1ukc33
iGDWeMUR0JHyuM1QiN4IhOHKjP6Oqy+lJWtgoCQmxPJ2+Qj6b34wtsfD9vh3xLef
68ReXEOlfQ01tv6hQCrK/ZdvPLk38kVnwPOEJl/Hgj5eiVM3ioOlmBQoXKSpXyXI
wMKnovOEqJ2btp39XNpjjcV80RZiAJyAhNz2EynZk15QhOnabo9gdsiaMpBZdSdc
gDHowOXsWxzaVESs+SwJf/N2fa3j1UTDxCKkq5TOofvOfyPAYYASstmPw1v7xIcV
zn2nkKfBk1EnFM5PfwQAfXKUTx6BrZmITwQYEQgADwUCVTWB9AIbDAUJAsfqAAAK
CRDEcHC8uF0CrTI6AJ4oAZ2y4Pcahp+SRSNSW7Nijqdv2QCgnJ2EauQgU+rSyHyy
lkp3zJGdJTU=
=k/9l

-----END PGP PUBLIC KEY BLOCK-----

我可以将这个文本字符串直接粘贴到 C# 中的 RSACryptoServiceProvider class 中作为 public 键吗?或者还有更多吗?我以前没有使用过 PGP,我想知道我需要做什么才能使用此密钥加密数据。

GitHub 上似乎有一个用于此的 C# 库,但它已有几年历史了。如果您想实施自己的 PGP 加密,我相信它可以为您指明正确的方向。 https://github.com/da2ce7/SharpPrivacy

还有一篇关于它的 codeproject 文章,但它很旧并且引用了一个似乎不再存在的站点。这里也有一个 link 供参考 http://www.codeproject.com/Articles/4284/SharpPrivacy-OpenPGP-for-C .

虽然 OpenPGP 利用了 RSA 和其他标准算法,但您不能使用默认的 C# RSACryptoServiceProvider。 RSA 只是 OpenPGP 的一种可能算法,此外,您还需要一些对称加密算法,如 AES(也可以使用)。但是还有其他问题:您需要为 OpenPGP message format, and OpenPGP defined its own cipher mode. Implementing all this on your own will not only be a hassle involving incompatibilities (an incomplete list exists in the RFC, but also has lots of ways to include security issues 实现一个生成器(并且已经提出了一些更有趣的攻击,并通过现有的实现如 GnuPG 减轻了攻击)。

如果您想在 C# 中使用 OpenPGP,最后归结为以下备选方案:

  • use GnuPG through GPGME(但包装器似乎仍处于 alpha 状态),
  • 使用 BouncyCastle,它具有多种加密协议的本机实现,包括用于 C# 和 Java 的 OpenPGP,但 C# 实现似乎不太广泛且功能不强,
  • SharpPrivacy 是另一种实现,但似乎已死
  • 直接连接 GnuPG 命令行

所有这些都有优点和缺点。可能 BouncyCastle 将是最好的方式,如果它不支持所需的功能,您可能不得不放弃在命令行上调用命令 GnuPG。