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

Bra*_*don 5 c# cryptography rsa pgp openpgp

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

-----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-----
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*rat 5

尽管 OpenPGP 利用 RSA 和其他标准算法,但您不能使用默认的 C# RSACryptoServiceProvider。RSA 只是 OpenPGP 的一种可能的算法,此外您还需要一些对称加密算法,例如 AES(也可以使用)。但还有进一步的问题:您需要为OpenPGP 消息格式实现一个生成器,并且OpenPGP 定义了自己的密码模式。自己实现所有这些不仅会带来不兼容性的麻烦(RFC 中存在不完整的列表,而且还有很多方法来包含安全问题(并且已经提出了一系列进一步有趣的攻击,并通过现有的实现来缓解,例如GnuPG)。

如果您想在 C# 中使用 OpenPGP,最终可以归结为以下替代方案:

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

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