Страница: 1 | 2 | 3 |
Вопрос: Для знатоков. Есть проблема с RichTextBox1
Добавлено: 17.01.07 00:03
Автор вопроса: Георгич
Ответы
Всего ответов: 32
Номер ответа: 16
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #16
Добавлено: 23.01.07 22:44
Я ещё не отшлифовал свой код, надо поэкспериментировать, но на данном этапе получается так, что при шифровании если я оставляю тип (Dim B As Byte), то при дешифровке получаю ряды цифр, а если (Chr(B)), то получаю исходный файл с текстом , картинками и т.д. В очередной раз послушаю совет, поработаю над этим.
Номер ответа: 17
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #17
Добавлено: 24.01.07 08:24
по ходу ты все не верно делаешь, ибо при шифровании как правило используется массив байт.... создай тестовый проект со своим кодом и выложи его сюда.. пока не увижу код ничего более конкретного подсказать не смогу
Номер ответа: 18
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #18
Добавлено: 24.01.07 09:10
Интерфейс ICryptoTransform позволяет шифровать массив байт, также можно шифровать поток, если использовать CryptoStream (который в свою очередь использует методы интерфейса ICryptoStream для шифрования блоков байт).
Все остальное - это надстройки над этими двумя методами, в любом случае я бы хотел увидеть кодом, что значится под:
Номер ответа: 19
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #19
Добавлено: 24.01.07 18:56
Всё, я разобрался, просто при записи криптографического потока, по запарке использовал StreamWriter, а надо BinaryWriter и соответственно ни каких (Chr(B)).Полный порядок.
Номер ответа: 20
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #20
Добавлено: 24.01.07 19:29
Понятно , что создание ключей пропущено, создание случайного вектора , тоже пропущена
И их запись.
Ознакомительный пример на потоки :
Private Sub ButtonШифровать_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonШифровать.Click
Dim Трансформ As System.Security.Cryptography.ICryptoTransform = Rijndael.CreateEncryptor()
 im ПотокДанныхИзФайла As New System.IO.FileStream("C:\Файл Считывания.RTF", IO.FileMode.Open)
 im СчитатьДвоичный As New System.IO.BinaryReader(ПотокДанныхИзФайла)
 im B As Byte
 im ЗаписьПотокаФайл As New IO.FileStream("C:\Файл Записи.RTF", IO.FileMode.Create) Dim ЗаписатьДвоичный As New IO.StreamWriter(ЗаписьПотокаФайл)
 im cs As New System.Security.Cryptography.CryptoStream(ЗаписьПотокаФайл, Трансформ, Security.Cryptography.CryptoStreamMode.Write)
 im w As New System.IO.BinaryWriter(cs)
 o Until СчитатьДвоичный.PeekChar = -1
B = СчитатьДвоичный.Read
w.Write((B))
Loop
w.Flush()
cs.FlushFinalBlock()
ЗаписатьДвоичный.Close()
ЗаписьПотокаФайл.Close()
ПотокДанныхИзФайла.Close()
End Sub
Private Sub ButtonДешифратор_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonДешифратор.Click
 im B As Byte
'Создание интерфейса преобразования для дешифрования
 im Трансформ As System.Security.Cryptography.ICryptoTransform = Rijndael.CreateDecryptor
'Создание криптографического потока в режиме чтения
 im cs As New System.Security.Cryptography.CryptoStream(fs, Трансформ, Security.Cryptography.CryptoStreamMode.Read)
'Создание объекта чтения из файла
 im r As New System.IO.StreamReader(cs)
 im ЗаписьПотокаФайл As New IO.FileStream("C:\Дешифрованный файл.RTF", IO.FileMode.Create)
 im ЗаписатьДвоичный As New IO.BinaryWriter(ЗаписьПотокаФайл)
 o Until r.Peek = -1
B = r.Read
ЗаписатьДвоичный.Write((B))
Loop
cs.Close()
fs.Close()
ЗаписатьДвоичный.Close()
ЗаписьПотокаФайл.Close()
End Sub
Номер ответа: 21
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #21
Добавлено: 24.01.07 19:55
Пропустил одну строку в дешифровке её можно поставить перед Dim B As Byte
Dim fs As New System.IO.FileStream("C:\Файл Записи.RTF", IO.FileMode.Open)
Номер ответа: 22
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #22
Добавлено: 25.01.07 10:48
А это, я так полагаю, ты выложил отшлифованный код?
Номер ответа: 23
Автор ответа:
avdey
ICQ: 219571279
Вопросов: 34
Ответов: 486
Профиль | | #23
Добавлено: 25.01.07 10:57
Вместо Do...Loop можно ReadToEnd использовать...
Номер ответа: 24
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #24
Добавлено: 25.01.07 12:47
ReadToEnd ему не интересно.. ему даже блоками читать/писать не интересно, раз он это все по 1 байту делает.. А через некоторое время будет говорить что NET тормозит при шифровке больших файлов! )))
Номер ответа: 25
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #25
Добавлено: 25.01.07 21:50
Ну господа, вы прям накинулись на меня :
1)Насчёт отшлифованности , я не зря написал перед кодом «Ознакомительный пример на потоки :»
2) ReadToEnd и ReadBlock не является членом System.IO.BinaryWriter
3) Объект CryptoStream шифрует данные по одному блоку за раз , интересно какими блоками мне считывать при дешифровке?
4) Если Использовать в дешифровке ЗаписатьДвоичный.Write(r.ReadToEnd), то получаем текстовую ерунду, а не исходный файл, я пробовал.
5)На счёт, скорости, поместил в "C:\Файл Считывания.RTF" 30 стр.текста и 5 картинок (790 КБ)
Зашифровалось всё это на 6200 стр. за 2-3 сек., расшифровалось 1-2 сек.
Номер ответа: 26
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #26
Добавлено: 26.01.07 08:39
Георгич, к сожалению давно не работаю под VS2003 и не могу набросать для тебя пример, но твое решение явно неэффективное. Я считаю, что это некорректно читать/писать по 1 байту, хотя , разумеется, это ничему не противоречит. Но это очень сильно снизит эффективность приложения и нагрузит систему. Тебе необходимо использовать буфер, в который читать весь файл одним разом и писать одним разом.. либо, раз уж ты с потоками решил делать, то читать и писать блоками по 1024, 2048, 4096 & etc байт.
Номер ответа: 27
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #27
Добавлено: 26.01.07 08:47
Writer по определению предназначен для записи, и соответственно он не может читать..
Номер ответа: 28
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #28
Добавлено: 28.01.07 00:40
Да, совершенно верно, система загружается с пересчётом байтов, весьма сильно, разница особенно чувствуется когда я применил новый код , обидно, ведь я с него (с кода) начинал шифрование, оказывается есть огромная разница между (RichTextBox1.Text()) или (RichTextBox1.SelectedText()) с RichTextBox1.SelectedRtf
Ознакомительный пример:
Private Sub ButtonШифровать_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonШифровать.Click
RichTextBox1.LoadFile("c:\Файл.RTF" ' грузим файл в RichTextBox1, чтобы не создавать текст,картинки в ручную
Dim Трансформ As System.Security.Cryptography.ICryptoTransform = Rijndael.CreateEncryptor()
 im ЗаписьФайл As New IO.FileStream("C:\Файл Записи.RTF", IO.FileMode.Create)
)
 im cs As New System.Security.Cryptography.CryptoStream(ЗаписьФайл, Трансформ, Security.Cryptography.CryptoStreamMode.Write)
 im w As New System.IO.StreamWriter(cs)
RichTextBox1.SelectAll()
w.Write(RichTextBox1.SelectedRtf)
w.Flush()
cs.FlushFinalBlock()
w.Close()
End Sub
Private Sub ButtonДешифратор_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonДешифратор.Click
Dim fs As New System.IO.FileStream("C:\Файл Записи.RTF", IO.FileMode.Open)
 im Трансформ As System.Security.Cryptography.ICryptoTransform = Rijndael.CreateDecryptor
 im cs As New System.Security.Cryptography.CryptoStream(fs, Трансформ, Security.Cryptography.CryptoStreamMode.Read)
 im r As New System.IO.StreamReader(cs)
RichTextBox1.SelectedRtf = r.ReadToEnd
r.Close()
End Sub
Не массивов, не циклов, скорость шифровки и дешифровки высочайшая , картинки текст все на месте ,
Так что , думаю проблема решена.
Номер ответа: 29
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #29
Добавлено: 28.01.07 13:57
w.Write(RichTextBox1.SelectedRtf)
Выделять весь текст .. хм.. тоже не совсем корректно.. наверняка есть свойство позволяющее забрать весь rtf-текст без его предварительного выделения..
Номер ответа: 30
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #30
Добавлено: 28.01.07 14:05