Создание RSACryptoServiceProvider из открытого ключа (не сертификата)

Я работаю над проектом, в котором мне нужно использовать «открытый ключ» для шифрования сообщения с использованием алгоритма RSA. Мне был предоставлен сертификат, и моей первой мыслью было использовать открытый ключ из этого сертификата, и после изучения я узнал, что мне нужно использовать RSACryptoServiceProvider для шифрования.

Я проверил msdn и единственный метод, который, по моему мнению, мне следует использовать, это RSACryptoServiceProvider.ImportCspBlob(byte[] keyBlob). Когда я попытался использовать открытый ключ, экспортированный из сертификата, я получил сообщение об ошибке, что данные заголовка для сертификата недействительны.

Я знаю, что могу преобразовать X509certificate2.PublicKey.Key в RSACryptoServiceProvider, но из того, что я понял от своего клиента, в будущем мне будет предоставлен только открытый ключ, а не сертификат. Этот ключ необходимо сохранить в файле конфигурации .xml.

Итак, подведем итог: есть ли способ сгенерировать RSACryptoServiceProvider, учитывая только открытый ключ сертификата?


person IamDev2013    schedule 12.04.2013    source источник


Ответы (2)


Вы можете попробовать посмотреть на этот пример: Шифрование с открытым ключом RSA в C#

var publicKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

var testData = Encoding.UTF8.GetBytes("testing");

using ( var rsa = new RSACryptoServiceProvider(1024))
{
    try
    {
        // client encrypting data with public key issued by server
        //
        rsa.FromXmlString(publicKey);
        var encryptedData = rsa.Encrypt(testData, true);

        var base64Encrypted = Convert.ToBase64String(encryptedData);

    }
    finally
    {
        rsa.PersistKeyInCsp = false;
    }
}
person Julian    schedule 09.11.2015

Вы в порядке и следуете хорошему типичному образцу. Отправителю данных не нужен закрытый ключ.

Следующее может подтвердить часть кода, который вы уже выяснили. Одну строку, где я устанавливаю закрытый ключ для приемника/декодера, я пропустил. Я взял это из тестового примера, который у меня есть в моем материале для развертывания сборки.

 byte[] certBytAr;  // This is the certificate as bianry in a .cer file (no  private key in it - public only) 

 X509Certificate2 cert2 = new X509Certificate2(certBytAr);


 string strToEncrypt = "Public To Private Test StackOverFlow PsudeoCode. Surfs Up at Secret Beach.";
 byte[] bytArToEncrypt = Encoding.UTF8.GetBytes(strToEncrypt);

 RSACryptoServiceProvider rsaEncryptor = (RSACryptoServiceProvider)cert2.PublicKey.Key; 

 byte[] dataNowEncryptedArray = rsaEncryptor.Encrypt(bytArToEncrypt, true);

 // done - you now have encrypted bytes 
 // 

  // somewhere elxe ...
 // this should decrpyt it - simulate the destination which will decrypt the data with the private key 

 RSACryptoServiceProvider pk =   // how this is set is complicated 

 // set the private key in the x509 oobject we created way above 
 cert2.PrivateKey = pk; 

 RSACryptoServiceProvider rsaDecryptor = (RSACryptoServiceProvider)cert2.PrivateKey;
 byte[] dataDecrypted = rsaDecryptor.Decrypt(dataNowEncryptedArray, true);

 Console.WriteLine(" encrypt 1 Way Intermediate " + BitConverter.ToString(dataDecrypted));

 string strDecodedFinal = Encoding.UTF8.GetString(dataDecrypted);

 if (strDecodedFinal == strToEncrypt)
 {

 }
 else
 {
     Console.WriteLine(" FAILURE OF  ENCRYPTION ROUND TRIP IN SIMPLE TEST (Direction: Public to Private). No Surfing For You ");
  }
person Sql Surfer    schedule 10.11.2015