Как правильно генерировать ключ RSA-2048?

103
22 марта 2021, 04:30

Подскажите как правильно сгенерировать приватный и закрытый ключ именно для RSA-2048

Я правильно понял что публичный ключём мы шифруем текст, а приватным мы должны расшифровать?!

[UPD]

Написал два метода получения ключей:

public string GetPrivateKey()
{
   RSAParameters privateKey;
   using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
   {
      privateKey = rsa.ExportParameters(true);
      rsa.PersistKeyInCsp = false;
   }
   return this.GetKeyString(privateKey);
}
public string GetPublicKey()
{
  RSAParameters publicKey;
  using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
  {
     publicKey = rsa.ExportParameters(false);
     rsa.PersistKeyInCsp = false;
  }
  return this.GetKeyString(publicKey);
}
public string GetKeyString(RSAParameters publicKey)
{
   try
   {
     using (StringWriter stringWriter = new StringWriter())
     {
       XmlSerializer xmlSerializer = new XmlSerializer(typeof(RSAParameters));
       xmlSerializer.Serialize(stringWriter, publicKey);
       return stringWriter.ToString();
     }
   }
   catch (Exception) { return string.Empty; }
 }

Приватный ключ получаю: [Урезал текст - слишком большой]

<?xml version="1.0" encoding="utf-16"?>
<RSAParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Exponent>AQAB</Exponent><Modulus>6VYDkCk8iLVq164PFa5vYJl2YmGFwoxowCqCa5vjb5e
/srIxu8wwV5CUkx8Z8iFELsF4OS2P4gsmjynIvxNbxjVSeIw/pUPZ....Q==</Modulus>
</RSAParameters>

Публичный ключ тоже получаю: [Урезал текст - слишком большой]

<?xml version="1.0" encoding="utf-16"?>
<RSAParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Exponent>AQAB</Exponent>
  <Modulus>xYzDfliXVCShKqgZoJGIIU9Y99+0+xyLQtQ==</Modulus>
  <P>3DdMxVQT3AGKMSbJj++2dwijjYtFasYJdEFyn8=</P>
  <Q>5aaUwQevrusHTfdLf4fBMwv3mJuHljdyz1gtOrcZLjLqSzS3Wppwss=</Q>
  <DP>GGKDP2T1ndoqB9aLc8=</DP>
  <DQ>e9jFGgfFcTdc=</DQ>
  <InverseQ>fruc1FUrCmmg80d/w=</InverseQ>
  <D>U2W4hhUuNz/+IfC2WEUsNugbbqRBQ==</D>
</RSAParameters>

Подскажите я всё правильно сделал?

Так же очень интересуют данные вопросы))

  • 1 - Как сохранить ключи в файл без xml формата?

  • 2 - Как писалось на других форумах в using ключ rsa сохраняется и.т.п и что нужно ставить rsa.PersistKeyInCsp = false; - правильно ли это?

  • 3 - Можно ли несколько раз вызывать RSACryptoServiceProvider в using ?

Answer 1

Я правильно понял что публичный ключём мы шифруем текст, а приватным мы должны расшифровать?!

Верно.

  1. RSAParameters имеет публичные поля (P, Q, Modulus, и т. д.). Они все простые массивы байт. Вы можете сохранить их в другом удобном для вас формате. И восстановить обратно просто записав массивы байт в пустой экземпляр.
  2. Это нужно делать только тогда, когда вы инициируете RSACryptoServiceProvider с именем контейнера для хранения ключей. По умолчанию никакой контейнер не используется, а значит ключ нигде не сохраняется. С документации:

    The PersistKeyInCsp property has no effect if the RSACryptoServiceProvider object is created with a null key container name.

  3. Только если вы импортируете ключ откуда-то. Создать новый ключ можно только создав новый экземпляр RSACryptoServiceProvider.
READ ALSO
Подокно в основном окне в Winforms

Подокно в основном окне в Winforms

У некоторых программ я видел такую картину:есть само окно и внутри него еще одно окно, вот как на пример в программе Origin: Есть основное окно...

92
Как задать timestamp в запросе к api литреса

Как задать timestamp в запросе к api литреса

Отправляю запрос к api Литреса для получения списка новых книг с определенной датыНо проблема в том, что если в качестве чекпоинта указать...

104
Не появляется notifyicon при вызове

Не появляется notifyicon при вызове

Есть пустая форма Form1 и присоедененная к ней notifyicon1В скрипте Form1

83
Resource не найден

Resource не найден

У меня есть ресурс:

95