2013-07-14 2 views
2

Я создаю приложение для безопасного обмена сообщениями между несколькими клиентами. Для этого я шифрую сообщение с помощью AES, затем шифрую ключ AES с открытым ключом RSA получателей, а затем отправляю эти два компонента (RSA-зашифрованный ключ AES и AES-зашифрованное сообщение) получателю. Весь процесс работает хорошо и без ошибок.C# RSACryptoServiceProvider: как проверить, существует ли ключ в контейнере?

Теперь я столкнулся с проблемой, и мне интересно, какая была бы лучшая практика. Чтобы сохранить закрытый и открытый ключ одного участника, мне нужно сохранить пару ключей. Сохранение его где-то в виде XML-файла возможно, но, очевидно, не вариант. Поэтому решил использовать контейнер с ключом как described here. Реализация использования контейнера довольно проста, но как я могу это сделать?

  1. Проверьте, существует ли указанный контейнер?
  2. Проверьте, соответствует ли размер ключа заданному значению?

Насколько я вижу, это невозможно, потому что RSACryptoServiceProvider генерирует новый ключ, если контейнер не существует, не сказав этого. Но мне нужно знать, есть ли ранее сохраненная пара ключей, или если создан новый.

Как это исправить? Или это совершенно неправильный подход? Спасибо за вашу помощь!

С уважением, Роб

ответ

1

Попробуйте это:

public static bool DoesKeyExists(string containerName) 
    { 
     var cspParams = new CspParameters 
     { 
      Flags = CspProviderFlags.UseExistingKey, 
      KeyContainerName = containerName 
     }; 

     try 
     { 
      var provider = new RSACryptoServiceProvider(cspParams); 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 
     return true; 
    } 

похож вопрос: How to check if RSA key container exists in .NET

+0

Спасибо за ваш ответ, он работает. Но с июля ситуация изменилась - я больше не доверяю этому механизму. – Robert

+0

не забудьте вызвать 'provider.Dispose()' после того, как вы его создадите. – Mark

+0

Не будет ли это вызвано после того, как он покинет пределы? –

Смежные вопросы