如何使用C#对OpenPGP密钥进行加密?

5

我被要求添加一个系统,使公司能够加密文件,以便我们可以将它们发送给第三方,并运行一些操作。第三方已经给了我一个公钥,格式如下:

-----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类中?还是说需要更多的操作?我之前没有使用过PGP,我想知道如何使用这个密钥来加密数据。


不行,这个密钥是RSA密钥吗?即使是,你也需要将其转换为“RSACryptoServiceProvider”可以导入的格式。 - Yacoub Massad
你可能需要Bouncy Castle或其他实现PGP的库。 - Ňɏssa Pøngjǣrdenlarp
2个回答

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命令行。

@Brandon 注意,BouncyCastle在其OpenPGP实现中存在兼容性问题。我们多次遇到这些问题,当第三方软件和我们的SecureBlackbox库无法处理它们的文件时。 - Eugene Mayevski 'Callback

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接