Исследование текстовых файлов и обработка строк
Следующий шаг: использование оператора Xor
Описанная выше схема шифрования довольно безопасна для текстовых файлов, так как она сдвигает значение ASCII-кода символа на единицу. Однако если вы храните результат шифрования в виде текста в текстовом файле, то будьте осторожны при сдвиге ASCII-кодов более чем на несколько символов. Помните, что сильный сдвиг ASCII-кодов (такой, как добавление к каждому символу числа 500) не даст реальных символов ASCII, которые в дальнейшем могут быть расшифрованы. Например, добавление 500 к ASCII-коду буквы "A" (65) даст в результате 565. Это значение не может быть преобразовано в символ с помощью функции Chr и приведет к возникновению ошибки.
Безопасным обходом этой проблемы является преобразование при шифровании вашего файла букв в числа таким образом, что вы сможете обратить шифрование, не зависимо от того, на сколько большое (или маленькое) число взято. Если вы последуете этой линии рассуждений, то сможете применить к числам математические функции - умножение, логарифмы и т.д. - до тех пор, пока вы будете точно знать, как вернуть первоначальный текст.
Одно из наилучших инструментов для шифрования числовых значений уже встроено в Visual Basic. Этим инструментом является оператор Xor, который выполняет операцию "исключающее или" - функцию, выполняемую с битами, из которых состоит число. Оператор Xor можно изучить с помощью простой функции MsgBox. Например, оператор программы
MsgBox(Asc("A") Xor 50)
отобразит при его выполнении компилятором Visual Basic в окне сообщения числовой результат 115. Точно также, оператор программы
MsgBox(115 Xor 50)
отобразит в окне сообщения результат 65, являющийся ASCII-кодом буквы "A" (наше оригинальное значение). Другими словами, оператор Xor дает результат, который может быть обращен - если снова использовать для результата первой операции оригинальный код Xor. Такое поведение функции Xor используется во многих популярных алгоритмах шифрования. Оно может усложнить расшифровку ваших секретных файлов.
Теперь запустите программу Xor Encryption и посмотрите, как работает оператор Xor в созданной вами утилите создания заметок.
Шифрование текста с помощью оператора Xor
- Закройте решение Encrypt Text, а затем откройте проект Xor Encryption, расположенный в папке c:\vbnet03sbs\Гл.12\xor encryption.
- Чтобы запустить программу, щелкните на кнопке Start (Начать).
-
Введите для шифрования текстового файла следующий текст (или ваш собственный):
Указ Ротара (Ломбардия, Италия, около 643 г.) 296. О краже винограда. Тот, кто возьмет с лозы другого человека более трех гроздей винограда, должен уплатить в качестве компенсации шесть сольдо. Тот, кто возьмет меньше трех, не несет никакого наказания.
- В меню Файл щелкните на команде Сохранить зашифрованный файл как и сохраните этот файл в папке c:\vbnet03sbs\Гл.12 под именем oldlaws.txt. Программа запросит у вас секретный код шифрования (число), которое будет использоваться для шифрования файла и его последующей расшифровки. (Заметьте - для расшифровки файла необходимо запомнить этот код.)
-
Введите 500 или любой другой числовой код, а затем нажмите на (Enter), как показано ниже.
Visual Basic шифрует текст с помощью оператора Xor и сохраняет его на диск как набор чисел. На экране вы не увидите никаких изменений, но будьте уверены, что программа создала на диске зашифрованный файл. (В этом можно убедиться с помощью текстового процессора или текстового редактора.)
- Чтобы очистить текст в текстовом поле, щелкните на команде Закрыть в меню Файл программы. Теперь необходимо восстановить зашифрованный файл.
- В меню Файл щелкните на команде Открыть зашифрованный файл.
- Откройте папку c:\vbnet03sbs\Гл.12, а затем дважды щелкните мышью на файле oldlaws.txt.
-
Введите в появившемся диалоговом окне кода шифрования число 500, а затем щелкните на OK. (Если вы использовали другой код шифрования, то введите его.) Программа открывает файл и восстанавливает текст с помощью оператора Xor и указанного вами кода шифрования.
- В меню Файл щелкните на команде Выход и завершите программу.
Изучение кода шифрования
Оператор Xor используется как в процедуре события mnuSaveAsItem_Click, так и в процедуре события mnuOpenItem_Click. К настоящему моменту эти общие процедуры обработки меню должны быть вам знакомы. Процедура события mnuSaveAsItem_Click содержит следующие операторы программы:
Dim letter As Char Dim strCode As String Dim i, charsInFile, Code As Short SaveFileDialog1.Filter = "Текстовые файлы (*.txt)|*.txt" SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName <> "" Then strCode = InputBox("Введите ключ шифрования") If strCode = "" Then Exit Sub 'если сделан щелчок на отмене 'сохраняем текст с помощью схемы шифрования Code = CShort(strCode) charsInFile = txtNote.Text.Length FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output) For i = 0 To charsInFile - 1 letter = txtNote.Text.Substring(i, 1) 'преобразуем в число с помощью Asc, а затем используем Xor для 'шифрования Print(1, Asc(letter) Xor Code) 'и сохраняем в файле Next FileClose(1) mnuCloseItem.Enabled = True End If
В функции Print, использованной здесь впервые, оператор Xor используется для преобразования каждого символа из текстового поля в числовой код, который затем сохраняется на диск. (До сих пор в этой лекции я использовал функцию PrintLine, которая копировала в файл целую строку, но в данном случае более целесообразно копировать по одному числу.)
Конечный результат этого шифрования получается не текстовым, а числовым - это поставит в тупик даже самого настойчивого шпиона. Например, следующая иллюстрация показывает зашифрованный файл, полученный в результате использования приведенной выше процедуры шифрования, открытый в блокноте Windows. Чтобы вы могли увидеть весь код, я включил опцию Word Wrap (Перенос по словам).
Процедура события mnuOpenItem_Click содержит следующие операторы программы:
Dim ch As Char Dim strCode As String Dim Code, Number As Short Dim Decrypt As String = "" OpenFileDialog1.Filter = "Текстовые файлы (*.TXT)|*.TXT" OpenFileDialog1.ShowDialog() ' отображаем диалоговое окно Open If OpenFileDialog1.FileName <> "" Then Try 'открываем файл и перехватываем все ошибки с помощью обработчика strCode = InputBox("Enter Encryption Code") If strCode = "" Then Exit Sub 'если сделан щелчок на отмене Code = CShort(strCode) FileOpen(1, OpenFileDialog1.FileName, OpenMode.Input) Do Until EOF(1) 'читаем строки из файла Input(1, Number) 'читаем зашифрованные числа ch = Chr(Number Xor Code) 'преобразуем с помощью Xor Decrypt = Decrypt & ch 'и создаем строку Loop txtNote.Text = Decrypt 'затем отображаем преобразованную строку lblNote.Text = OpenFileDialog1.FileName txtNote.Select(1, 0) 'удаляем выделение текста txtNote.Enabled = True 'включаем текстовый курсор mnuCloseItem.Enabled = True 'включаем команду Close mnuOpenItem.Enabled = False 'отключаем команду Open Catch MsgBox("Ошибка при открытии файла .") Finally FileClose(1) 'закрываем файл End Try End If
Когда пользователь щелкает на команде Открыть зашифрованный файл , эта процедура события открывает зашифрованный файл, запрашивает у пользователя код шифрования и отображает в объекте текстового поля преобразованный файл. Функция Input, представленная здесь впервые, читает из зашифрованного файла по одному числу и сохраняет его в короткой целочисленной переменной Number. ( Input тесно связана с LineInput, но функция Input читает из файла только один символ, а не целую строку.) Затем переменная Number с помощью оператора Xor объединяется с переменной Code, а результат преобразуется с помощью функции Chr в символ. Затем эти символы (сохраненные в переменной ch типа Char ) объединяются со строковой переменной Decrypt, которая хранит весь расшифрованный файл, как показано здесь:
ch = Chr(Number Xor Code) 'преобразуем с помощью Xor Decrypt = Decrypt & ch 'и создаем строку
Техники шифрования, подобные этой, полезны и могут также использоваться в образовательных целях. Так как шифрование в большой степени основано на обработке строк, это хороший способ попрактиковаться в базовых и очень важных приемах программирования на Visual Basic. Только убедитесь, что вы не потеряете ваш ключ шифрования!