Нетрудно понять, что, зная зашифрованный текст и часть незашифрованного, соответствующую определенной части зашифрованного, можно с помощью той же функции Хог определить пароль, и затем с его помощью расшифровать остальную часть текста. Поэтому в современных системах защиты текста паролем используются более сложные способы, например, повторение пароля не подряд, а с определенными промежутками, с обратным расположением символов в пароле, с двойным шифрованием — результат первого шифрования снова шифруется другим паролем. Но принцип — использование функции XOR — остается неизменным, именно из-за ее обратимости.
Функция XOR, разумеется, присутствует и в VBA. Вот пример кода, реализующего возможности шифрования с ее помощью.
Sub encrypt()
Dim а, b, с, d As String
Исходный текст для шифрования — запрашивается от пользователя, к примеру:
а = "secret text from kgb agent from newyork rezidentura…"
Пароль: может запрашиваться от пользователя:
Итог шифрования:
Узнаем длины каждой из строк — пароля и исходного текста:
Собственно шифрование:
В этой строке попробуйте разобраться самостоятельно. Здесь выполняется функция Хог с каждым символом исходной строки и соответствующим символом пароля, как бы "повторенным" на всю длину исходного текста. 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
Ну вот и все, и так — с каждым символом из исходной строки:
Теперь в переменной с — шифрованная строка, каждой исходной букве соответствует 3 символа. Ее можно записать, например, в документ:
А теперь — программа расшифровки данных. Точно так же разберем ее по строкам.
Строка для расшифровки:
Пароль:
Итог расшифровывания: а = ""
Узнаем длины каждой из строк:
Собственно расшифровывание (попробуйте разобраться самостоятельно в структуре команды — это не так сложно):
For cn = 1 То lentext Step 3
а = а + Chr(Val(Mid(с, cn, 3)) Xor Asc(Mid(b, (Int(cn / 3) Mod lenpass) + 1, 1)))
Next cn
В итоге в переменной а — расшифрованная строка, ее можно записать в любое место — в документ, к примеру:
Можно, конечно, еще добавлять в этот простой код всевозможные дополнения, например, функцию перевода строки цифр в строку символов, чтобы зашифрованный текст выглядел как бессмысленный набор букв. Но это — уже по желанию.
ОТКРЫТЫЙ И ЗАКРЫТЫЙ КОДЫ
Наверняка все слышали такие фразы: "Шифрование с открытым ключом", "Шифрование с закрытым ключом", "Публичный ключ". О том, что они означают, можно писать большие книги, однако стоит вкратце описать ситуацию для полноты изложения.
При шифровании с закрытым ключом для кодирования и расшифровки используется одна и та же последовательность символов в качестве пароля — ключа. Пример — тот, что описан выше. При шифровании же с открытым ключом используются две последовательности символов, причем зашифрованное с помощью первой последовательности можно расшифровать только с помощью второй, и наоборот. Обе последовательности связаны между собой по определенному закону, при этом из второй последовательности можно получить первую, но из первой вторую не узнаешь, — обратное преобразование невозможно.
Сгенерировав специальной программой пару таких последовательностей (называемых ключами), можно первую из них сообщить тому, от кого ждешь секретных посланий ("сообщить ему публичный ключ"), а вторую оставить себе и хранить как зеницу ока ("оставить себе секретный ключ"). То, что будет зашифровано отправителем этим публичным ключом, даже сам отправитель расшифровать не сможет. Это сможет сделать только обладатель секретного ключа.