Читаем Тайны и секреты компьютера полностью

и сопоставляем последовательности битов шифруемого текста и пароля, повторив пароль несколько раз так, чтобы у каждого бита шифруемого текста был соответствующий ему бит пароля:

11010101010110101001101010111110101010111110101010001…

10010101010011100101010100111001010101001110010101010…

И теперь — шифруем: применяем к этим двум последовательностям функцию Xor:

01000000000101001100111110000111111111110000111111011…

Все — шифрование закончено! Полученную последовательность можно хранить в качестве зашифрованного паролем файла. Ну, а когда потребуется расшифровка, то будет необходимо просто применить ту же самую функцию Xor к этой последовательности вместе с паролем, и тогда в результате получится исходный текст. Преобразовать же последовательность нулей и единиц обратно в текст труда не составит.

Нетрудно понять, что, зная зашифрованный текст и часть незашифрованного, соответствующую определенной части зашифрованного, можно с помощью той же функции Xor определить пароль, и затем с его помощью расшифровать остальную часть текста. Поэтому в современных системах защиты текста паролем используются более сложные способы, например, повторение пароля не подряд, а с определенными промежутками, с обратным расположением символов в пароле, с двойным шифрованием — результат первого шифрования снова шифруется другим паролем. Но принцип — использование функции Xor — остается неизменным, именно из-за ее обратимости.

Функция Xor, разумеется, присутствует и в VBA. Вот пример кода, реализующего возможности шифрования с ее помощью.

Sub encrypt()

Dim a, b, c, d As String

Исходный текст для шифрования — запрашивается от пользователя, к примеру:

a = "secret text from kgb agent from newyork rezidentura…"

Пароль: может запрашиваться от пользователя:

b = «password»

Итог шифрования:

c = ""

Узнаем длины каждой из строк — пароля и исходного текста:

lentext = Len(a)

lenpass = Len(b)

Собственно шифрование:

For cn = 1 To lentext

В этой строке попробуйте разобраться самостоятельно. Здесь выполняется функция Xor с каждым символом исходной строки и соответствующим символом пароля, как бы «повторенным» на всю длину исходного текста. 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

c = c + d

Ну вот и все, и так — с каждым символом из исходной строки:

Next cn

Теперь в переменной с — шифрованная строка, каждой исходной букве соответствует 3 символа. Ее можно записать, например, в документ:

Selection.TypeText Text:=c

End Sub

А теперь — программа расшифровки данных. Точно так же разберем ее по строкам.

Sub decrypt()

Dim a, b, c, d As String

Строка для расшифровки:

c = "003004016001018027082016021025007083017029029009"

Пароль:

b = "password"

Итог расшифровывания:

a = ""

Узнаем длины каждой из строк:

lentext = Len(c)

lenpass = Len(b)

Собственно расшифровывание (попробуйте разобраться самостоятельно в структуре команды — это не так сложно):

For cn = 1 To lentext Step 3

a = a + Chr(Val(Mid(c, cn, 3)) Xor Asc(Mid(b, (Int(cn / 3) Mod lenpass) + 1, 1)))

Next cn

В итоге в переменной a — расшифрованная строка, ее можно записать в любое место — в документ, к примеру:

Selection.TypeText Text:=a

End Sub

Можно, конечно, еще добавлять в этот простой код всевозможные дополнения, например, функцию перевода строки цифр в строку символов, чтобы зашифрованный текст выглядел как бессмысленный набор букв. Но это — уже по желанию.

Открытый и закрытый коды

Наверняка все слышали такие фразы: "Шифрование с открытым ключом", "Шифрование с закрытым ключом", "Публичный ключ". О том, что они означают, можно писать большие книги, однако стоит вкратце описать ситуацию для полноты изложения.

Перейти на страницу:

Похожие книги