Криптографическое кодирование
В качестве символов кодирования могут использоваться как символы произвольного алфавита, так и двоичные коды.
Метод простой подстановки
Простейшим случаем такого кодирования является простая подстановка: каждому исходному символу ставится в соответствие произвольный символ кодирования из какого-либо другого алфавита или из исходного – получается таблица соответствия. Тогда в кодируемом сообщении выполняется замена символов в соответствии с полученной таблицей.
Пример 4.3. Пусть исходным является русский алфавит. Составим упомянутую таблицу соответствия, используя служебные символы, знаки препинания и знаки арифметических действий из таблицы ASCII-кодов в качестве кодового алфавита (см. рис. 4.1):
А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я Ь Ъ Ы
! № $ % & * ( ) { } [ ] - | = ” ’ ~ ` : ; _ < > ^ · ® ¯ ± ? ¤
Тогда сообщение ИНФОРМАТИКА будет закодировано как }=_”~|!:}]! .
Данный метод кодирования является ненадежным, так как при достаточно большой выборке закодированных сообщений при известных частотах символов исходного алфавита (это уже обсуждалось выше) можно с определенной долей погрешности выполнить декодирование. В самом деле, пусть есть представительная выборка закодированных русскоязычных сообщений, общее число букв в которых равно M, и известны частоты букв русского алфавита (табл. 4.6).
Таблица 4.6
Буква | Частота | Буква | Частота | Буква | Частота |
о | 0,090 | м | 0,026 | й | 0,010 |
е (ё) | 0,072 | д | 0,025 | х | 0,009 |
а | 0,062 | п | 0,023 | ж | 0,007 |
и | 0,062 | у | 0,021 | ю | 0,006 |
т | 0,053 | я | 0,018 | ш | 0,006 |
н | 0,053 | ы | 0,016 | ц | 0,004 |
с | 0,045 | з | 0,016 | щ | 0,003 |
р | 0,040 | ь,ъ | 0,014 | э | 0,003 |
в | 0,038 | б | 0,014 | ф | 0,001 |
л | 0,035 | г | 0,013 | пробелы и знаки препинания | 0,175 |
к | 0,028 | ч | 0,012 |
(4.2) |
где mS – количество символов s в сообщениях.
Тогда получив частоты и сопоставив их с табл. 4.6, можно определить исходный текст.
Пример 4.4. Пусть есть закодированное сообщение из примера 4.3: }=_”~|!:}]!. Известно, что до кодирования оно было составлено из букв русского алфавита. Требуется декодировать его, используя в качестве представительной выборки закодированных русскоязычных текстов настоящее учебное пособие, предварительно выполнив все замены русских букв символами из таблицы соответствия примера 4.3.
Воспользуемся встроенными средствами текстового процессора WINWORD для определения требуемых статистических данных.
Так определим, что общее число символов М в учебном пособии на момент подготовки данного примера составляет 275979 символов.
Определяем, сколько раз встречаются интересующие нас символы из закодированного сообщения - ms (см. таблицу ниже). Это позволяет рассчитать частоты символов fs по формуле (4.2) (см. таблицу ниже). Сопоставим полученные данные с табл. 4.6. Наиболее близкие по значению символы для полученных частот сведены в таблицу:
символ s | } | = | _ | “ | ~ | | | ! | : | ] |
ms | |||||||||
fs | 0,068 | 0,052 | 0,005 | 0,078 | 0,044 | 0,031 | 0,061 | 0,049 | 0,024 |
подходящий символ из табл. 4.6 | е, а, и | т, н | ю, ш, ц | е, о | с, р | л, к | а, и | т, н, с | д, п |
Таким образом, кодовые символы из закодированного сообщения могут быть заменены символами из соответствующего множества:
} = _ ” ~ | ! : } ] ! кодовые
символы
{е,а,и} {т,н} {ю,ш,ц} {е,о} {с,р} {л,к} {а,и} {т,н,с} {е,а,и} {д,п} {а,и} символы для замены
Если построить все возможные сочетания символов из указанных множеств, там будет, в частности и сочетание вида и н * о р * а т и * а, где знак * означает любой символ из соответствующего определенного выше множества исходных символов (в случае * декодирование, очевидно, выполнено неверно). Если предъявить полученную строку человеку или автомату, способному распознать русское слово, зашифрованное сообщение можно считать декодированным.
Очевидно, декодирование также возможно при известной таблице соответствия.
Метод Вижинера
Разрушить статистические зависимости в закодированных сообщениях и тем самым повысить надежность кодирования можно с помощью метода Вижинера.
Символы исходного алфавита нумеруются, начиная с нуля, например:
А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я Ь Ъ Ы
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Получают таблицу соответствия.
Задаются ключом кодирования – словом в исходном алфавите, например, АСУ.
Выписывают сообщение, подлежащее кодированию, например, пусть это будет сообщение ИНФОРМАТИКА, и выполняют следующие шаги:
И Н Ф О Р М А Т И К А
8 12 19 13 15 11 0 17 8 9 0 а) под каждым его символом записывают порядковый номер из таблицы соответствия;
А С У А С У А С У А С б) под сообщением выписывают ключевое слово;
0 16 18 0 16 18 0 16 18 0 16 в) под символами ключа выписывают их порядковые номера из таблицы соответствия;
8 28 6 13 0 29 0 2 26 9 16 г) порядковые номера символов складываются по модулю, равному числу символов исходного алфавита (в нашем случае – 31).
Напомним, что сложение по модулю (обозначается Å) выполняется без переноса единицы переноса в старший разряд.
Так мы получили при сложении по модулю 31, например, чисел 17 и 16 (сумма равна 33, что на 2 превышает модуль 31) значение 2.
Полученный числовой ряд преобразуется в символы исходного алфавита по таблице соответствия. Так имеем:
И Ь Ж О А Ъ А В Ю К С.
Очевидно, что статистика не поможет декодировать это сообщение, поскольку повторяются совсем не те символы, что в исходном сообщении.
Для декодирования подобных сообщений требуется таблица соответствия и ключ. Тогда выполняют описанные выше процедуры кодирования в обратном порядке. Сложность может представлять только операция вычитания с учетом модуля. При этом следует помнить, что не должны получаться отрицательные значения. Если такое происходит, нужно занять число, соответствующее модулю.
Пример 4.5. Декодировать сообщение И Ь Ж О А Ъ А В Ю К С, задавшись ключом АСУ и зная таблицу соответствия.
И Ь Ж О А Ъ А В Ю К С
8 28 6 13 0 29 0 2 26 9 16 а) выписываем под закодированным сообщением порядковые номера символов из таблицы соответствия;
А С У А С У А С У А С б) выписываем под сообщением ключ с по- 0 16 18 0 16 18 0 16 18 0 16 рядковыми номерами символов;
8 12 19 13 15 11 0 17 8 9 0 в) вычитаем с учетом модуля 31 из чисел в закодированном сообщении числа для ключа;
И Н Ф О Р М А Т И К А г) преобразуем числа в символы по таблице соответствия.
При декодировании возникла сложность в получении кодов символов Т, Ф, Р. В самом деле, при вычитании из 2 числа 16 получалось –14. Тогда к 2 прибавили модуль 31, получили 33 и уже из 33 вычли 16. Получили 17 – порядковый номер символа Т. Аналогично поступили и с символами Ф и Р.