Как зашифровать с помощью закрытого ключа в c # (RSA)

#c# #asp.net #.net #asp.net-mvc #bouncycastle

#c# #asp.net #.net #asp.net-mvc #bouncycastle

Вопрос:

вот что я хочу сделать

1. создайте пару открытого и закрытого ключей для шифрования

2. зашифруйте данные с помощью закрытого ключа

3. расшифруйте данные с помощью открытого ключа

я хочу зашифровать данные с помощью закрытого ключа, чтобы зашифрованные данные, которые я отправляю кому угодно,
могли быть расшифрованы моим открытым ключом,
гарантируя, что данные поступают от меня

вот что у меня есть прямо сейчас,
я использую RSACryptoServiceProvider класс

 var rsa = new RSACryptoServiceProvider();  
var   privateKey = rsa.ToXmlString(true);  
var  publicKey = rsa.ToXmlString(false);
  var text = "my messege";
  Console.WriteLine("RSA // Text to encrypt: "   text);
  var enc = Encrypt(text, publicKey);
  Console.WriteLine("RSA // Encrypted Text: "   enc);
  var dec = Decrypt(enc, privateKey);
  Console.WriteLine("RSA // Decrypted Text: "   dec);
  

мои методы
расшифровки

  public static string Decrypt(string data,string pvtK)
                  {
                      var rsa = new RSACryptoServiceProvider();
                      var dataArray = data.Split(new char[] { ',' });
                      byte[] dataByte = new byte[dataArray.Length];
                      for (int i = 0; i < dataArray.Length; i  )
                      {
                          dataByte[i] = Convert.ToByte(dataArray[i]);
                      }

                      rsa.FromXmlString(pvtK);
                      var decryptedByte = rsa.Decrypt(dataByte, false);

                      return _encoder.GetString(decryptedByte);
                  }
  

для шифрования

   public static string Encrypt(string data,string pubK)
                  {
                      var rsa = new RSACryptoServiceProvider();
                      rsa.FromXmlString(pubK);
                      var dataToEncrypt = _encoder.GetBytes(data);
                      var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false).ToArray();
                      var length = encryptedByteArray.Count();
                      var item = 0;
                      var sb = new StringBuilder();
                      foreach (var x in encryptedByteArray)
                      {
                          item  ;
                          sb.Append(x);

                          if (item < length)
                              sb.Append(",");
                      }

                      return sb.ToString(); 
                  }  
  

в настоящее время он работает нормально при шифровании с помощью открытого ключа и дешифровании с помощью закрытого ключа

теперь у меня есть две проблемы при расшифровке с помощью закрытого ключа

  1. Когда я передаю свой закрытый ключ для шифрования своего сообщения, оно расшифровывается, но когда я передаю свой открытый ключ для расшифровки этих данных, я получаю исключение неправильного ключа и не работаю

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

вот мой закрытый ключ

 <RSAKeyValue><Modulus>sHQOnB9obOy9UUvKolGBYUHyGNKXKC7ZqerB/pLQcOKKlhqXAB5KLPf62banbC5DLU5 Mhd25sq5KE5l/vEZeQLia np2TYwis8bNVQpLYh/Q2MmuldKzl4Al ziVH90NLe0fX6LiC5W9Q36HkzV16BKrHwLPljNNBNYWENl/p8=</Modulus><Exponent>AQAB</Exponent><P>vGAPI9BTSnOvVKQ9spTt7WaCb3j Dexy48VHbGV2 h1hKEA7pF4Mrog7VL7MCNp8G8XZIWh3sMa9VHn2bNv0mQ==</P><Q>78xcUFFtngtKxpr6pZssiXIlTThFo7X2zRiUsWLSUKDJlYlGELu8cGAxzbRYirk2psm92Fga1jAPNDhuzpVX9w==</Q><DP>dHcThTn89RAXO8ab2riXbequBEuTD3q8AbTsFsmYyMS3WBJ2jYYUYygZPqkELwkeKHGncC9NqP8G Z66S82mKQ==</DP><DQ>C7Zel myQfLpPxQYw/f1T 1MVx41gI6FtHTL5nIeNaP01KH00yJoTNDV/eceIAB14 WcqTF8dhO42mMbPmna9w==</DQ><InverseQ>ORoUweiOyF eEQ3F3 NU2IdcSYM5TRG/J73er1nBuyfz5QjKpOhSWqtl5W3mNmQmX8/WDv9bFzgE0jPdXQtFTQ==</InverseQ><D>B/agGpHcs7gpdFJNCYjpI5UHOPFdt6DWdPGVCLxI4oqIaG04Lfd8yU1cIyUE2eaEMWn1J9iUQEBoHWmp9vJozLbhzUdQUC tcrms4dys6U AhLTJ obpmlJczdVABSWlwFe1lnoJNqJN9QQyc4tVvcLKzy YPbhHvb66bfhVcqk=</D></RSAKeyValue>
  

Комментарии:

1. В учебнике RSA говорится, что подписание и шифрование — это одни и те же операции. Практичный, удобный RSA использует разные операции / параметры для шифрования и подписи, поэтому, если вы хотите подписать (что, я думаю, вы делаете — «гарантируя, что данные поступают от меня»), ищите это, а не шифрование.

2. Кроме того, ваш выбор метода для «упорядочивания» результата сомнителен — десятичное представление чисел через запятую действительно неэффективно по сравнению, например, с кодировкой Base 64. (Ваша кодировка увеличивает размер данных на 100-300%. Кодирование на базе 64 дает вам ~ 40%)

3. @Damien_The_Unbeliever не могли бы вы рассказать, возможно ли шифровать данные с помощью закрытого ключа при использовании класса RSACryptoServiceProvider?

4. Вы используете SignData или SignHash , а не Encrypt . А затем используйте Verify варианты на другом конце.

5. каждая нормальная библиотека, которая поддерживает закрытый ключ у отправителя -> открытый ключ у получателя, предоставит это как методы подписи / проверки (могут не иметь этих имен). Если они также поддерживают открытый ключ -> закрытый ключ, у них будут методы шифрования / дешифрования. Чтобы сделать вещи безопасными , вы не можете использовать RSA из учебника, в котором говорится, что подпись и шифрование — это одно и то же. У вас должно быть четыре разные операции. Это не «.NET вещь», это вещь криптографической безопасности. Если вы этого не понимаете, то при всем уважении, вам не следует писать криптографический код.