Шрифт:
Интервал:
Закладка:
а = "secret text from kgb agent from newyork rezidentura…"
Пароль: может запрашиваться от пользователя: b = "password"
Итог шифрования: с = ""
Узнаем длины каждой из строк — пароля и исходного текста:
lentext = Len(а)
lenpass = Len(b)
Собственно шифрование:
For cn = 1 То lentext
В этой строке попробуйте разобраться самостоятельно. Здесь выполняется функция Хог с каждым символом исходной строки и соответствующим символом пароля, как бы "повторенным" на всю длину исходного текста. Mid берет из середины строки символ, Asc — превращает его в ASCII-код, Str — превращает число в строку, Trim — удаляет пробелы:
d = Trim(Str(Asc(Mid(a, cn, 1)) Xor Asc(Mid(b, ((cn — 1) Mod lenpass) + 1, 1))))
А теперь сделаем так, чтобы каждый символ занимал ровно три позиции, вне зависимости от величины его ASCII-кода. А иначе как потом при расшифровке разбивать строку на символы?
Select Case Val(d)
Case 0 To 9
d = "00" + d
Case 10 To 99
d = "0" + d
End Select
с = с + d
Ну вот и все, и так — с каждым символом из исходной строки:
Next cn
Теперь в переменной с — шифрованная строка, каждой исходной букве соответствует 3 символа. Ее можно записать, например, в документ:
Selection.TypeText Text:=c
End Sub
А теперь — программа расшифровки данных. Точно так же разберем ее по строкам.
Sub decrypt()
Dim а, b, с, d As String
Строка для расшифровки:
с = "003004016001018027082016021025007083017029029009"
Пароль:
b = "password"
Итог расшифровывания: а = ""
Узнаем длины каждой из строк:
lentext = Len(с)
lenpass = Len(b)
Собственно расшифровывание (попробуйте разобраться самостоятельно в структуре команды — это не так сложно):
For cn = 1 То lentext Step 3
а = а + Chr(Val(Mid(с, cn, 3)) Xor Asc(Mid(b, (Int(cn / 3) Mod lenpass) + 1, 1)))
Next cn
В итоге в переменной а — расшифрованная строка, ее можно записать в любое место — в документ, к примеру:
Selection.TypeText Text:=a
End Sub
Можно, конечно, еще добавлять в этот простой код всевозможные дополнения, например, функцию перевода строки цифр в строку символов, чтобы зашифрованный текст выглядел как бессмысленный набор букв. Но это — уже по желанию.
ОТКРЫТЫЙ И ЗАКРЫТЫЙ КОДЫ
Наверняка все слышали такие фразы: "Шифрование с открытым ключом", "Шифрование с закрытым ключом", "Публичный ключ". О том, что они означают, можно писать большие книги, однако стоит вкратце описать ситуацию для полноты изложения.
При шифровании с закрытым ключом для кодирования и расшифровки используется одна и та же последовательность символов в качестве пароля — ключа. Пример — тот, что описан выше. При шифровании же с открытым ключом используются две последовательности символов, причем зашифрованное с помощью первой последовательности можно расшифровать только с помощью второй, и наоборот. Обе последовательности связаны между собой по определенному закону, при этом из второй последовательности можно получить первую, но из первой вторую не узнаешь, — обратное преобразование невозможно.
Сгенерировав специальной программой пару таких последовательностей (называемых ключами), можно первую из них сообщить тому, от кого ждешь секретных посланий ("сообщить ему публичный ключ"), а вторую оставить себе и хранить как зеницу ока ("оставить себе секретный ключ"). То, что будет зашифровано отправителем этим публичным ключом, даже сам отправитель расшифровать не сможет. Это сможет сделать только обладатель секретного ключа.
Другое применение шифрования с открытым ключом — это электронная подпись, назначение которой — подтверждать неизменность электронного текста при пересылке или хранении. При ее использовании рассчитывается контрольная сумма (скажем, сумма всех кодов букв) сообщения, а затем она шифруется секретным ключом. Любой, у кого есть второй (публичный) ключ из этой пары, может расшифровать ее и, рассчитав самостоятельно контрольную сумму пришедшего сообщения, сравнить полученную величину с расшифрованной. При несовпадении этих двух величин можно думать о несанкционированном изменении текста сообщения в процессе пересылки.
Именно на таком принципе работает механизм шифрования PGP.
ОТВЕТЫ НА ВОПРОСЫ
Эта книга написана по мотивам цикла статей "Начала программирования на VBA", публиковавшегося в журнале "Мир ПК" в 2000–2001 годы. После публикации статей цикла мне пришло немало писем с различными вопросами о программировании. Ниже представлены ответы на наиболее интересные из них.
1.
"В документе я хочу защитить от изменений пользователем только рисунок. Могу ли я это сделать? Метод Protect, похоже, этого сделать не дает".
Нет. Microsoft Word делать это не позволяет.
Впрочем, можно пойти на хитрость. Создайте документ Doc1.doc и вставьте в него рисунок. Затем сохраните документ с рисунком, задав ему пароли на открытие и на изменения. Создайте документ Doc2.doc. В том месте, где должен быть рисунок, вызовите окно Вставка-Обьект-Создание из файла и укажите в пути файл doc1.doc, отметив предварительно пункт "Связь с файлом". Введите пароль на открытие — и рисунок в Вашем документе. Сохраните его.
Теперь при открытии файла doc2.doc рисунок будет виден, но при попытке изменить его будет запрашиваться пароль на открытие файла doc1.doc. Проблема остается в том, что оба файла — и с рисунком, и с текстом — должны присутствовать, причем в тех местах, где они были изначально. То есть вся эта конструкция труднопереносима.
2.
"Возможно ли в "Word, проводить сравнение двух документов по словам."
Да, разумеется. Откройте один из сравниваемых документов, выберите пункт меню "Сервис"-"Исправления"-"Сравнить версии" и выберите в открывшемся диалоговом окне второй файл для сравнения. Все разночтения будут выделены, в зависимости от их характера — зачеркиванием, цветом и др.
3.
"Как можно узнать количество страниц в Word2000 из макроса?"
С помощью команды
р = ActiveDocument.ComputeStatistics(wdStatisticPages)
где в переменную р запишется количество страниц в активном документе.
4.
"Сделал документацию на свою VBA-программу в "Word. 97 в doc-файле. Включил в нее screenshot 'ы, на которые наложил автофигуры "Word — выноски, стрелки, скобки, надписи и проч., что разъясняло бы назначение частей рисунков. Теперь хочется поставлять документацию в формате HTML, но. при конвертации "Word начисто игнорирует свои же автофигуры, оставляя в итоговых gif-файлах чистый рисунок. Как цивилизовано выйти из ситуации?"
Да, автофигуры Word97 при конвертации в HTML игнорируются. Для реализации желаемой Вами задачи выделите все автофигуры рисунка вместе с самим рисунком (инструментом "Выделение объектов" панели "Рисование"), сгруппируйте их, вырежьте в Буфер обмена, а затем вставьте то, что в буфере, на то место,