Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическая криптография алгоритмы и их программирование
.pdf
Глава 2. Теория секретных систем 21
тое множество конечной мощности, то для ∀p∈P ∃l, r∈T такие, что 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
), p′i= Fi(ki, p′
i−1
), ∆pi= pi⊗ (p′i)−1, i = 1,
i−1
2, ..., n. Тогда композиционную систему шифрования F будем называть марковской, если последовательность {∆p
} образует цепь Маркова.
i
Помимо этого, принято делить все симметричные системы на две группы:
блочные и поточные. Об их различиях и тонкостях классификации читатель может прочесть почти в каждой главе этой книги, поскольку даже при наличии уже
довольно давно сложившейся школы криптографии в нашем славном Отечестве
споры о том, принадлежит ли новый разработанный шифр к какому-то из классов,
довольно любопытны сами по себе.
Одной из трактовок различий между поточными (потоковыми) и блочными
шифрами является следующая. Шифр называют блочным, если шифрование каждого блока открытого текста не зависит от других блоков, откуда следует, что результаты шифрования двух одинаковых блоков одного и того же открытого текста
совпадают. Если же результат шифрования очередного блока открытого текста
зависит не только от него самого и секретного ключа, но и в общем случае от предыдущих блоков, то этот шифр называют поточным. Существует более мягкое
«практическое» определение: блочные шифры те, в которых текст делится на порции по нескольку октет, поточные же системы оперируют данными по одному
биту или символу.
Интересно следующее формальное определение системы блочного шифрования: шифр F : P × K → C называется блочным, если множества P, K, C — конечны. В поточном же шифровании это требование нарушается. К примеру, если во
время начала шифрования, вообще говоря, неизвестно количество символов в
тексте, то удобно считать, что множество P не является конечным. Отметим, что
в большинстве современных поточных систем результат шифрования текущего
блока открытого текста зависит от его номера и не зависит от самих предыдущих
блоков. Такие симметричные криптосистемы называют шифрами гаммирования.
В этом случае стойкость системы определяется исключительно свойствами гаммы
(являющейся обычно псевдослучайной числовой последовательностью).
Принципы криптоанализа
Попытку криптоанализа системы шифрования принято называть атакой. Задача криптоаналитика в общем случае состоит в отыскании открытых текстов и

22 Глава 2. Теория секретных систем
секретных ключей, использовавшихся при шифровании. Стоит отметить, что под
взломом системы шифрования принято понимать нахождение «уязвимости» шифра, позволяющей проводить атаку со сложностью меньшей, чем при методе полного опробования. Важным допущением в криптоанализе является правило Керкхоффа: стойкость шифра должна определяться только секретностью ключа. Таким образом, общим для всех атак допущением является тот факт, что
криптоаналитику априори известен алгоритм шифрования.
При анализе новых шифров и доказательстве криптографической стойкости
алгоритмов шифрования обычно используют следующие основные виды атак:
атака со знанием только шифротекста — вид атаки, при которой крип-
•
тоаналитику известен один или несколько шифротекстов, зашифрованных
с использованием одной и той же системы шифрования, с одним и тем же
ключом.
атака со знанием открытого текста — вид атаки, при которой аналити-
•
ку известны фрагменты открытого текста и информация о том, какие фрагменты шифротекста им соответствуют.
атака с выбранным открытым текстом — вид атаки, при которой крип-
•
тоаналитик не только знает открытый текст и шифротекст, но и может для
произвольного открытого текста получать соответствующий ему шифротекст. По-прежнему он должен определить секретные ключи.
адаптивная атака с выбранным открытым текстом — разновидность
•
атаки с выбранным открытым текстом. В этом случае криптоаналитик не
только выбирает открытые тексты, но и может изменить свой выбор после
анализа полученных данных.
•
атака с выбранным шифротекстом — вид атаки, при которой аналитик
выбирает шифротекст и может получить соответствующий ему открытый
текст. Атаки с выбранным открытым или шифротекстом иногда упрощенно
называют атаками с выбранным текстом.
Пусть имеем шифр F : P × K → C, k∈K — произвольный фиксированный
ключ, 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 Proceedings of IEEE SIBCOM'2001, The Tomsk Chapter of the Institute of Electrical and Electronics 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 Cryptography», 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 Laboratory, 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 Patent Office, Mar 19, 1974.
27. H. Feistel, «Step code ciphering system», US Patent ¹ 3798360, US Patent Office, 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 Encryption 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 CRYPTO '92.
33. H. Feistel, W. Notz, and J. L. Smith, Some Cryptographic Techniques for Machine-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 Scientific Computing, 2nd Edition. Cambridge University Press, January 1993.
36. FIPS 140-1, Security Requirements for Cryptographic Modules, Federal Information Processing Standards Publication 140-1. U.S. Department of Commerce/NIST, National 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 Information 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-endian. И для того чтобы данные были представлены, как это требуется для их передачи по сети и сравнения на разных машинах, мы будем пользоваться их перестановкой, то есть вызовом макроса 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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
