Как импортировать частный ключ PKCS#8 RSA (созданный OpenSSL) в C#
-
19-09-2019 - |
Вопрос
Я пытаюсь найти способ прочитать закрытый ключ, созданный с использованием OpenSSL PKCS#8 RSA на C#, без использования внешней библиотеки.
Кто-нибудь знает, как я могу это сделать?
Решение
Самый простой способ сделать это с внешняя библиотека, использует (бесплатную) Компонент открытого/закрытого ключа Chillkat:используя это, импорт ключа можно выполнить с помощью всего несколько строк кода и если вы готовы заплатить около 149 долларов за остальную часть библиотеки, это также значительно облегчит работу с общими концепциями криптографии.
И в отличие от обычного Microsoft .NET Framework, проект Mono делает кажется, есть Реализация PKCS8 для чего полный исходный код C# доступен.Это может подойти в качестве отправной точки, если вы абсолютно не можете полагаться на внешние библиотеки, при условии, что лицензия (LGPL 2.0), связанная с кодом Mono, вам подходит...
Наконец, Формат PKCS #8 не слишком сложно проанализировать, а объекты пары ключей RSA/DSA соответствуют ПККС №11 и его относительно легко преобразовать в сертификат .NET X509Certificate, как только вы выясните, куда идут все биты - я действительно сделал это в VB.NET некоторое время назад, но, к сожалению, не могу поделиться этим кодом.
Другие советы
Спасибо за Ваш ответ.
Мой сценарий для создания ключа RSA я использовал OpenSSL:
(Скрипт Linux)
openssl genrsa -out ${NAME}_openssl.key 2048
openssl pkcs8 -topk8 -in ${NAME}_openssl.key -nocrypt > ${NAME}.key
openssl req -new -x509 -key ${NAME}.key -out ${NAME}.crt -outform DER
В C# нам нужен PrivateKey в формате XML.я использовал этот парсер для этого.
Чтобы расшифровать вызов, нам нужно использовать:
byte[] challange = server.getChallenge();
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
rsaProvider.FromXmlString(Demo.Properties.Resources.XmlPrivateKey);
byte[] plaintext = rsaProvider.Decrypt(challange, false);
Чтобы зашифровать сертификат сервера, нам нужно использовать:
RSACryptoServiceProvider rsaProvider = x509.PublicKey.Key as RSACryptoServiceProvider;
byte[] answer = RsaProvider.Encrypt(plaintext, false);
Спасибо за консультацию по JavaScience