Nano Hash - криптовалюты, майнинг, программирование

Получение зашифрованного файла Rich Text и отображение его в RichTextBox

ОК, мне нужно сохранить все, что напечатано в поле форматированного текста, в файл, зашифровать, а также снова получить текст из файла и показать его обратно в поле форматированного текста. Вот мой код сохранения.

private void cmdSave_Click(object sender, EventArgs e)
{
    FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);

    AesCryptoServiceProvider aes = new AesCryptoServiceProvider();

    aes.GenerateIV();
    aes.GenerateKey();
    aes.Mode = CipherMode.CBC;

    TextWriter twKey = new StreamWriter("key");
    twKey.Write(ASCIIEncoding.ASCII.GetString(aes.Key));
    twKey.Close();

    TextWriter twIV = new StreamWriter("IV");
    twIV.Write(ASCIIEncoding.ASCII.GetString(aes.IV));
    twIV.Close();

    ICryptoTransform aesEncrypt = aes.CreateEncryptor();

    CryptoStream cryptoStream = new CryptoStream(fs, aesEncrypt, CryptoStreamMode.Write);

    richTextBox1.SaveFile(cryptoStream, RichTextBoxStreamType.RichText);
}

Я знаю последствия для безопасности сохранения ключа и iv в файле, но это только для тестирования :)

Что ж, часть сохранения работает нормально, что означает отсутствие исключений... Файл создается в пути к файлу, и файлы ключа и IV тоже создаются нормально...

Хорошо, теперь для получения части, где я застрял: S

private void cmdOpen_Click(object sender, EventArgs e)
{
    OpenFileDialog openFile = new OpenFileDialog();

    openFile.ShowDialog();

    FileStream openRTF = new FileStream(openFile.FileName, FileMode.Open, FileAccess.Read);

    AesCryptoServiceProvider aes = new AesCryptoServiceProvider();

    TextReader trKey = new StreamReader("key");
    byte[] AesKey = ASCIIEncoding.ASCII.GetBytes(trKey.ReadLine());

    TextReader trIV = new StreamReader("IV");
    byte[] AesIV = ASCIIEncoding.ASCII.GetBytes(trIV.ReadLine());

    aes.Key = AesKey;
    aes.IV = AesIV;

    ICryptoTransform aesDecrypt = aes.CreateDecryptor();

    CryptoStream cryptoStream = new CryptoStream(openRTF, aesDecrypt, CryptoStreamMode.Read);

    StreamReader fx = new StreamReader(cryptoStream);

    richTextBox1.Rtf = fx.ReadToEnd();

    //richTextBox1.LoadFile(fx.BaseStream, RichTextBoxStreamType.RichText);        
} 

Но richTextBox1.Rtf = fx.ReadToEnd(); выдает криптографическое исключение "Заполнение недействительно и не может быть удалено".

в то время как richTextBox1.LoadFile(fx.BaseStream, RichTextBoxStreamType.RichText); выдает NotSupportedException "Поток не поддерживает поиск".

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

08.04.2010

  • Вам нужно закрыть потоки. 08.04.2010
  • На самом деле это не помогло :( Потому что исключение выбрасывается до того, как оно достигает операторов закрытия 08.04.2010
  • Да; у вас есть и другие проблемы. Тем не менее, вам все равно нужно закрыть свои потоки. Используйте оператор using. 08.04.2010
  • Спасибо! Я узнал об использовании оператора using из этого URL-адреса msdn .microsoft.com/en-us/library/yh598w02(VS.80).aspx 08.04.2010

Ответы:


1

Ваш IV и ключ никогда не записываются в файл с самого начала (судя по вашему save_cmd)

И то же самое касается вашего открытия. Между вашим ("Ключевым" потоком и вашим файлом нигде нет связи...)

Обновлено:

Вот лучшая версия вашего кода:

        private void button1_Click(object sender, EventArgs e)
    {


        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();

        aes.GenerateIV();
        aes.GenerateKey();
        aes.Mode = CipherMode.CBC;


        File.WriteAllBytes("Key",aes.Key);
        File.WriteAllBytes("IV",aes.IV);


        ICryptoTransform aesEncrypt = aes.CreateEncryptor();
        using (FileStream fs = new FileStream("file.crypt", FileMode.Create, FileAccess.Write))
        {
            using (CryptoStream cryptoStream = new CryptoStream(fs, aesEncrypt, CryptoStreamMode.Write))
            {

                richTextBox1.SaveFile(cryptoStream, RichTextBoxStreamType.RichText);
            }
        }

    }

       private void button2_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFile = new OpenFileDialog();

        openFile.ShowDialog();



        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();


        byte[] AesKey = File.ReadAllBytes("Key");
        byte[] AesIV = File.ReadAllBytes("IV");

        aes.Key = AesKey;
        aes.IV = AesIV;

        ICryptoTransform aesDecrypt = aes.CreateDecryptor();
        using (FileStream openRTF = new FileStream(openFile.FileName, FileMode.Open, FileAccess.Read))
        {
            using (CryptoStream cryptoStream = new CryptoStream(openRTF, aesDecrypt, CryptoStreamMode.Read))
            {

                using (StreamReader fx = new StreamReader(cryptoStream))
                {
                    richTextBox1.Rtf = fx.ReadToEnd();
                }
            }
        }

    }

Оно работает.

08.04.2010
  • Ключ и IV записываются отдельно в два разных файла с использованием twKey и twIV, принадлежащих TextWriter. (ключ и IV, эти два файла без расширения) TextWriter twKey = new StreamWriter(key); twKey.Write(ASCIIEncoding.ASCII.GetString(aes.Key)); twKey.Закрыть(); и тот же ключ и файл загружаются обратно с помощью TextReader. 08.04.2010
  • Неправильный; Я сначала сделал ту же ошибку. Он создает два файла с именами Key и IV. 08.04.2010
  • Да, ты прав! Я ошибался, полагая, что ключ загружается правильно :( На самом деле это другой ключ и iv, когда он загружается... Как мне правильно записать и получить ключ из файла? 08.04.2010
  • Обновил сообщение с вашим ответом ( File.ReadAllBytes и File.WriteAllBytes были тем, что вам нужно) 08.04.2010

  • 2

    Поскольку вы никогда не закрывали CryptoStream при сохранении, он никогда не вызывал FlushFinalBlock для завершения записи данных. Поэтому не все данные сохранились.

    08.04.2010

    3

    Хорошо, я отлично добился того, чего хотел. В моем коде было несколько ключевых сбоев... Во-первых, спасибо SLaks и Jipy, я понял, что "вы должны закрыть все потоки, которые были открыты" :)

    И вторая большая ошибка, которую я совершил, заключалась в попытке сохранить ключ и iv в файле, где на самом деле сохранение или загрузка его обратно не работали! Таким образом, у меня было только два байта [] для сохранения ключа и IV

    Я изменил схему заполнения на ISO10126 и убедился, что режим был CBC при открытии и закрытии команд.

    А еще мне нужно было добавить код в команду открытия, и это сработало :) :) :)

            StreamReader fx = new StreamReader(cryptoStream);
    
            fx.Read(fileContent, 0, Convert.ToInt32(fileContent.Length));
    
            fx.Close();
    
            cryptoStream.Close();
    
            richTextBox1.Rtf = new String(fileContent);
    

    В любом случае любые другие глупые проблемы с производительностью приветствуются :)

    Вот полные команды открытия и закрытия для всех, кто заинтересован.

        byte[] globalKey = new byte[32];
        byte[] globalIV = new byte[16];
    
        private void cmdSave_Click(object sender, EventArgs e)
        {
    
    
            FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
    
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
    
            aes.GenerateIV();
            aes.GenerateKey();
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.ISO10126;
    
            globalKey = aes.Key;
            globalIV = aes.IV;
    
    
            ICryptoTransform aesEncrypt = aes.CreateEncryptor();
    
            CryptoStream cryptoStream = new CryptoStream(fs, aesEncrypt, CryptoStreamMode.Write);
    
            richTextBox1.SaveFile(cryptoStream, RichTextBoxStreamType.RichText);
    
            cryptoStream.Close();
            fs.Close();
    
            richTextBox1.Clear();
    
    
        }
    
        private void cmdOpen_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
    
            openFile.ShowDialog();
    
            FileStream openRTF = new FileStream(openFile.FileName, FileMode.Open, FileAccess.Read);
    
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
    
    
            aes.Key = globalKey;
            aes.IV = globalIV;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.ISO10126;
    
    
            ICryptoTransform aesDecrypt = aes.CreateDecryptor();
    
            CryptoStream cryptoStream = new CryptoStream(openRTF, aesDecrypt, CryptoStreamMode.Read);
    
            FileInfo fileNFO = new FileInfo(openFile.FileName);
    
            char[] fileContent = new char[fileNFO.Length];
    
            StreamReader fx = new StreamReader(cryptoStream);
    
            fx.Read(fileContent, 0, Convert.ToInt32(fileContent.Length));
    
            fx.Close();
    
            cryptoStream.Close();
    
            richTextBox1.Rtf = new String(fileContent); 
    
    
    
        } 
    
    08.04.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..