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

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

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

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

Спасибо!


person Hylke Bons    schedule 15.07.2010    source источник
comment
stackoverflow.com/questions/497428/ похоже, что он должен работать, нет?   -  person Chris B    schedule 06.06.2011


Ответы (2)


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

Мне нужно было создать закрытый и открытый ключи в 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/[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

Еще не все .....

person theDuck    schedule 28.05.2012

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

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

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

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

person Community    schedule 06.07.2011
comment
Нет, я думаю, что OpenSSL также может подписывать любое количество данных... вы используете комбинацию EVP_SignInit, ноль или несколько EVP_SignUpdate и EVP_SignFinal. Не так уж сложно реализовать ICryptoTransform и другие интерфейсы .NET Crypto поверх собственной оболочки OpenSSL, такой как openssl-net на sourceforge. - person maxwellb; 08.09.2011