Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
dagdag
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 5
#1

Как упаковать поток до его шифрования?

25.01.2017, 11:18. Просмотров 253. Ответов 2
Метки нет (Все метки)

Добрый день, прошу подсказки, прямо морок какой то - сам не могу сообразить, хоть убейся

Уже давно пишу для супруги бухгалтерское приложение, в нем есть передача данных между компьютерами. То есть берем нужный датасет, выгружаем в хмл, попутно шифруя (передача идет через интернет и имхо так оно правильнее). Все это выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        public static void LoadCryptoDataSet(DataSet ds, string Dir, string Name, string CryptoKey)
        {
            Rijndael crypto = Rijndael.Create();
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(CryptoKey, СОЛЬ);
            crypto.Key = pdb.GetBytes(32);
            crypto.IV = pdb.GetBytes(16);
            crypto.Padding = PaddingMode.PKCS7;
 
            using (FileStream stream = new FileStream(Dir + @"" + Name, FileMode.Open))
            {
                using (CryptoStream cryptoStream = new CryptoStream(stream, crypto.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    ds.ReadXml(cryptoStream);
                    cryptoStream.Close();
                    stream.Close();
                }
            }
        }
 
        public static void SaveCryptoDataSet(DataSet ds, string Dir, string Name, string CryptoKey)
        {
            Rijndael crypto = Rijndael.Create();
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(CryptoKey, СОЛЬ);
            crypto.Key = pdb.GetBytes(32);
            crypto.IV = pdb.GetBytes(16);
            crypto.Padding = PaddingMode.PKCS7;
 
            File.Delete(Dir + @"" + Name);
 
            using (FileStream stream = new FileStream(Dir + @"" + Name, FileMode.OpenOrCreate))
            {
                using (CryptoStream cryptoStream = new CryptoStream(stream, crypto.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    ds.WriteXml(cryptoStream);
                    cryptoStream.Flush();
                    stream.Flush();
                    cryptoStream.Close();
                    stream.Close();
                }
            }
        }
Работает это давно и беспроблемно, но тут понадобилось работать с совсем медленным каналом связи, а значит данные надо паковать, причем до их шифрования (после они совершенно не жмутся).

Вот и вопрос - как в конструкцию ds.WriteXml(cryptoStream) встроить еще и какой нибудь GZipStream, чтобы данные выгружались в поток-xml, упаковывались, шифровались и записывались в файл без каких либо промежуточных записей на диск?

Заранее очень благодарен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2017, 11:18
Ответы с готовыми решениями:

Текущий поток должен быть задан как поток однопоточного контейнера (STA), чтобы вызовы OLE стали возможны
пишет:Текущий поток должен быть задан как поток однопоточного контейнера (STA),...

Передача параметра в поток и его использование
Итак, есть код: private void button2_Click(object sender, EventArgs e) ...

Как User control упаковать в dll
Получил такое задание создать контрол и что бы он был в dll и как к его полям,...

Как упаковать папку с помощью ZipForge?
Это код робочий по распаковки архива zip ZipForge библиотекой ZIPFroge LIB...

Как правильно распарсить поток и преобразовать его для отображения в hex виде
Здравствуйте. Подскажите пожалуйста как преобразовать тот поток что читается из...

2
Storm23
Эксперт .NETАвтор FAQ
6108 / 3664 / 1387
Регистрация: 11.01.2015
Сообщений: 4,827
Записей в блоге: 31
25.01.2017, 13:19 #2
Цитата Сообщение от dagdag Посмотреть сообщение
Вот и вопрос - как в конструкцию ds.WriteXml(cryptoStream) встроить еще и какой нибудь GZipStream, чтобы данные выгружались в поток-xml, упаковывались, шифровались и записывались в файл без каких либо промежуточных записей на диск?
Просто вставкой еще одного стрима:
C#
1
2
3
4
5
6
            using (var stream = new FileStream(Dir + @"" + Name, FileMode.Create))
            {
                using (var cryptoStream = new CryptoStream(stream, crypto.CreateEncryptor(), CryptoStreamMode.Write))
                using (var zip = new GZipStream(cryptoStream, CompressionMode.Compress))
                    ds.WriteXml(zip);
            }
И кстати Flush() и Close() - не нужны, это все вызывается автоматически при использовании using.
1
dagdag
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 5
25.01.2017, 16:03  [ТС] #3
Storm23, Спасибо Вам!!! Все чудесно упаковывается - распаковывается разница в размере файла - раз в 10 (!!!)
И кстати Flush() и Close() - не нужны, это все вызывается автоматически при использовании using.
Совершенно не помню, какие были причины писать так, это было написано сто лет назад...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2017, 16:03

Вызывающий поток не может получить доступ к объекту, так как его владельцем является другой поток
Есть форма MainWindo, есть класс AB. В форме единая точка доступа к элементам...

Как создать свой поток и связать его с консолью
Собственно возник такой вопрос: читаю Саттера пробую создать свой класс...

Как обновить прогресс бар, если основной поток ждет его
привет, вопрос как обновить прогресс бар, если основной поток ждет его?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru