Импорт закрытого ключа RSA, созданного с помощью GnuPG, в C #

Я хочу подписать некоторые вещи в моем приложении C #, но мне нужно сделать это с помощью закрытого ключа RSA, который я ранее сгенерировал с помощью GnuPG, вместо одного нового ключа, сгенерированного в самом приложении.

Я могу экспортировать ключ RSA с помощью GnuPG и получить что-то вроде (обратите внимание, что я пропустил здесь большинство строк, это просто пример):

-----BEGIN PGP PRIVATE KEY BLOCK-----
lQOYBFXlhWwBCACfOGAw5Qr5ddFvDFZlDmys18KRV3XawArMiPe4hzivsEB3h+M1
df12Pz3l6IWnUJ/nJt/ZohwCOjm93+zT3xmGcAL9mh/lez6+UoQB8uB0hJ1ltLnZ
8RumvpExXJ2c6LfmaLrwyLHLUSAu8mfV6KoLtD9OxHkIdHktKpBzIPkLG9lRNAmN
kzjI9sz7pLq80+YevPA60niI0SBwbmJTHluvEQB32BkcEQ==
=u3H/
-----END PGP PRIVATE KEY BLOCK-----

Теперь вопрос: как я могу импортировать это в подсистему криптографии C #, чтобы я мог использовать его для подписи?


person Fran Marzoa    schedule 01.09.2015    source источник
comment
Попробуйте Xca инструмент для Windows для генерации ключей.   -  person i486    schedule 01.09.2015


Ответы (2)


Встроенная крипто-библиотека C # поддерживает только X.509, но не OpenPGP; оба несовместимы, хотя в основном используют одни и те же криптографические алгоритмы. Возможно, вам удастся извлечь простые числа RSA и каким-то образом импортировать их, но библиотеки по-прежнему не смогут выдавать действительный вывод OpenPGP.

Вместо этого используйте библиотеку Bouncy Castle, которая представляет собой реализацию OpenPGP для C # (или интерфейс GnuPG, например, через GPGME, но привязка C # все еще является альфа-версией).

person Jens Erat    schedule 01.09.2015
comment
Спасибо за Ваш ответ. Я использую C # внутри Unity, который имеет некоторые ограничения, поэтому по возможности предпочитаю избегать сторонних библиотек. Что, если я вместо этого экспортирую свой GPG-ключ в X509? Можно ли было бы импортировать такой ключ в мой код C #? - person Fran Marzoa; 01.09.2015
comment
Чего ты хочешь добиться? Если вы хотите иметь подписи OpenPGP, вы не можете сделать это без дополнительных библиотек. Если они вам не нужны, я предлагаю с самого начала сгенерировать сертификаты / ключи X.509. - person Jens Erat; 01.09.2015
comment
Возможно, вы правы в этом. Мне просто нужно подписать запрос и отправить его на сервер, проверяет ли скрипт PHP подпись с помощью этой функции: php.net/manual/en/function.openssl-verify.php Я думал, что эти вещи достаточно стандартны, поэтому ключ RSA всегда будет ключом RSA, а некоторые подписаны Ключ RSA можно будет проверить любым программным обеспечением, поддерживающим подпись RSA. Вроде ошибался и форматов и вариаций много ... :-( - person Fran Marzoa; 01.09.2015
comment
Насколько я понимаю библиотеки криптографии C #, вы должны иметь возможность использовать сертификаты X.509, которые поддерживаются изначально. На стороне PHP вы можете использовать библиотеку OpenSSL для проверки этих подписей. Также должна быть поддержка практически всех доступных платформ. Преобразование ключа все еще не кажется мне разумным и просто добавляет дополнительных усилий без пользы. - person Jens Erat; 01.09.2015
comment
Я согласен с твоей точкой зрения. Более того, не могу ли я добиться того же, просто используя класс SslStream из клиентского приложения с его собственным сертификатом и обрабатывая все на другой стороне с помощью встроенных возможностей Apache SSL? Таким образом, скрипту PHP просто нужно будет спросить сервер Apache, аутентифицирован ли клиент. Думаю, это упростит задачу. В любом случае, я выбираю ваш ответ как лучший для моего вопроса, потому что он точный и первый, который я получил: подытоживая, ответ на этот вопрос заключается в том, что я не могу напрямую использовать эти ключи GPG в C # код без сторонних библиотек. - person Fran Marzoa; 01.09.2015
comment
Если вам нужна только аутентификация, ваше предложение кажется вполне разумным. Минимум усилий и распространенная и проверенная технология. - person Jens Erat; 01.09.2015

То, что вы процитировали, не совсем «ключ RSA», а защищенный закрытый ключ OpenPGP, который, вероятно, включает в себя материал ключа RSA, а также включает другие вещи.

Как сказано в другом ответе, вам будет сложно импортировать его в C # (особенно в Unity) без сторонней библиотеки. Если вам это нужно как одноразовая операция, вы можете взять наш SecureBlackbox (будет достаточно оценки), загрузить ключ OpenPGP, затем взять материал ключа и сохранить его в формате, который вы можете загрузить в Unity позже.

Если вы планируете выполнять такие операции на регулярной основе, имеет смысл написать генератор ключей на C # и генерировать ключи RSA, подходящие для ваших нужд, без OpenPGP.

person Eugene Mayevski 'Callback    schedule 01.09.2015
comment
Большое спасибо! Это тоже неплохая идея, но тогда мне придется иметь дело с серверной частью, которая вместо этого распознает ключи, сгенерированные C #. Думаю, я попробую использовать SSL, который, кажется, является хорошо зарекомендовавшим себя стандартом, и посмотрю, что из этого получится ... - person Fran Marzoa; 01.09.2015