0

.Net .4.7
Ранняя тема

Подскажите, если при нажатие кнопки у меня генерируются ключи, я добавляю их в класс RSAKeys и сохраняю локально приватный и публичный ключи RSA в папку то после открытие формы заново подгрузить данные свойства ключей (Если папку с к ключами уже есть) ? Чтобы повторно не создавать.

Класс свойства ключей:

public class RSAKeys
{
        public string PublicKeyXML { get; set; }
        public string PrivateKeyXML { get; set; }
        public string FileName { get; set; }
    public RSAKeys(string parPublicXMLKey, string partPrivateXMLKey)
    {
        PrivateKeyXML = partPrivateXMLKey;
        PublicKeyXML = parPublicXMLKey;
    }

    public RSAKeys() { } // Добавил пустой конструктор, потому что без него просто ругается на добавление аргументов.

    public override string ToString() => FileName;

}

Класс для управления ключами:

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
BindingList<RSAKeys> rsaKeys;

private void Form1_Load(object sender, EventArgs e)
{
  rsaKeys= new BindingList<RSAKeys>();

  listBox1.DataSource = rsaKeys;
  listBox1.DisplayMember = "FileName";
}

private void GenNewKEYS_Click(object sender, EventArgs e) // Button
{
  int i = 0;
  using (RSA rsa = new RSACryptoServiceProvider(2048)) // Generate a new 2048 bit RSA key
   {
      i++;
      string publicKeyXML = rsa.ToXmlString(true); // Открытый ключ RSA
      string PrivateKeyXML = rsa.ToXmlString(false); // Закрытый ключ RSA
      string fname = Path.GetFileName($"PrivateKey_#_{i}"); // Тут рандомно сохраняется

      RSAKeys key = new RSAKeys();
      key.PublicKeyXML = publicKeyXML;
      key.PrivateKeyXML = PrivateKeyXML;
      key.FileName = fname;

      rsaKeys.Add(key);
      File.WriteAllText(fname+".priv", PrivateKeyXML);
      File.WriteAllText(fname+".pub", publicKeyXML);
   }
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
   RSAKeys curKey = (RSAKeys)listBox1.SelectedItem;
   // curKey.PrivateKeyXML = System.IO.File.ReadAllLines(curKey.FileName+".xl").First();
   // далее что-то делаем с ключами

}

}

1 Answers1

1

Ну как-то так например

private void LoadKeys()
{
    string rootPath = ".";
    foreach (string path in Directory.EnumerateFiles(rootPath, "*.priv"))
    {
        string fname = Path.GetFileNameWithoutExtension(path);
        RSAKeys key = new RSAKeys();
        key.PublicKeyXML = File.ReadAllText(Path.Combine(path.GetDirectoryName(path), $"{fname}.pub"));
        key.PrivateKeyXML = File.ReadAllText(path);
        key.FileName = fname;
    rsaKeys.Add(key);
}

}

Кстати, если у на диске лежит приватный XML ключ, то в нем же и публичный лежит, сравните содержимое XML файлов, обнаружите что и там и там есть публичный ключ <Modulus>. Отсюда вывод, а зачем, собственно, для публичного ключа используете отдельный файл на диске, если одного хватит? Непонятно.

Расширение файла не надо выдумывать, используйте .xml, это же XML файлы, верно? Расширение обычно дается по формату данных в файле, а не по его назначению, для назначения есть имя, то что до расширения в имени файла.

Другими словами, храните в XML если приватный ключ сохраняете, то только один файл. Чтобы убрать из него публичный ключ, достаточно загрузить файл в RSACryptoServiceProvider и пересохранить как публичный rsa.ToXmlString(true).

aepot
  • 49,560
  • Хмм, прикольно) Можно считать всё из одного файла, а я что-то пропустил как-то этот вариант ( То есть по сути мне просто нужно прочитать через File.ReadAllLines найти нужную строку до куда читать и всё получается. – ZuPoo Switch Nov 03 '22 at 10:13
  • @ZuPooSwitch я не об этом писал, а о том, что публичный ключ присутствует в файле с приватным, то есть экземпляр шифровальщика можно проинициализировать полностью и при желании извлечь из него только публичный ключ для передачи. Хранить все ключи в одном файле конечно можно, но смысл? – aepot Nov 03 '22 at 10:35
  • @ZuPooSwitch а что не так с решением, почему не принимаете? – aepot Nov 03 '22 at 17:49
  • 1
    не переживайте) Галочку ставлю когда есть возможность. Просто занят был. А так спасибо что помогаете! – ZuPoo Switch Nov 03 '22 at 22:49