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

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

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

3 ответа

Решение

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

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

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

Начиная с .Net Core 3:

      using System.Security.Cryptography;

// ...

// I had my PK in base64
var pkBase64 = "MIIEvQI...";

var rsa = RSA.Create(); 
rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(pkBase64), out _);

Для справки: https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsa.importpkcs8privatekey?view=net-5.0

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

Мой скрипт для создания ключа 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

Другие вопросы по тегам