Как импортировать частный ключ PKCS#8 RSA (созданный OpenSSL) в C#

StackOverflow https://stackoverflow.com/questions/1722305

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top