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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
Глава 2. Теория секретных систем 21
тое множество конечной мощности, то для pP l, rT такие, что p = (l, r), è
(l, r) ==(r, l fi(r)), ãäå fi— отображение, зависящее от циклового ключа ki,
F
i
— это любая операция, относительно которой замкнуто множество T. Åñëè â êà-
m
честве T выбрать векторное пространство Z
, а в качестве векторное сложение
2
в этом пространстве, то при случайном выборе цикловых ключей и достаточно большомn такой шифр Файстеля будет представлять псевдослучайную подстанов-
2m
êó íà Z
, имеющие характеристики, весьма близкие к случайной подстановке.
2
Пусть F = F
F
...°F
°
°
1
2
: P × (K1× ... × Kn) P — произвольный композици-
n
онный шифр, и на множестве P задана произвольная групповая операция . Äëÿ
1
p, p′∈P определим p = p ⊗ (p′)
сительно операции . Пусть p
, ãäå (p)−1— это элемент, обратный к pîòíî-
= Fi(ki, p
i
), pi= Fi(ki, p
i1
), ∆pi= pi⊗ (p′i)−1, i = 1,
i1
2, ..., n. Тогда композиционную систему шифрования F будем называть марков­ской, если последовательность {p
} образует цепь Маркова.
i
Помимо этого, принято делить все симметричные системы на две группы: блочные и поточные. Об их различиях и тонкостях классификации читатель мо­жет прочесть почти в каждой главе этой книги, поскольку даже при наличии уже довольно давно сложившейся школы криптографии в нашем славном Отечестве споры о том, принадлежит ли новый разработанный шифр к какому-то из классов, довольно любопытны сами по себе.
Одной из трактовок различий между поточными (потоковыми) и блочными шифрами является следующая. Шифр называют блочным, если шифрование каж­дого блока открытого текста не зависит от других блоков, откуда следует, что ре­зультаты шифрования двух одинаковых блоков одного и того же открытого текста совпадают. Если же результат шифрования очередного блока открытого текста зависит не только от него самого и секретного ключа, но и в общем случае от пре­дыдущих блоков, то этот шифр называют поточным. Существует более мягкое «практическое» определение: блочные шифры те, в которых текст делится на по­рции по нескольку октет, поточные же системы оперируют данными по одному биту или символу.
Интересно следующее формальное определение системы блочного шифрова­ния: шифр F : P × K C называется блочным, если множества P, K, C — конеч­ны. В поточном же шифровании это требование нарушается. К примеру, если во время начала шифрования, вообще говоря, неизвестно количество символов в тексте, то удобно считать, что множество P не является конечным. Отметим, что в большинстве современных поточных систем результат шифрования текущего блока открытого текста зависит от его номера и не зависит от самих предыдущих блоков. Такие симметричные криптосистемы называют шифрами гаммирования. В этом случае стойкость системы определяется исключительно свойствами гаммы (являющейся обычно псевдослучайной числовой последовательностью).
Принципы криптоанализа
Попытку криптоанализа системы шифрования принято называть атакой. За­дача криптоаналитика в общем случае состоит в отыскании открытых текстов и
22 Глава 2. Теория секретных систем
секретных ключей, использовавшихся при шифровании. Стоит отметить, что под взломом системы шифрования принято понимать нахождение «уязвимости» шиф­ра, позволяющей проводить атаку со сложностью меньшей, чем при методе пол­ного опробования. Важным допущением в криптоанализе является правило Керк­хоффа: стойкость шифра должна определяться только секретностью ключа. Та­ким образом, общим для всех атак допущением является тот факт, что криптоаналитику априори известен алгоритм шифрования.
При анализе новых шифров и доказательстве криптографической стойкости алгоритмов шифрования обычно используют следующие основные виды атак:
атака со знанием только шифротекста — вид атаки, при которой крип-
тоаналитику известен один или несколько шифротекстов, зашифрованных с использованием одной и той же системы шифрования, с одним и тем же ключом. атака со знанием открытого текста — вид атаки, при которой аналити-
ку известны фрагменты открытого текста и информация о том, какие фраг­менты шифротекста им соответствуют. атака с выбранным открытым текстом — вид атаки, при которой крип-
тоаналитик не только знает открытый текст и шифротекст, но и может для произвольного открытого текста получать соответствующий ему шифро­текст. По-прежнему он должен определить секретные ключи. адаптивная атака с выбранным открытым текстом — разновидность
атаки с выбранным открытым текстом. В этом случае криптоаналитик не только выбирает открытые тексты, но и может изменить свой выбор после анализа полученных данных.
атака с выбранным шифротекстом — вид атаки, при которой аналитик выбирает шифротекст и может получить соответствующий ему открытый текст. Атаки с выбранным открытым или шифротекстом иногда упрощенно называют атаками с выбранным текстом.
Пусть имеем шифр F : P × K C, kK — произвольный фиксированный ключ, P состоит из n открытых текстов p
, i = 1 ... n; vi, i = 1 ... n — вероятность
i
òîãî, ÷òî i-й текст будет зашифрован (вероятность появления i-го текста). Тогда под априорной мерой неопределенности открытого текста будем понимать
( ) ( log log . .. log )=− + + +
HP v v v v v v
121222
nnn
.
В случае, когда о P нет никакой априорной информации, все тексты считают­ся равновероятными и H(P) = |P|, где через |P| обозначается размер текстов в битах.
Пусть имеем ñ Ñ — некий определенный шифротекст; w ятность того, что F(p
, k) = c верное равенство. Тогда под апостериорной мерой
i
, i = 1...n — âåðî-
i
неопределенности открытого текста будем понимать
HPC w w w w w w
( | ) ( log log ... log )=− + + +
121222 2
nn
.
Тогда I = H(P) H(P|C) определяет количество информации об открытом тексте в битах, которую можно извлечь из шифротекста. Шифры, для которых
Глава 2. Теория секретных систем 23
выполнено H(P) = H(P|C) принято называть абсолютно стойкими (совершен­ными).
Пусть K состоит из m ключей k
; vi, i = 1...m — вероятность использования
i
i-го ключа. Тогда под мерой неопределенности криптосистемы (мерой неопре­деленности секретного ключа) будем понимать
HK v v v v v v
( ) ( log log .. . log )=− + + +
121222 2
nn
.
Отметим, что в случае равновероятного распределения элементов в про­странстве ключей H(K) = |K|. Шеннон предложил и доказал необходимое усло­вие абсолютной стойкости шифра, которое заключается в том, что äëÿ òîãî,
чтобы шифр был абсолютно стойким, необходимо, чтобы неопределенность системы шифрования была не меньше неопределенности открытого текста: H(K) H(P).
Из этого условия и правила Керкхоффа следует что для того, чтобы шифр был абсолютно стойким, необходимо, чтобы размер использованного для шифро­вания ключа был не меньше размера шифруемых открытых текстов: |K| |P|. Равенство возможно, если H(K) = |K|, то есть если все ключи равновероятны.
Шифры, не являющиеся абсолютно стойкими, принято называть несовер- шенными.
Определим функцию ненадежности ключа как неопределенность ключа при известных n битах шифротекста. Расстоянием единственности шифра назовем минимальное количество бит, при котором функция ненадежности близка к нулю. Шеннон показал, что эти величины зависят от избыточности открытого текста, причем расстояние единственности прямо пропорционально размеру клю­ча и обратно пропорционально избыточности R = 1 H(P)/|P|. Следовательно, при R = 0 невозможен криптоанализ со знанием только шифротекста, даже при условии неограниченных вычислительных ресурсов.
Список литературы
1. Столлингс В., «Криптография и защита сетей», М: Вильямс, 2001.
2. Медведовский И. Д., Семьянов П. В., Платонов В. В. «Атака через Интернет»,
ÑÏá: 1999.
3. В. Г. Проскурин, С. В. Крутов, И. В. Мацкевич. «Защита в операционных сис-
темах», М: Радио и связь: 2000.
4. Аграновский А. В., Хади Р. А., Ерусалимский Я. М. «Открытые системы и
криптография». Телекоммуникации, 2000.
5. Agranovsky A. V., Hady R. A., «Crypto miracles with random oracle», The Procee­dings of IEEE SIBCOM'2001, The Tomsk Chapter of the Institute of Electrical and Elect­ronics Engineers, 2001.
6. А. В. Аграновский, А. В. Балакин, Р. А. Хади, «Классические шифры и методы их криптоанализа», М: Машиностроение, Информационные технологии, ¹ 10, 2001.
7. Гостехкомиссия России. Руководящий документ. «Средства вычислительной техники. Защита от несанкционированного доступа к информации. Показатели защи щенности от несанкционированного доступа к информации.», М: Воениздат, 1992.
-
24 Глава 2. Теория секретных систем
8. «Автоматизированные системы. Защита от несанкционированного доступа к информации. Классификация автоматизированных систем и требования по защите информации.», М: Воениздат, 1992.
9. А. А. Молдовян, Н. А. Молдовян, Советов Б. Я., «Криптография»: СПб.: Изда­тельство «Лань», 2000.
10. С. Расторгуев, «Программные методы защиты информации в компьютерах и сетях», М: Издательство Агентства «Яхтсмен», 1993.
11. Чмора А. Л., «Современная прикладная криптография», М.: Гелиос АРВ,
2001.
12. Аграновский А. В., Хади Р. А., Котов И. Н., «Аутентификация и разграниче­ние доступа в защищенных системах», Научный сервис в сети Интернет: Труды Все­российской научной конференции. — М: Изд-во МГУ, 2001. стр. 202—204.
13. Устинов Г. Н., «Основы информационной безопасности», М: Синтег, 2000.
14. Анин Б., «Защита компьютерной информации», СПб: БХВ, 2000.
15. Романец Ю. В., Тимофеев П. А., «Защита информации в компьютерных систе­мах и сетях», М: Радио и связь, 2001.
16. Брикелл Е. Ф., Одлижко Э. М., «Криптоанализ: Обзор новейших результа­тов», ТИИЭР, 1988, т. 76, ¹ 5, стр. 75—91.
17. Menezes A., van Oorschot P., Vanstone S., «Handbook of Applied Cryptograp­hy», CRC press, 1996.
18. Schneier B., «Applied Cryptography», John Wiley & Sons Inc, 1996.
19. Милославская Н. Г., Толстой А. И., «Интрасети: доступ в Интернет, защита», М.: ЮНИТИ-ДАНА, 2000.
20. Gutmann P.: «Network Security», University of Auckland, 1996.
21. Anderson R.: «Why Cryptosystems Fail». University of Cambridge Computer La­boratory, 1994.
22. W. Diffie, M.E.Hellman: «New Directions in Cryptography», IEEE Transactions on Information Theory, Vol. IT-22, No. 6, Nov. 1976.
23. Саломаа А.: «Криптография с открытым ключом», Москва: «Мир», 1995. 318 с.
24. Олифер В., Олифер Н.: «Компьютерные сети», Спб: Издательство «Питер»,
1999. 672 ñ.
25. H. Feistel, Cryptography and Computer Privacy, Scientific American, vol.228, 1973, pp. 15—23.
26. H. Feistel, «Block cipher cryptographic system», US Patent ¹ 3798359, US Pa­tent Office, Mar 19, 1974.
27. H. Feistel, «Step code ciphering system», US Patent ¹ 3798360, US Patent Offi­ce, Mar 19, 1974.
28. Walter Tuchman et al, «Block cipher system for data security», US Patent ¹ 3958081, US Patent Office, May 18, 1976.
29. R.Abrahamsen, «Block cipher system for data security», US Patent ¹ 3522374, US Patent Office, July 28, 1970.
30. J. B. Kam and G. 1. Davida, Structured Design of Substitution-Permutation Enc­ryption Networks, IEEE Transactions on Computers, vol. C-28, 1979, pp. 747—753.
31. C. E. Shannon, Communication Theory of Secrecy Systems, Bell Systems Tech nical Jour-nal, vol. 28, 1949, pp. 656—715.
-
Глава 2. Теория секретных систем 25
32. M. Sivabalan, S. E. Tavares, and L. E. Peppard, On the Design of SP Networks from an Information Theoretic Point of View, in Advances in Cryptology: Proc. of CRYP­TO '92.
33. H. Feistel, W. Notz, and J. L. Smith, Some Cryptographic Techniques for Machi­ne-to-Machine DataCommunications, Proceedings of the IEEE, 63 (1975), pp. 1545—1554.
34. Д. Кнут. Искусство программирования для ЭВМ. Получисленные алгоритмы. Т.2. М.:Мир, 1977. 700 с.
35. W. Press, S. Teukolsky, W. Vetterling, Numerical Recipes in C : The Art of Scien­tific Computing, 2nd Edition. Cambridge University Press, January 1993.
36. FIPS 140-1, Security Requirements for Cryptographic Modules, Federal Informa­tion Processing Standards Publication 140-1. U.S. Department of Commerce/NIST, Nati­onal Technical Information Service, Springfield, VA, 1994.
37. FIPS 180-1, Secure Hash Standard, Federal Information Processing Standards Publication 180-1. U.S. Department of Commerce/NIST, National Technical Information Service, Springfield, VA, April 17, 1995.
38. FIPS 186, Digital Signature Standard (DSS), Federal Information Processing Standards Publication 186. U.S. Department of Commerce/NIST, National Technical In­formation Service, Springfield, VA, May 19, 1994.
Глава 3
Дешифрование классических шифров
Все, что видишь ты, — лишь видимость одна, Только форма — а суть никому не видна. Смысл этих картинок понять не пытайся — Сядь спокойно в сторонке и выпей вина!
Омар Хайям
Методов криптоанализа классических шифров существует на сегодняшний день достаточно много. Многим исследователям удалось даже автоматизировать большинство из них. В этой главе мы постараемся объяснить механизмы работы программного обеспечения, которое автоматически или интерактивно, с участием человека, раскрывает шифры. Прежде всего, классические шифры, которые ког­да-то были одними из самых надежных средств сокрытия информации, теперь представляют для нас не более, чем академический интерес.
Тем не менее в изучении классиков криптографии есть свой отнюдь не наду­манный резон. Многие современные методы построения одноключевых шифроси­стем построены на основе методов, известных сотни лет. Да и некоторые методы современного криптоанализа имеют слишком много общего с исторически извест­ными способами взлома старинных шифров.
Изучая классический подход к построению и анализу шифров, нельзя не обращать внимание на развитие современных технологий. Многие классиче­ские шифры просты и не требуют большого внимания к своему устройству, пока не появляется задача их реализации на современных вычислительных устройствах (это могут быть не обязательно персональные компьютеры, а, на­пример, платы шифрования с PIC-процессорами). Для теоретически достаточ­но простых криптографических примитивов, используемых в классических шифрах, иногда не так просто найти эффективное решение в рамках современ­ной компьютерной архитектуры. Учитывая, что многие примитивные с точки зрения теории преобразования данных легли в основу многочисленных совре­менных симметричных шифров и даже хэш-функций, становится очевидным, насколько важно знать, как именно возможно реализовать тот или иной шиф­роблок на практике.
Идеальной задачей для обучения этим с первого взгляда нехитрым премудро­стям служит создание автоматических систем взлома классических шифров. Кро­ме того, способы и методы их создания и те проблемы, с которыми в процессе раз­работки сталкивается криптоаналитик, во многом повторяют трудности криптоа­нализа современных шифров. Авторам остается только уповать на то, что предложенный практический метод обучения основам криптографии и методы да­льнейшего повышения квалификации молодых специалистов был бы использован как можно в большем количестве образовательных учреждений.
Глава 3. Дешифрование классических шифров 27
Отступление для программистов
Чтобы сделать приводимый в книге программный код переносимым, способ­ным к компиляции на разных платформах и операционных системах, мы будем ис­пользовать ряд стандартных типов переменных и объявлений для языков C/C++. Большая часть примеров в книге написана именно на этом семействе языков, по­скольку его можно по праву считать самым распространенным.
Для этого создается специальный модуль объявлений undef.h, куда вносятся все необходимые объявления типов данных и дополнительных переменных. Там, где исходные тексты приводятся на других языках, объявления и типы оговарива­ются отдельно.
Данные далее исходные тексты представляют собой модуль объявлений, со­держащий унифицированные типы данных: знаковые целочисленные int8_t,
int16_t, int32_t, int64_t и беззнаковые целочисленные uint8_t, uint16_t, uint32_t, uint64_t.
Обратите внимание на конструкцию «#ifndef ... #define ... #endif» в исход­ном тексте модуля. Она позволяет избежать возможных переопределений данных типов, если они уже определены компилятором или пользователем по собствен­ному усмотрению. Подобный подход к конструированию исходных текстов помо­гает в подчас сложных конфликтных ситуациях сопряжения аппаратных и про­граммных средств.
На всякий случай мы приводим весь текст модуля unidef.h.
Листинг 3.1
#ifndef unidef__h #define unidef__h
#ifndef uint8_t #define uint8_t unsigned char #endif
#ifndef uint16_t #define uint16_t unsigned short #endif
#ifndef uint32_t #define uint32_t unsigned long #endif
#ifndef uint64_t #define uint64_t unsigned __int64 #endif
#ifndef int8_t #define int8_t signed char #endif
#ifndef int16_t #define int16_t signed short #endif
28 Глава 3. Дешифрование классических шифров
#ifndef int32_t #define int32_t signed long #endif
#ifndef int64_t #define int64_t signed __int64 #endif
#define reorder_bytes(array_of_longs, longs_count, tmp_long, tmp_q) \
do { \
for (tmp_q = 0; tmp_q < longs_count; tmp_q++) { \
tmp_long = (((uint32_t *) &array_of_longs)[tmp_q] << 16) | \
(((uint32_t *) &array_of_longs)[tmp_q] >> 16); \
((uint32_t *) &array_of_longs)[tmp_q] = ((tmp_long & 0xFF00FF00L)>>8)|\
((tmp_long & 0x00FF00FFL) << 8); \
}\
} while(0)
#endif
Как видно из листинга 3.1, unidef.h содержит не только объявления универса­льных типов данных, но и довольно странное на первый взгляд определение reor- der_bytes. Это специальный макрос, который мы будем использовать для переста­новки байтов в памяти.
Такие нетривиальные манипуляции с данными необходимы для устранения различий в машинной адресации данных на разных аппаратных платформах. Дело в том, что в процессорах разных вычислительных систем (например, Intel Pentium и Motorola 680x0) используются разные порядки расположения байтов в памяти и соответственно их загрузки из памяти в регистры процессора и обратно. Корпо­рация Intel придерживается так называемой little-endian концепции, при исполь­зовании которой младший байт слова регистра находится в памяти последним. А Motorola и еще несколько производителей придерживаются схемы, в которой младший байт идет первым.
Причина разногласий неясна даже самым опытным специалистам мультипро­цессорных систем и, по-видимому, является исторической — это результат дав­ней конкуренции нескольких гигантов производителей и соответственно их неже­лание быть «похожими» друг на друга.
Ðèñ. 3.1. Схема организации памяти big-endian и little-endian архитектур
Глава 3. Дешифрование классических шифров 29
Теперь представьте на минутку, что перед криптографом поставлена задача вычислить значение какой-то криптографической хэш-функции от одного и того же блока данных длиной в N байтов на двух машинах — с big-endian архитектурой и с little-endian архитектурой. При последовательной поэлементной обработке та­кого массива на одной машине (big-endian) он будет представлен в памяти так:
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00
а на другой (little-endian) вот так:
04 03 02 01 08 07 06 05 0C 0B 0A 09 00 0F 0E 0D
Теперь, если сравнить хэш-результаты, полученные на разных машинах, они будут отличаться! И криптограф, к примеру, сидящий за компьютером Sun (big-endian), не сможет проверить, была ли модифицирована указанная выше по­следовательность байтов при передаче от криптографа, сидящего, скажем, за компьютером Intel Itanium (little-endian).
К счастью, существует так называемый стандарт де-факто передачи данных network byte-order, который регламентирует пересылку данных в формате big-en­dian. И для того чтобы данные были представлены, как это требуется для их пере­дачи по сети и сравнения на разных машинах, мы будем пользоваться их переста­новкой, то есть вызовом макроса reorder_bytes.
Определение reorder_bytes — это не что иное, как обычный макрос с пара­метрами. Использование конструкции «do { ... } while (0)» позволяет записы­вать использование макроса как обычный вызов процедуры (см. листинг 3.2 check_byte_order.cpp).
Листинг 3.2. check_byte_order.cpp
#include <stdio.h> #include "unidef.h"
// вывод на экран содержимого массива памяти побайтово void print_hex(uint8_t *buf, int bufsize) {
int i, c; printf("\r\n");
for(i=c=0;i<bufsize; i++) {
printf("%02X ", buf[i]);
if (++c > 15) {
c=0; printf("\n");
}
}
printf("\n");
}
// вывод на экран содержимого массива памяти пословно void print_longs(uint32_t *buf, int bufsize) {
int i, c; printf("\r\n");
for(i=c=0;i<bufsize; i++) {
printf("%08X ", buf[i]);
30 Глава 3. Дешифрование классических шифров
if (++c > 3) {
c=0; printf("\n");
}
}
printf("\n");
}
void main(int argc, char **argv) {
char buf[64] = "Это тестовый буфер для проверки порядка следования байтов";
// временные переменные для reorder_bytes нужно заводить самостоятельно
long tmp_long; int tmp_q;
printf("По умолчанию");
// вывод на экран содержимого массива
print_hex(buf, 16);
print_longs((uint32_t *) &buf, 4);
// исправляем порядок байтов в массиве
reorder_bytes(buf, sizeof(buf) / sizeof(long), tmp_long, tmp_q);
printf("Перетасованные байты");
// вывод на экран результатов модификации массива
print_hex(buf, 16); print_longs((uint32_t *) &buf, 4); }
Листинг 3.3. Результат исполнения check_byte_order.exe на Intel Pentium III
По умолчанию DD F2 EE 20 F2 E5 F1 F2 EE E2 FB E9 20 E1 F3 F4 20EEF2DD F2F1E5F2 E9FBE2EE F4F3E120
Перетасованные байты 20 EE F2 DD F2 F1 E5 F2 E9 FB E2 EE F4 F3 E1 20 DDF2EE20 F2E5F1F2 EEE2FBE9 20E1F3F4
Первая строка, содержащая HEX-представление байтов памяти, выведена с по­мощью функции print_hex. Мы будем и в дальнейшем использовать именно эту про­цедуру для вывода бинарных данных, поэтому впоследствии мы поместим в отдель­ный модуль tools.cpp/tools.h. Вторая строка шестнадцатеричных чисел — это вывод содержимого того же массива, но уже пословно, с загрузкой в память сразу четырех байтов, то есть с байтами в том порядке, в каком они обрабатываются процессором. Как видно, запустив программу, можно воочию убедиться в том, что для платформы Intel байты необходимо перетасовывать с помощью макроса, чтобы добиться совпаде­ния порядка следования байтов в памяти и в регистрах процессора (сравните первую строчку секции «По умолчанию» и вторую строчку секции «Перетасованные бай­ты» — к примеру, слово «DDF2EE20» и байты «DD F2 EE 20», которые идентичны!).
Создание же алгоритма автоматической проверки необходимости переста­новки байтов мы оставляем читателю в качестве легкого упражнения. Особенно любознательные могут ознакомиться с исходными текстами такой программы, как утилита autoconf из пакета программного обеспечения GNU utils.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]