Как импортировать 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