Совместимость между RSACryptoServiceProvider и openSSL - PullRequest
12 голосов
/ 16 июля 2010

Я использовал класс .NET RSACryptoServiceProvider, чтобы получить пару ключей:

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

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

Спасибо!

Ответы [ 2 ]

8 голосов
/ 28 мая 2012

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

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

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

Запустите в Linux (или любой другой полезной ОС) и используйте openssl для создания закрытого ключа (private.pem), открытого ключа (public.pem), сертификата (certificate.crt) и личной информации.Обменный файл (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/emailAddress=info@example.com' -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 голосов
/ 07 июля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...