Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практическая криптография алгоритмы и их программирование

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
Глава 5. Дешифрование современных шифров 151
Попарная независимость всех знаков выхода и обратимость как совершен­ность.
В иностранной литературе совершенность иногда называют также, как Bit In­dependence Criterion или BIC. Наличие или отсутствие совершенности криптогра­фических примитивов, использованных в шифре, влияет на возможность утечки информации при статистических исследованиях выхода шифра. В случае совер­шенности статистические характеристики шифра приближаются по своим значе­ниям к характеристикам независимых случайных процессов, что несомненно су­щественно затрудняет криптоанализ.
Каждая табличная функция должна иметь максимальное расстояние до клас­са линейных функций, то есть обладать максимальной нелинейностью.
Для описания свойства максимальной нелинейности нам понадобятся описа­ния аффинной и линейной функций. Aффинная Булева функция определяется как обладающая следующим свойством:
fx x x x a ax ax a x
( , , ..., ) ...
012 0 11 22
nnn
aa
Если при этом коэффициент a
=+ + ++
.
01,..., { , }
n0
= 0, то функцию f называют линейной. Линей-
0
,
ные функции очень удобны в работе криптоаналитика, они позволяют аппрокси­мировать узлы замен более простыми линейными функциями и строить системы линейных уравнений, решение которых позволяет вычислить ключ блочной крип­тосистемы. Соответственно узел замены, представленный Булевой функцией, должен быть как можно более нелинеен по своим свойствам, то есть таким, что для большинства своих значений узел замен нельзя было бы представить в виде линейной функции. Для этого можно воспользоваться следующей функцией:
( ) min{ ( , )| ( ) ... }==++
Hf dfh hx a a x
h
0
nn
,
ãäå d(f, h) — расстояние Хэмминга, то есть количество различающихся битов в двоичной последовательности заданной длины.
С момента появления первых SP-сетей и затем после принятия первого стан­дарта шифрования существовавшие изначально свойства полноты и лавинного эффекта заметно эволюционировали и стали свойствами строгого лавинного эф­фекта и совершенности.
Вообще говоря, еще команда разработчиков IBM отмечала некоторые необхо­димые для S-блоков качества (наследуя добрую половину рассуждений у Шенно­на, см. главу «Теория секретных систем»):
нелинейную зависимость выходных битов от входных;
зависимость любых входных битов от всех выходных;
изменение половины выходных битов при изменении одного входного.
Эти свойства представляют собой не что иное, как определение свойств пол­ноты и рассеивания, данное Клодом Шенноном. При этом очевидным является то, что свойства полноты и рассеивания входили в состав критериев по отбору узлов замен стандарта DES. Разработчики из IBM остановились на размере узла замены, равном четырем битам, в качестве компромисса между процентом доли S-блоков,
152 Глава 5. Дешифрование современных шифров
имеющих линейную Булеву форму, и размером самих блоков. Дело в том, что доля линейных узлов замен, как и доля узлов замен, имеющих линейное выражение хотя бы для одного выходного знака, быстро убывает с ростом размера самих бло­ков. Например, для четырех битов (размера блоков в DES) процент линейных из них равен 10
2
, а при размере восемь битов процент уменьшается почти до 10
70
В 1994 году IBM раскрыла те критерии, которыми руководствовались иссле­дователи под руководством доктора Уолтера Тачмена при разработке узлов замен для DES. И к линейности функций там относился только один пункт — ни один бит выхода узла замены не должен быть слишком близок (по функции H(f)кли­нейной функции от входных битов. Остальные два пункта в списке критериев ка­сались размера узлов замен, а еще шесть привносили в узлы замен стойкость про­тив дифференциального криптоанализа, который был разработан в IBM задолго до первых открытых публикаций о нем в начале 1990-х годов. В IBM Laboratories атаку на узлы замен называли «атакой-T» (T-attack).
В конце концов, после нескольких десятков удачных работ в этой области, были коллегиально сформулированы основные свойства узлов замен:
строгий лавинный эффект;
биты выхода не должны зависеть друг от друга;
должно существовать обратное преобразование.
При соблюдении всех трех указанных свойств получившиеся S-блоки называ­ют совершенными криптографическими преобразованиями. Приблизительно в середине 90-х годов обнаружилось, что требуемые наборы функций уже давно из­вестны в дискретной математике и носят название бент-функций. Многие дости­жения в исследовании бент-функций сегодня благополучно перенесены в теоре­тическую область криптографии.
На сегодня практически неизвестны эффективные методы конструирования S-блоков, удовлетворяющих всем поставленным критериям. Тем не менее сущест­вует несколько алгоритмов, позволяющих строить эффективные узлы замен, стойкие против большинства существующих криптографических атак.
Один из алгоритмов, использованных при создании узлов замен алгоритма CAST-256, заключается в использовании бент-функции как функции, обладающей следующим свойством: расстояние Хэмминга от f до любой аффинной функции в
m
пространстве функции над полем GF(2
) является максимально возможным.
Если сравнивать характеристики узлов замен, созданных случайным образом и в соответствии с указанными выше критериями, возможно получить приблизи­тельно такую же таблицу, как нижепоказанная.
.
Свойство Случайные узлы замен Сконструированные
Нелинейность 72 74 Строгий лавинный эффект 17 0 Распределение по строкам биномиальное биномиальное Распределение по столбцам биномиальное биномиальное Средний вес 128 128
Глава 5. Дешифрование современных шифров 153
Как видно из таблицы, сконструированные узлы замен очень похожи по сво­им свойствам на случайные по одним свойствам и превосходят их по другим. От­личия в лучшую сторону, кажущиеся минимальными, на самом деле объясняются тем, что существует верхняя граница, которая, собственно, и достигнута при кон­струировании «искусственных» узлов замен. Другими словами, с использованием существующих методов конструирования узлов замен создать их более совершен­ными не представляется никакой возможности.
Дешифрование DES
The NSA told us we had inadvertently reinvented some of the deep secrets it uses to make its own algorithms.
W.Tachmen. IBM Laboratories
Я верующий человек, и я знаю, что Бог в курсе всех моих секретов, и потому я всегда чувствую, что мои мысли в не­котором смысле известны всем. Из этого я и исхожу. Я не считаю, что должен скрывать все, что я делаю. С другой стороны, я, естественно, отношусь совершенно по-другому к тому, что кто-то может использовать эту открытость про­тив меня, например воспользовавшись моими банковскими счетами. Поэтому я за высокий уровень секретности. Но должно ли быть невозможным для властей расшифровать информацию даже при уголовных расследованиях, в край­них случаях — тут я склоняюсь к тому, что в некоторых си­туациях должны все-таки быть методы дешифрования неко­торых шифров.
Д. Кнут. Лекция «Ответы на все вопросы»
5 октября 2001 года в Техническом
университете г. Мюнхена
Обращаясь к анализу алгоритма, можно заметить ряд существенных недо­статков, обнаружившихся большей частью сразу после принятия стандарта. Для современных приложений размер ключа в 56 битов стал слишком мал. Современ­ные подсчеты показывают, что сконструировать специализированное устройство, способное произвести поиск ключа DES в среднем всего за 3,5 часа, будет стоить примерно 1 миллион долларов. Дальше всех в этом смысле продвинулись в орга­низации передовых электронных технологий (The Electronic Frontier Foundation).
Ее сотрудники построили аппаратный комплекс стоимостью в 210 000 долла­ров, который оказался способен взломать шифр DES за трое суток. Как шутили западные журналисты, это был простой способ взломать 56-битовый DES за 56 часов. При этом после ее создания разработчики заявили, что сделать еще одну такую машину будет стоить всего 150 000 долларов, поскольку большая часть первоначальных расходов приходилась на разработку проекта, а не на его техни­ческое обеспечение.
154 Глава 5. Дешифрование современных шифров
Правительственные организации утверждали, что взлом DES возможен толь­ко при наличии дорогостоящего оборудования и использования глобальной компьютерной сети. EFF указала на возможность использования обычного персо­нального компьютера и не слишком дорогого специализированного оборудования.
Концепция архитектуры EFF DES Cracker (с чипами Deep Crack) довольно проста. Обычный персональный компьютер состыкован с аппаратным комплек­сом, содержащим в себе большое количество специальных чипов, запрограммиро­ванных на расшифровку данных с помощью алгоритма DES и сверку определен­ным способом с заданным эталоном. Программное обеспечение компьютера опо­вещает чипы о начале перебора, предоставляет им исходные данные и далее никак не участвует в процессе, кроме контроля за исполнением и поиском ключа. Чип Deep Crack работает независимо до тех пор, пока не найдет потенциально верное решение или не будет обработан тот участок ключевого пространства, ко­торый определил ему главный компьютер. Программа главного компьютера пери­одически опрашивает все чипы и получает из их внутреннего стека все найденные за прошедшее время «ключи».
Таким образом, в задачи аппаратной части комплекса вовсе не входит тоталь­ная проверка на совпадение ключа, шифротекста и открытого текста. Вместо это­го аппаратная часть отбраковывает большую часть заведомо неверных решений, предоставляя программному обеспечению главного компьютера проводить более точные вычисления и проявлять свой интеллект.
Поскольку в комплексе программное обеспечение занимает много меньшую позицию относительно аппаратного, процесс поиска можно разделить на несколь­ко сотен параллельных поисковых операций. Это означает, что один чип, который найдет решение через несколько тысяч лет, можно заменить на тысячу чипов, ко­торые найдут решение почти в тысячу раз быстрее. Правда, для миллиона чипов такая тенденция уже не будет верна — при использовании миллионов чипов поя-
Ðèñ. 5.1. Изображение одного чипа Deep Crack
Глава 5. Дешифрование современных шифров 155
вятся огромные накладные расходы на запуск и опрос всех чипов. Так что наклад­ные расходы съедят почти весь выигрыш от огромного количества «боевых еди­ниц». Построенный в EFF комплекс содержал всего 1536 чипов.
Естественно, при тотальном переборе мы опробуем все ключи, но при этом может быть существен порядок, в котором мы выбираем каждый следующий ключ. На самом деле мы можем опробовать ключи в любом порядке, но если мы знаем, что ключ выбран неслучайным образом, то гораздо эффективнее будет сна­чала опробовать наиболее вероятные ключи, а затем уже все остальные.
Чип Deep Crack, являющийся центральной компонентой всего комплекса, представляет собой небольшой чип, который получает ключ и два блока по 64 бита длиной каждый. Его задача — расшифровать первый блок с заданным клю­чом и проверить, имеет ли смысл дальнейшее исследование данного ключа. Если получен отрицательный результат, значение ключа инкрементируется на едини­цу. Если же ключ признан «подходящим», чип расшифровывает второй блок. По­сле положительного ответа и на второй аналогичный вопрос чип останавливается и сообщает главному компьютеру о том, что найден подходящий ключ. Чипы по­строены для работы на частоте 40 МГц (то есть 40 миллионов операций в секун­ду). Элементарной операцией является один раунд расшифрования. То есть каж­дый чип может проверять за секунду 40 000 000/16 = 2 500 000 ключей.
Основным вопросом является конечно же способ определения, какой ключ признать подходящим. Очевидно, что аппаратно выбранный подходящий ключ во­все не обязан быть действительным решением. Если мы знаем соответствующие друг другу элементы пары (открытый текст, шифротекст), мы можем определить
Ðèñ. 5.2. Фотография всего комплекса EFF DES Cracker
156 Глава 5. Дешифрование современных шифров
Ðèñ. 5.3. Поисковый модуль с 32 чипами Deep Crack
критерий «схожести с подходящим» именно по ним. Если же нет, то критерием может быть, например, то, что текст состоит только из букв, цифр, пробела и зна­ков пунктуации.
Каждый удачный результат в этом случае содержит восемь байтов данных. Соответственно каждый байт может иметь 256 значений. Для того чтобы упрос­тить аппаратную часть, каждый из чипов просто оснащается таблицей из 256 8 = = 2048 значений, в которые вписаны признаки «значение подходит» или «значе­ние не подходит». Например, если мы ищем открытый текст, состоящий только из цифр, мы заполняем таблицу значением «не подходит» для всех значений, кроме тех, которые соответствуют цифрам от 0 до 9. Если длина открытого текста мень­ше 64 битов, то вместо второго 32-битового блока снова подставляется первый. Накладные расходы ничтожны по сравнению с расходами на тотальный перебор, а в результате такого «мошенничества» чип отработает корректно.
При расшифровании неверным ключом выход шифра будет выглядеть доста­точно случайно, и соответственно мы можем попробовать подсчитать вероятность появления подходящего ключа в зависимости от количества подходящих значе­ний для всех байтов. Допустим, мы обозначили подходящими 69 символов (анг
-
Глава 5. Дешифрование современных шифров 157
лийские буквы от «A» до «Z», верхнего и нижнего регистров, цифры, пробел и не­сколько знаков препинания). Тогда вероятность того, что случайный байт будет определен как подходящий, равна 69/256 или приблизительно 1/4, то есть чип будет останавливаться в каждом четвертом случае.
Кажется, это довольно часто. На самом деле нет. Мы подсчитали вероятность появления только одного «лишнего» байта, у нас же их целых восемь, следовате­льно, вероятность составит меньшее значение, а именно 1/65536. Это число вы­глядит довольно малым, но если представить себе все пространство ключей (а это ровно 72 057 594 037 927 936 ключей), то, имея такую вероятность, программное обеспечениe должно будет обработать 1 099 511 627 776 ключей. Так что нам, ви­димо, требуется еще больше помощи от чипа.
Ее с лихвой предоставляет второй блок данных, который мы передаем чипу с самого начала. После обработки первого блока данных, обнаружив, что ключ под­ходит, чип перейдет к обработке второго восьмибайтового блока. Это даст нам ве­роятность 1/4294967296 и соответственно 16 777 216 ключей для обработки главным компьютером.
Конечно, чип будет генерировать гораздо меньше фальшивых ключей, если вместо общих предположений об открытом тексте ему задают вполне конкретный участок открытого текста. В этом случае, очевидно, будет задаваться очень малое количество подходящих байтов. Соответственно уменьшится вероятность появле­ния ложных ключей и тем меньшее количество ключей необходимо будет обрабо­тать с помощью программного обеспечения главного компьютера.
Например, если открытый текст представляет собой блок «Привет», то подхо­дящими будут буквы «П», «р», «и», «в», «е», «т» и «», вместе с пробелом. Если рас­шифрованный текст содержит только их, он подходит для дальнейшего рассмот­рения. Правда, к сожалению, для него подойдут также и тексты «ир етПв», «П твеир» и т. д., которые не являются действительными открытыми текстами.
Аналогично тому, как мы делали это выше, подсчитаем вероятность появле­ния ложных ключей в этом случае. В таблице для одного байта определено 8 под­ходящих ключей из 256, вероятность выбора любого из них равна 8/256 = 1/32. Все восемь байтов дадут 1/1099511627776 (1/32 в восьмой степени). Другими словами, чип может перебрать около триллиона ключей, прежде чем обратиться к главному компьютеру с сообщением о нахождении следующего подходящего клю­ча.
Для общения с чипами программа главного компьютера использует специаль­но разработанный интерфейс (см. листинг 5.2)
34
.
Листинг 5.2
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include "chipio.h"
34
Исходный текст программно-аппаратного комплекса EFF DES Cracker предоставлен
компанией EFF.
158 Глава 5. Дешифрование современных шифров
static int CURRENT_BOARD = -1; static int CURRENT_CHIP = -1; static int CURRENT_PORT_CNFG = -1; static int IO_BASE_ADDRESS = 0x210;
#define IO_PORTA_ADDRESS (IO_BASE_ADDRESS+0) #define IO_PORTB_ADDRESS (IO_BASE_ADDRESS+1) #define IO_PORTC_ADDRESS (IO_BASE_ADDRESS+2) #define IO_CNFG_ADDRESS (IO_BASE_ADDRESS+3) #define CNFG_OUTPUT 0x80 #define CNFG_INPUT 0x82
#define CTRL_BASE 0x1B /* base value onto which others are XORed */ #define CTRL_RST 0x20 #define CTRL_RDB 0x10 #define CTRL_WRB 0x08 #define CTRL_ALE 0x04 #define CTRL_ADRSEL2 0x02 /* in documentation is also called CNTR1 */ #define CTRL_ADRSEL1 0x01 /* in documentation is also called CNTR0 */
/*
* DELAYS CAN BE ADDED TO DEAL WITH BUS LOADING/CAPACITANCE/ETC.
*/ #define DELAY_FACTOR 100L #define DELAY_ADDRESS_SETTLE 0*DELAY_FACTOR #define DELAY_DATA_SETTLE 0*DELAY_FACTOR #define DELAY_RST_HOLD 0*DELAY_FACTOR #define DELAY_RST_RECOVER 0*DELAY_FACTOR #define DELAY_RDB_HOLD 0*DELAY_FACTOR #define DELAY_RDB_RECOVER 0*DELAY_FACTOR #define DELAY_WRB_HOLD 0*DELAY_FACTOR #define DELAY_WRB_RECOVER 0*DELAY_FACTOR #define DELAY_ALE_SETTLE 0*DELAY_FACTOR #define DELAY_ADRSEL2_SETTLE 0*DELAY_FACTOR #define DELAY_ADRSEL1_SETTLE 0*DELAY_FACTOR
#define ioDelay(delayTime) {} /* insert delay if rqd */
#ifdef _MSC_VER /*
* Microsoft C++ Direct I/O Functions
*/ static int inportb(int portNum) {
unsigned char rval; unsigned short portNumShort = (unsigned short)portNum;
_asm { mov dx,portNumShort } _asm { in al,dx } _asm { mov rval, al } return (rval);
}
static void outportb(int portNum, int val) {
unsigned char valChar = (unsigned char)val; unsigned short portNumShort = (unsigned short)portNum;
Глава 5. Дешифрование современных шифров 159
_asm { mov dx, portNumShort } _asm { mov al, valChar }
_asm { out dx, al } } #endif
static void ConfigureIO_Port(int inputOrOutput) {
outportb(IO_CNFG_ADDRESS, inputOrOutput);
CURRENT_PORT_CNFG = inputOrOutput;
/* Warning:
* * Changing the IO port state causes a tiny glitch to go out on the * PC-DIO card. This is enough to ocasionally trigger the ALE, which * causes read/write errors. To avoid this, always explicitly * re-select the chip after switching port directions. */
CURRENT_CHIP = -1; }
static void SetAddress(int addressValue) {
outportb(IO_PORTA_ADDRESS, addressValue); }
static void SetData(int dataValue) {
outportb(IO_PORTB_ADDRESS, dataValue); }
static int GetData(void) {
return (inportb(IO_PORTB_ADDRESS)); }
static void SetControl(int controlPortValue) {
/*
* Possible optimization: Don't send value if already correct. */
outportb(IO_PORTC_ADDRESS, controlPortValue); }
static void selectBoard(int board) {
SetAddress(board);
SetControl(CTRL_BASE ^ CTRL_ADRSEL1); /* put board ID onto address pins */
ioDelay(max(DELAY_ADDRESS_SETTLE, DELAY_ADRSEL1_SETTLE)); /* wait */
SetControl(CTRL_BASE ^ CTRL_ADRSEL1 ^ CTRL_ALE); /* pull ALE high */
ioDelay(DELAY_ALE_SETTLE); /* wait */
SetControl(CTRL_BASE ^ CTRL_ADRSEL1); /* pull ALE back */
ioDelay(DELAY_ALE_SETTLE); /* wait */
SetControl(CTRL_BASE); /* ADRSEL1 done */
ioDelay(DELAY_ADRSEL1_SETTLE);
CURRENT_BOARD = board;
CURRENT_CHIP = -1; }
160 Глава 5. Дешифрование современных шифров
static void selectChip(int chip) {
SetAddress(chip); /* select chip */
ioDelay(DELAY_ADDRESS_SETTLE); /* wait */
SetControl(CTRL_BASE ^ CTRL_ALE); /* pull ALE high */
ioDelay(DELAY_ALE_SETTLE); /* wait */
SetControl(CTRL_BASE); /* pull ALE back */
ioDelay(DELAY_ALE_SETTLE); /* wait */
CURRENT_CHIP = chip; }
void SetBaseAddress(int address) {
IO_BASE_ADDRESS = address; }
/*
* RESET A SINGLE BOARD * * This function resets an entire board. It is not optimized for speed. * It is necessary to delay after calling this function until the board * reset completes. */
int ResetBoard(int board) {
/* Configure the IO card (doesn't matter if for data input or output) */
ConfigureIO_Port(CNFG_INPUT); /* configure the IO port */
ConfigureIO_Port(CNFG_OUTPUT); /* configure the IO port */
selectBoard(board); /* select the board */
SetControl(CTRL_BASE ^ CTRL_RST); /* RESET THE BOARD */
ioDelay(DELAY_RST_HOLD); /* wait */
SetControl(CTRL_BASE); /* stop resetting */
ioDelay(DELAY_RST_RECOVER); /* wait */
CURRENT_BOARD = -1; /* reset this on next IO to be safe */
CURRENT_CHIP = -1; /* reset this to be safe */
return (0); }
void SetRegister(int board, int chip, int reg, int value) {
if (CURRENT_PORT_CNFG != CNFG_OUTPUT) /* set IO data lines for output */
ConfigureIO_Port(CNFG_OUTPUT);
if (CURRENT_BOARD != board) /* make sure board is selected */
selectBoard(board);
if (CURRENT_CHIP != chip) /* make sure chip is selected */
selectChip(chip);
SetAddress(reg); /* select the right address */
SetData(value); /* output the data */
SetControl(CTRL_BASE ^ CTRL_ADRSEL2); /* pull low */
ioDelay(max(max(DELAY_ADDRESS_SETTLE,DELAY_DATA_SETTLE), /* wait */
DELAY_ADRSEL2_SETTLE)); SetControl(CTRL_BASE ^ CTRL_WRB ^ CTRL_ADRSEL2); /* pull WRB low */ ioDelay(DELAY_WRB_HOLD); /* hold it */
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]