Подтвердить что ты не робот

Взаимодействие между RSACryptoServiceProvider и openSSL

Я использовал .NET class RSACryptoServiceProvider для получения пары ключей:

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
  File.WriteAllText ("PublicKeyOnly.xml", rsa.ToXmlString (false));
  File.WriteAllText ("PublicPrivate.xml", rsa.ToXmlString (true));
}

Теперь я хотел бы использовать это с openSSH, но формат ключа не похож ни на что. Кто-нибудь знает, как конвертировать как открытый, так и закрытый ключи в файлы, которые openSSH может использовать?

Спасибо!

4b9b3361

Ответ 1

Мне действительно нужно было обеспечить совместимость Openssl с RSACryptoServiceProvider, чтобы я мог реализовать систему лицензионного ключа программного обеспечения (Ref).

Мне нужно было создать частные и открытые ключи в Linux с помощью openssl, чтобы впоследствии они могли использоваться для управления лицензиями в веб-приложении PHP. Тем не менее, также используйте их в качестве основы для лицензионной системы подписи RSA в приложении VB.Net.

После недели поиска я в конце концов обнаружил, что это вполне возможно, поэтому я решил поделиться ею.

Начните с Linux (или любой другой полезной ОС) и используйте openssl для создания закрытого ключа (private.pem), открытого ключа (public.pem), сертификата (сертификата .crt) и файла личной информации Exchange ( certificate.pfx). Не беспокойтесь о полях CN и emailAddress, файлы сертификата и pfx используются только в качестве транспортного средства, чтобы открыть общедоступный или закрытый ключ в объект RSACryptoServiceProvider.

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
openssl req -nodes -x509 -days 3650 -subj '/CN=www.example.com/[email protected]' -new -key private.pem -out certificate.crt
openssl pkcs12 -export -out certificate.pfx -inkey private.pem -in certificate.crt

Теперь, чтобы получить секретный ключ в коде:

Dim cert As New X509Certificate2("certificate.pfx", "", X509KeyStorageFlags.Exportable)
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider)

Если вам нужен секретный ключ или открытый ключ, попробуйте это:

msgbox(rsaProvider.ToXmlString(True))  'Private key in XML format
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format

Чтобы получить открытый ключ в код:

Dim cert As New X509Certificate2("certificate.crt")
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PublicKey.Key, RSACryptoServiceProvider)

Если вам нужен открытый ключ, попробуйте это:

msgbox(rsaProvider.ToXmlString(False))  'Public key in XML format

Еще впереди.....

Ответ 2

В этом сообщении блога об использовании OpenSSL и RSACryptoServiceProvider указано, что это возможно, но автор закончил использование Chilkat RSA Библиотека в конечном итоге взаимодействует с OpenSSL изнутри С#. Формат PEM не поддерживается в мире .NET, поэтому вы можете использовать эту библиотеку из JavaScience под названием OpenSSLKey.cs; однако, как автор сообщения в блоге упоминает, что у него были проблемы из-за этого (quoted):

OpenSSL: может только подписывать небольшие биты данные, которые вписываются в один блок. Данные дополняются и подписываются. reverse называется "проверять" и в этом если данные "без знака", а затем неадаптированные, а исходные данные вернулся.

[Windows]: может подписать любое количество данные. Методы Sign * сначала данных, а затем хэш дополняется и подписан. Методы Verify * ожидают три входа: исходные данные, имя алгоритма хэша, а подпись данные. Исходные данные хэшируются и результат неупорядочения/ по сравнению с хешем оригинала данных.

Поэтому я рекомендую вам пойти с библиотекой RSA Chilkat.