Как импортировать PKCS # 8 RSA privateKey (созданный OpenSSL) в C # - PullRequest
3 голосов
/ 12 ноября 2009

Я пытаюсь найти способ чтения privateKey, созданного с использованием OpenSSL PKCS # 8 RSA в C # без использования внешней библиотеки.

Кто-нибудь знает, как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2009

Самый простой способ сделать это с внешней библиотекой - это использовать (бесплатно) Компонент открытого / закрытого ключа Chillkat : с помощью этого можно импортировать ключ, используя всего несколько строк кода , и если вы готовы заплатить около 149 долл. США за оставшуюся часть библиотеки, это также значительно облегчит работу с общими понятиями шифрования.

И, в отличие от обычной платформы Microsoft .NET Framework, в проекте Mono реализована реализация PKCS8 , для которой доступен полный исходный код C # . Это может послужить отправной точкой, если вы абсолютно не можете полагаться на внешние библиотеки, если у вас работает лицензия (LGPL 2.0), связанная с кодом Mono ...

Наконец, формат PKCS # 8 не слишком сложен для анализа, и объекты пары ключей RSA / DSA соответствуют PKCS # 11 и относительно просты для преобразования в .NET X509Сертифицируйте, как только вы выясните, куда идут все эти биты - я действительно делал это в VB.NET некоторое время назад, но, к сожалению, не могу поделиться этим кодом.

2 голосов
/ 13 ноября 2009

Спасибо за ваш ответ.

Мой скрипт для создания ключа RSA, который я использовал OpenSSL с:

(Linux Script)

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 Consulting

...