Как зашифровать ключи 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-----

Могу ли я вставить эту текстовую строку непосредственно, скажем, в класс RSACryptoServiceProvider в C# в качестве открытого ключа? Или есть нечто большее, чем это? Я раньше не работал с PGP и пытаюсь понять, что мне нужно сделать, чтобы зашифровать данные с помощью этого ключа.


person Brandon    schedule 11.12.2015    source источник
comment
Нет, ты не можешь. этот ключ является ключом RSA? даже если это так, вам нужно преобразовать его в формат, который RSACryptoServiceProvider может импортировать.   -  person Yacoub Massad    schedule 11.12.2015
comment
Вам, вероятно, понадобится Bouncy Castle или другая библиотека, реализующая PGP.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 11.12.2015


Ответы (2)


Хотя OpenPGP использует преимущества RSA и других стандартных алгоритмов, вы не можете использовать C# по умолчанию RSACryptoServiceProvider. RSA — это только один из возможных алгоритмов для OpenPGP, и, кроме того, вам нужен какой-нибудь симметричный алгоритм шифрования, такой как AES (который также будет доступен). Но есть и другие проблемы: вам нужно реализовать генератор для формата сообщений OpenPGP и OpenPGP определил свой собственный режим шифрования. Самостоятельная реализация всего этого будет не только проблемой, связанной с несовместимостью (неполный список существует в RFC, но также имеет множество способов включить проблемы безопасности ( было предложено множество других интересных атак, которые были смягчены с помощью существующих реализаций, таких как GnuPG).

Если вы хотите использовать OpenPGP из C#, в конце концов, это сводится к следующим альтернативам:

  • использовать GnuPG через GPGME (но оболочка все еще находится в альфа-состоянии),
  • используйте BouncyCastle, который имеет собственные реализации нескольких криптографических протоколов, включая OpenPGP, как для C#, так и для Java, но реализация C# кажется быть менее распространенным и не столь способным,
  • SharpPrivacy — еще одна реализация, но она кажется мертвой.
  • напрямую взаимодействовать с командной строкой GnuPG

Все они имеют преимущества и недостатки. Вероятно, BouncyCastle будет лучшим вариантом, если он не поддерживает необходимые функции, вам, вероятно, придется отказаться от вызова команды GnuPG в командной строке.

person Jens Erat    schedule 11.12.2015
comment
@Brandon имейте в виду, что у BouncyCastle есть проблемы совместимости в их реализации OpenPGP. Мы сталкивались с этими проблемами несколько раз, когда их файлы не могли быть обработаны сторонним программным обеспечением и нашей библиотекой SecureBlackbox. - person Eugene Mayevski 'Callback; 12.12.2015

Кажется, для этого есть библиотека C# на GitHub, но ей уже несколько лет. Я уверен, что это может указать вам правильное направление, если вы хотите реализовать собственное шифрование PGP. https://github.com/da2ce7/SharpPrivacy

Об этом также есть статья codeproject, но она довольно старая и ссылается на сайт, который, похоже, больше не работает. Вот ссылка на него для справки, а также http://www.codeproject.com/Articles/4284/SharpPrivacy-OpenPGP-for-C .

person bhmahler    schedule 11.12.2015