Коллектив авторов - Защита от хакеров корпоративных сетей
Проницательный читатель обнаружит, что некоторые буквы появляются с почти одинаковой частотой. Как в этом случае определить букву? Для этого нужно или проанализировать все, что сопутствует появлению букв в сообщении (контекст сообщения), или воспользоваться таблицей частот сочетаний букв, например sh, ph, ie и the (в английском языке).
Обычно криптографические алгоритмы этого типа ненамного сложнее шифра Цезаря, упомянутого в начале главы. Он был хорош сотни лет тому назад. Сейчас подобные шифровки публикуются на страницах ежедневных газет для развлечения пассажиров пригородного сообщения под заголовками «Криптограммы». До сих пор подобный и слегка усложненный шифр можно обнаружить в новых версиях вирусов и червей.
Анализ зависимости между длинами зашифрованного и открытого текстов (Ciphertext Relative Length Analysis)
Иногда анализ зашифрованного сообщения может подсказать способ его расшифровки даже в случае отсутствия каких-либо сведений об использованном алгоритме шифрования. Например, предположим, что в руки исследователя попали незашифрованный и зашифрованный неизвестным ему способом пароли. Если длины зашифрованного и незашифрованного паролей совпадают, то можно предположить, что входные данные алгоритма и результат его работы связаны отношением 1: 1. Можно попробовать, подавая на вход алгоритма символы, получить для них зашифрованный эквивалент. В крайнем случае можно узнать количество символов в неизвестном пароле, если планируется взломать его методом «грубой силы».
Зная, что при шифровании длина текста не изменяется, можно воспользоваться этим для выбора части шифротекста, которую можно расшифровать на основании тех или иных предположений. Например, во время Второй мировой войны союзники использовали похожий способ разгадки попавшего в их руки кода немецкой шифровальной машинки Enigma, потому что знали, что, вероятнее всего, фраза «Heil Hitler» встретится в конце каждого зашифрованного текста.
Анализ сходства зашифрованного и открытого текстов
Анализ сходства зашифрованного и открытого текстов (Similar Plaintext Analysis), применяемый для взлома неизвестных алгоритмов, основан на анализе изменений зашифрованного сообщения в зависимости от изменений открытого текста. Конечно, для этого необходимо, чтобы у исследователя была возможность выборочного шифрования тщательно подобранных образцов открытого текста. Например, пусть он зашифровал строки «AAAAAA», «AAAAAB» и «BAAAAA» и проанализировал различия в зашифрованных текстах. В случае моноалфавитного шифра естественно было бы ожидать, что первые две строки различаются только последним символом. Если это так, то несложно построить таблицу трансляции символов в соответствии с исследуемым алгоритмом, которая отражала бы соответствие между символами открытого и зашифрованного текстов и наоборот. После того как таблица была бы готова, не составило бы труда написать программу расшифровки зашифрованного текста.
Что делать в случае полиалфавитного шифра, когда при изменении одного символа незашифрованного сообщения изменяются несколько символов зашифрованного? Конечно, это более сложный случай, и сложность расшифровки зависит от числа изменяемых символов зашифрованного сообщения при изменении одного в незашифрованном. Возможно, что в этом случае для раскрытия логики работы неизвестного криптографического алгоритма можно попытаться объединить рассматриваемый метод анализа с методом «грубой силы».
Моноалфавитные шифры
Моноалфавитный шифр – это шифр, в котором каждый символ алфавита заменяется другим символом в отношении 1: 1. Ранее рассмотренные в главе шифры Цезаря и ROT13 – классические примеры моноалфавитных шифров. Некоторые моноалфавитные шифры скремблируют алфавит (шифруют путем перестановки групп символов), изменяя порядок букв в алфавите ABCDEFGHIJKLMNO PQRSTUVWXYZ на MLNKBJVHCGXFZDSAPQOWIEURYT. Другими словами, новый алфавит, используемый для шифрования сообщений, получают из старого путем замены букв M = A, L = B…T = Z. При использовании этого метода вместо сообщения «SECRET» получают «OBNQBW».
Из-за легкости взлома сегодня редко можно встретить подобный шифр. Такие шифры раскрываются перебором всевозможных комбинаций букв алфавита или использованием лингвистического анализа (language analysis). Моноалфавитные шифры легко поддаются частотному анализу, благодаря тому что, несмотря на замену одних букв другими, частота появления каждого символа в сообщении будет соответствовать известной частоте использования букв в языке.
Другие способы скрытия информации
Иногда разработчики следуют древнему способу обеспечения безопасности – тотальной секретности. И вместо применения испытанных криптографических алгоритмов они пытаются скрыть данные при помощи хорошо известных обратимых алгоритмов, как, например, UUEncode, Base64 или комбинации каких-нибудь простых методов. В этом случае все, что нужно для расшифровки, – это повторно преобразовать зашифрованное сообщение при помощи алгоритма, ранее использованного для его зашифровки. Часть разработчиков пользуется кодировкой данных при помощи операции исключающего ИЛИ (XOR) вместо применения криптографических алгоритмов с ключом. Для кодировки сообщения ключ не нужен. Ниже рассмотрены некоторые широко известные алгоритмы кодирования.
XOR
В качестве промежуточного шага многие сложные и безопасные алгоритмы шифрования используют операцию XOR. Часто можно встретить данные, которые пытались скрыть операцией XOR. XOR – сокращение от английских слов ИСКЛЮЧАЮЩЕЕ ИЛИ (exclusive or). ИСКЛЮЧАЮЩЕЕ ИЛИ – логическая операция, таблица истинности которой представлена в табл. 6.2. Операция выполняется на битах A и B. Результат операции равен 0 только в том случае, если оба бита одинаковы. В противном случае результат равен 1.
Таблица 6.2.
Таблица истинности операции XOR
Посмотрите на простой пример кодировки и восстановления данных с помощью операции XOR. В примере используется один ключевой символ («A») для преобразования сообщения, состоящего из единственного символа («B»). В результате получится зашифрованное сообщение «ciphertext» (см. табл. 6.3).
Таблица 6.3.
Операция XOR над «А» и «В»
Предположим, что известны величина «B» и результат шифрования сообщения «ciphertext». Как найти неизвестный ключ «A»? Требуется восстановить ключ для раскодирования другого закодированного сообщения «ciphertext2», битовое представление которого 00011010. Для этого нужно выполнить операцию XOR с операндами «B» и «ciphertext» и восстановить ключ «A». Результат воcстановления показан в табл. 6.4.
Таблица 6.4.
Результат операции XOR на операндах «ciphertext» и «В»
После восстановления ключа им можно воспользоваться для декодирования «cipher2» и в результате закодировать символ «Z» (см. табл. 6.5).
Таблица 6.5.
Результат операции XOR на операндах «cipher2» и «А»
Конечно, это слишком простой пример. Скорее всего, на практике придется столкнуться с ключами, состоящими из нескольких символов. Кроме того, кодирование сообщений операцией XOR может выполняться последовательно несколько раз.
Манипуляции над абстрактными 0 и 1 могут оказаться трудными для восприятия, если ранее читатель не сталкивался с двоичными числами и величинами. Поэтому автор решил привести пример простой программы, которая выполняет серию из трех операций XOR на различных перестановках ключа для кодирования сообщения. В этой короткой программе на языке Perl используется свободно распространяемый модуль IIIkey для обращения к внутренней функции шифрования XOR. Для того чтобы воспользоваться приведенной программой, следует загрузить модуль IIIkey по адресу www3.marketrends.net/encrypt.#!/usr/bin/perl
#!/usr/bin/perl
# Encodes/Decodes a form of XOR text
# Requires the IIIkey module
# Written specifically for HPYN 2nd Ed.
# by FWL 01.07.02
# Use the IIIkey module for the backend
# IIIkey is available from http://www3.marketrends.net/
encrypt/
use IIIkey;
# Simple input validation
sub validate() {
if (scalar(@ARGV) < 3) {
print “ Error: You did not specify input correctly!n” ;
print “ To encode data use ./xor.pl e “ Key” “ String
to Encode”n”;
print “ To decode data use ./xor.pl d “ Key” “ String
to Decode”n”;
exit;
}
}
validate();
$tmp=new IIIkey;
$key=$ARGV[1];
$intext=$ARGV[2];
if ($ARGV[0] eq “e”) { # encode text
$outtext=$tmp->crypt($intext, $key);
print “Encoded $intext to $outtext”;
} elsif ($ARGV[0] eq “d”) { # decode text
$outtext=$tmp->decrypt($intext, $key);
print “Decoded $intext to $outtext”;
} else { # No encode/decode information given!
print “To encode or decode? That is the question.”;
exit;
}А вот пример отчета работы программы.
$ ./xor.pl e “my key” “secret message”
Encoded secret message to 8505352480^0758144+510906534
$ ./xor.pl d “my key” “8505352480^0758144+510906534”
Decoded 8505352480^0758144+510906534 to secret message
Алгоритм UUEncodeUUEncode – алгоритм, который обычно используется для преобразования двоичных данных в текстовый формат для передачи по электронной почте. (UUEncode – кодирование Unix-Unix (метод преобразования файлов из двоичного формата в текстовый и обратно для обеспечения пересылки по сети Internet посредством электронной почты)). Вероятно, читателю известно, что большинство программ электронной почты не могут непосредственно обрабатывать двоичные вложения к письмам электронной почты. Поэтому в случае присоединения двоичного файла (как, например, рисунка в формате JPEG) к письму электронной почты клиент электронной почты преобразует двоичные данные в текстовый эквивалент, возможно, с помощью алгоритма, подобного UUEncode. Присоединенный файл преобразуется из двоичного формата в поток печатаемых символов, который может быть обработан почтовой программой. После получения письма вложение преобразуется обратным алгоритмом кодирования (UUDecode) для преобразования к оригинальному двоичному файлу.