Академический Документы
Профессиональный Документы
Культура Документы
94
как уже говорилось, наличие избыточности не всегда является
отрицательным показателем.
9.2. Коды для обнаружения ошибок
Один из самых старых, простых и используемых кодов для
обнаружения ошибок образуется путем добавления к передаваемой двоичной
комбинации, состоящей из k информационных символов (битов), одного
контрольного символа (0 или 1), так, чтобы общее число единиц в
передаваемой комбинации было четным. Такой код называется кодом с
проверкой на четность и позволяет обнаруживать одиночные ошибки.
Например, пусть даны две комбинации 11011 и 11100, для которых нужно
построить код с проверкой на четность. Первая комбинация имеет четное, а
вторая – нечетное число единиц. Поэтому к первой комбинации добавляется
0, а ко второй – 1. В результате получаем коды 110110 и 111001. Если
предположить, что в результате ошибок вместо указанных комбинаций были
получены 111110 и 110001, то проверка на четность их обнаружит, так как
контрольные символы у принятых комбинаций (если они правильные)
должны быть 1 и 0 соответственно.
Другим примером кодов с обнаружением ошибок является код с
постоянным весом, который содержит постоянное число единиц и нулей. В
этом случае, число возможных кодовых комбинаций составит
n!
N = C nm = ,
m!( n − m)!
95
Таблица 9.1
Код с двумя единицами из пяти
Значение Код
Десятичный вид Двоичный вид
0 0000 00011
1 0001 00101
2 0010 00110
3 0011 01001
4 0100 01010
5 0101 01100
6 0110 10001
7 0111 10010
8 1000 10100
9 1001 11000
96
данного кода достаточно велики. Данный код обнаруживает практически
любые ошибки, кроме редких ошибок смещения, которые одновременно
происходят как среди информационных символов, так и среди
соответствующих контрольных.
Для снижения ошибок при кодировании угла поворота некоторого
объекта (а также и в других случаях) можно использовать код Грея. Примеры
кодов Грея приведены в таблице 9.2. Разряды в коде Грея не имеют
постоянного веса. Вес k-го разряда определяется следующим образом:
k
± ∑ 2i = ±( 2k +1 − 1) .
i =0
An , i = n,
ai = Ai , Ai+ 1 = 0,
A , A = 1;
i i+ 1
an , i = n,
Ai = ai , ai− 1 ⊗ ai− 2 ⊗ . . ⊗. a0 = 0,
a , a ⊗ a ⊗ . . ⊗. a = 1.
i i− 1 i− 2 0
Таблица 9.2
Примеры кодов Грея
Исходный Код Грея Исходный Код Грея Исходный Код Грея Исходный Код Грея
код код код код
0000 0000 0100 0110 1000 1100 1100 1010
0001 0001 0101 0111 1001 1101 1101 1011
0010 0011 0110 0101 1010 1111 1110 1001
0011 0010 0111 0100 1011 1110 1111 1000
97
9.3. Корректирующие коды
Корректирующими кодами называют коды, которые позволяют
обнаруживать и исправлять ошибки. Основную идею корректирующих кодов
геометрически можно проиллюстрировать с помощью N-мерного куба (рис.
9.1), длина ребер в котором равна одной единице. Вершины такого куба
отображают двоичные коды. Минимальное расстояние между двумя
вершинами определяется минимальным количеством ребер, находящихся
между этими вершинами. Расстояние, определяемое таким образом,
называют кодовым (или хэмминговым). Другими словами, кодовое
расстояние − это минимальное число элементов, в которых одна кодовая
комбинация отличается от другой. Для определения кодового расстояния
между двумя кодовыми комбинациями можно сложить их по модулю 2 и
найти число единиц в получившейся сумме. Например, сложив две
Рис.7.3. Представление
комбинации 10110101101 двоичных
и 11001010101, кодов с 01111111000
получим помощью куба и определим,
98
остальные (001, 010, 100, 111) – запрещенными. Очевидно, что любая
одиночная ошибка приводит к тому, что разрешенная комбинация переходит
в ближайшую запрещенную комбинацию, что можно обнаружить после ее
получения. При выборе комбинаций с кодовым расстоянием d = 3 получим
код, который позволит исправить одну одиночную ошибку или обнаружить
две ошибки. Таким образом, увеличивая кодовое расстояние можно
увеличить помехоустойчивость кода. В общем случае кодовое расстояние
определяется по формуле
d = t + l + 1,
где t – число исправляемых ошибок, l – число обнаруживаемых ошибок, при
этом обычно l > t.
Большинство корректирующих кодов являются линейными кодами, у
которых контрольные символы образуются путем линейной комбинации
информационных символов. Кроме того, корректирующие коды являются
групповыми кодами, т.е. образуют замкнутую группу с нулевым элементом и
операцией сложения. Замкнутость группы означает, что при сложении двух
элементов группы получается элемент, принадлежащий этой же группе. В
качестве операции сложения используется поразрядное сложение по модулю
2 (так как число разрядов у кодов не должно увеличиваться при выполнении
операции сложения).
Для построения кода способного обнаруживать и исправлять
одиночную ошибку необходимое число контрольных разрядов будет
составлять
n − k ≥ log ( n + 1) ,
99
В общем случае, число контрольных символов определяется неравенством
Хэмминга
t
n − k ≥ log(1 + C n1 + C n2 + ... + C nt ) = log∑ C ni ,
i =0
Таблица 9.3
(7, 4)-код Хэмминга
Исходный Код Исходный Код Исходный Код Исходный Код
код Хэмминга код Хэмминга код Хэмминга код Хэмминга
100
0000 0000000 0100 0110100 1000 1101000 1100 1011100
0001 1010001 0101 1100101 1001 0111001 1101 0001101
0010 1110010 0110 1000110 1010 0011010 1110 0101110
0011 0100011 0111 0010111 1011 1001011 1111 1111111
101
При построении кода Хэмминга необходимо учитывать, что
проверочная матрица H(n–k)× n не должна содержать одинаковых столбцов, а
строки матрицы Ak× (n–k) должны содержать, по крайней мере, две единицы.
Вопросы
1. Помехи.
2. Помехоустойчивые коды.
3. Код с проверкой на четность.
4. Код с постоянным весом.
5. Код с удвоением.
6. Инверсный код.
7. Код Грея.
8. Кодовое расстояние.
9. Корректирующие коды.
10. Коды Хэмминга.
Лекция 14
Тема 9. Помехоустойчивое кодирование (продолжение)
9.5. Циклические коды
Циклическими кодами называют специальную группу линейных кодов,
которые имеют полиномиальное представление. Например, кодовая
комбинация 101101 имеет следующее полиномиальное представление:
P(x) = 1⋅ x5 + 0⋅ x4 + 1⋅ x3 + 1⋅ x2 + 0⋅ x1 + 1 = x5 + x3 + x2 + 1.
Циклические коды относятся к систематическим (n, k)-кодам, в
которых контрольные n – k и информационные k разряды расположены на
строго определенных местах.
Над полиномами, представляющими циклические коды, определены
операции умножения, деления, сложения и вычитания. При этом операции
сложения и вычитания выполняются по модулю 2.
Циклический код F(x) получают следующим образом:
102
h( x ) x n −k R( x)
=Q ( x ) + ,
g ( x) g ( x)
F ( x ) =Q ( x ) g ( x ) = x n −k h( x) + R ( x ),
Таблица 9.4
Соотношения между числом информационных и контрольных символов
n 3 5 6 7 9…15 17…31 33…63 65…127
k 1 2 3 4 5…11 12…26 27…57 28…120
n–k 2 3 3 3 4 5 6 7
1101000.
4. Разделим полученное произведение на образующий полином g(х):
h ( x ) x n −k x 6 + x 5 + x 3 1 001
= 3 = x3 + x2 + x + 1 + 3 = 1111 + .
g ( x) x + x +1 x + x +1 1011
5. Суммируем остаток с h(х)хn–k. В результате получим закодированное
Таблица 9.5
Образование элементов матрицы остатков
i x2(n–k)–i–1 x2(n–k)–i–1 / g(x) ri
1 x6 х3 + х + 1 2
х + 1 = 101
2 x5 х2 + 1 2
х + х + 1 = 111
3 x4 х х2 + х = 110
4 x3 1 х + 1= 011
104
Применение порождающей и проверочной матриц точно такое же, как и в
случае кодов Хэмминга. Пусть, например, необходимо получить линейный
код для 1101. Тогда умножив 1101 на порождающую матрицу, получим
искомую кодовую комбинацию 1101001. Теперь, пусть вместо 1101001 была
принята комбинация 1101011. Умножив ее на транспонированную
проверочную матрицу, получим синдром 010, соответствующий 6 строке
этой матрицы, что означает, что необходимо исправить 6 разряд проверяемой
кодовой комбинации. Выполнив исправление, получаем 1101001.
Таблица 9.6
Порождающие многочлены
g(x) Полином g(x) Полином
g(x) x+1 g1(x6) x6+x+1
g(x2) x2+x+1 g2(x6) x6+x3+1
g1(x3) x3+x+1 g3(x6) x6+x5+1
g2(x3) x3+x2+1 …………… ……………
g1(x4) x4+x+1 g1(x7) x7+x+1
g2(x4) x4+x3+1 g2(x7) x7+x3+1
g3(x4) x +x3+x2+x+1
4
g3(x7) x +x3+x2+x+1
7
105
Коды Рида-Соломона являются q-ичными кодами, где q > 2. Структура
кодов Рида-Соломона и алгоритм декодирования описывается с помощью
спектральных методов.
Изучение сверточных кодов и кодов Рида-Соломона оставляется на
самостоятельную работу.
Вопросы
1. Циклические коды.
2. Полиномиальное представление циклических кодов.
3. Операции над циклическими кодами.
4. Систематические циклические коды.
5. Полиномиальное представление циклических кодов.
6. Порождающая матрица.
7. Проверочная матрица.
8. Обнаружение и исправление ошибок.
9. Сверточные коды.
10. Коды Рида-Соломона.
Лекция 15
Тема 10. Криптография
10.1. Основные принципы информационной безопасности
Настоящее время характеризуется большими информационными
потоками. На основе быстро меняющихся данных постоянно принимаются
важные решения во всех сферах человеческой деятельности. С ростом
объемов информационных потоков и усилением роли информации в жизни
отдельного человека и общества в целом растут так же и требования к
информационной безопасности.
Развитие средств и методов информационной безопасности имеет
несколько этапов. До начала широкого использования автоматизированных
систем обработки данных безопасность информации достигалась
106
исключительно физическими и административными мерами. С появлением
компьютеров стала очевидной необходимость использования автоматических
средств защиты файлов данных и программной среды. Следующий этап
развития автоматических средств защиты связан с появлением
распределенных систем обработки данных и компьютерных сетей, в которых
средства сетевой безопасности используются в первую очередь для защиты
передаваемых по сетям данных.
Рассмотрим основные понятия, относящиеся к информационной
безопасности, и их взаимосвязь (рис. 10.1). Собственник определяет
множество информационных ценностей, которые должны быть защищены от
различного рода атак. Атаки осуществляются противниками или
оппонентами, использующими различные уязвимости в защищаемых
ценностях. Основными нарушениями безопасности являются раскрытие
информационных ценностей (потеря конфиденциальности), их
неавторизованная модификация (потеря целостности) или неавторизованная
потеря доступа к этим ценностям (потеря доступности). Собственники
информационных ценностей анализируют уязвимости защищаемых ресурсов
и возможные атаки, которые могут иметь место в конкретном окружении. В
результате такого анализа определяются риски для данного набора
информационных ценностей. Этот анализ определяет выбор контрмер,
который задается политикой безопасности и обеспечивается с помощью
механизмов и сервисов безопасности. Следует учитывать, что отдельные
уязвимости могут сохраниться и после применения механизмов и сервисов
безопасности. Политика безопасности определяет согласованную совокупность
механизмов и сервисов безопасности, адекватную защищаемым ценностям и
окружению, в котором они используются.
107
осуществлена атака;
2. риск – вероятность того, что конкретная атака будет осуществлена с
использованием конкретной уязвимости;
3. политика безопасности – правила, директивы и практические навыки, которые
108
осуществление атаки; сервис использует один или более механизмов
безопасности.
Ввиду того, что сегодня большая часть обмена информацией проходит
по компьютерным сетям и часто (в бизнесе, военным и прочее) нужно
обеспечивать конфиденциальность, то одной из наиболее важных проблем в
области информационной безопасности является обеспечение безопасного
сетевого взаимодействия, модель которого в общем виде можно
представлена на рис. 10.2.
109
противник не мог расшифровать перехваченное сообщение, не зная
секретную информацию.
2. Создать секретную информацию, используемую алгоритмом
шифрования.
3. Разработать протокол обмена сообщениями для распределения
разделяемой секретной информации таким образом, чтобы она не стала
известна противнику.
Кроме сетевой безопасности существуют так же другие ситуации,
которые не соответствуют описанной выше модели. Общая модель этих
ситуаций проиллюстрирована на рис. 10.3.
110
7. большое значение для обеспечения безопасности информационной
системы имеют социальные факторы, а также меры административной,
организационной и физической безопасности.
111
Методы криптографии начали развиваться еще в глубокой древности.
Известно, что еще в V веке до нашей эры тайнопись использовалась в
Древней Греции. Очень распространена была простейшая (для настоящего
времени) система шифрования – это замена каждого знака письма на другой
знак по выбранному правилу. Юлий Цезарь, например, заменял в своих
секретных письмах первую букву алфавита на четвертую, вторую – на пятую,
последнюю – на третью и т.п., т.е. A на D, B на E, Z на C и т.п. Его наследник
Октавиан Август заменял каждую непоследнюю букву алфавита на
следующую, а последнюю на первую. Подобные шифры, называемые
простой заменой или подстановкой, описаны в рассказах «Пляшущие
человечки» А. К. Дойла, «Золотой жук» Э. По и других детективных
произведениях.
Шифры простой замены легко поддаются расшифровке при знании
исходного языка сообщения, так как каждый письменный язык
характеризуется частотой встречаемости своих знаков. Например, в
английском языке чаще всего встречается буква E, а в русском – О. Таким
образом, в шифрованном подстановкой сообщения на русском языке самому
частому знаку будет с большой вероятностью соответствовать буква О. При
этом вероятность будет расти с ростом длины сообщения.
Усовершенствованные шифры-подстановки используют возможность
заменять символ исходного сообщения на любой символ из заданного для
него множества символов, что позволяет выровнять частоты встречаемости
различных знаков шифра, но подобные шифры удлиняют сообщение и
замедляют скорость обмена информацией.
В шифрах-перестановках знаки сообщения специальным образом
переставляются между собой, например, записывая сообщение в строки
заданной длины и беря затем последовательность слов в столбцах в качестве
шифра. Сообщение «ТЕОРИЯИНФОРМАЦИИ», используя строки длины 4,
будет в шифрованном таким методом виде выглядеть как
112
"ТИФАЕЯОЦОИРИРНМИ", потому что при шифровании использовался
следующий прямоугольник:
Т Е ОР
И ЯИН
ФОР М
А ЦИИ
113
20 6 16 18 10 33 10 15 22 16 18 14 1 24 10 10
К И Б Е Р Н Е Т И К А К И Б Е Р
12 10 2 6 18 15 6 20 10 12 1 12 10 2 6 18
32 16 18 24 28 15 16 2 32 28 19 26 11 26 16 28
ЮО Р Ц Ъ Н О Б ЮЪ С ШЙ ШО Ъ
Вопросы
1. Этапы развития средств информационной безопасности.
2. Основные понятия информационной безопасности.
3. Модель сетевой безопасности.
4. Модель безопасности информационной системы.
5. Основные принципы информационной безопасности.
6. Основные механизмы информационной безопасности.
7. Криптография и криптографические методы.
8. Шифры-подстановки.
9. Шифры-перестановки.
10. Системы с ключом.
Лекция 16
Тема 10. Криптография (продолжение)
114
10.3. Модель шифрования
Шифрование информации – это основной криптографический метод
защиты информации, обеспечивающий ее конфиденциальность. При
шифровании и расшифровке (дешифрировании) информации выполняется
преобразование исходных (открытых) данных в зашифрованные и наоборот.
Шифрование данных можно представить в виде следующих формул:
C = Ek1(M),
M’ = Dk2(C),
где M – открытая информация (открытый текст), C – полученный в
результате зашифровывания шифротекст (криптограмма), E – функция
зашифровывания, выполняющая криптографические преобразования над
исходным текстом, k1 – параметр функции зашифрования, называемый
ключом зашифровывания, M’ – информация, полученная в результате
расшифровывания, k2 – параметр для расшифровывания информации, D –
функция расшифровывания, выполняющая обратные относительно
зашифровывания криптографические преобразования над шифротекстом.
В стандарте ГОСТ 28147-89 понятие «ключ» определено следующим
образом: «Конкретное секретное состояние некоторых параметров алгоритма
криптографического преобразования, обеспечивающее выбор одного
преобразования из совокупности всевозможных для данного алгоритма
преобразований». Другими словами, ключ является уникальным элементом, с
помощью которого можно варьировать результат работы алгоритма
шифрования: один и тот же открытый текст при использовании различных
ключей будет зашифрован по-разному.
Для того чтобы результат последовательного выполнения операций
зашифровывания и расшифровывания совпал с исходным сообщением,
необходимо выполнение двух условий:
- функция D должна соответствовать функции E,
- ключ k2 должен соответствовать ключу k1.
115
При отсутствии верного ключа k2 получить исходное сообщение
M’ = M невозможно, если для зашифровывания использовался
криптографически стойкий алгоритм шифрования. Криптостойкость является
количественной характеристикой алгоритма шифрования, определяемой
требуемыми ресурсами для его вскрытия. Ресурсами являются:
- количество информации;
- время;
- память.
Совокупность этих трех величин характеризует конкретную атаку на
конкретный алгоритм шифрования. А лучшая (с минимальным набором
ресурсов) из возможных атак на алгоритм характеризует его
криптостойкость. Кроме того, понятие криптостойкого алгоритма может
быть определено следующим образом:
- алгоритм является криптографически стойким, если не существует
каких-либо методов его вскрытия, кроме перебора всех возможных
вариантов, и
- при этом размер ключа алгоритма является достаточно большим для
того, чтобы перебор вариантов стал невозможным при текущем уровне
вычислительной техники.
Алгоритмы шифрования можно разделить на две категории:
1. алгоритмы симметричного шифрования, в которых k2 = k1 = k;
2. алгоритмы асимметричного шифрования, в которых ключ
зашифровывания k1 вычисляется из ключа k2 таким образом, что обратное
вычисление невозможно, например, по формуле
k1 = ak2 mod p,
где a и p – параметры алгоритма.
116
Симметричное шифрование делится на два вида: блочное и потоковое.
При блочном шифровании информация разбивается на блоки фиксированной
длины, после чего они поочередно шифруются. Алгоритмы потокового
шифрования обрабатывают данные побитно или посимвольно (можно
считать, что данные разбиваются на блоки единичной длины).
Большинство симметричных алгоритмов работают следующим
образом: над шифруемым текстом выполняется некоторое преобразование с
участием ключа шифрования, которое повторяется определенное число раз
(раундов). При этом по виду повторяющегося преобразования алгоритмы
шифрования принято делить на несколько категорий.
1. Алгоритмы на основе сети Фейстеля. Сеть Фейстеля подразумевает
разбиение обрабатываемого блока данных на несколько субблоков (частей),
один из которых обрабатывается некоторой функцией f и накладывается на
один или несколько остальных (рис. 10.4). Дополнительный аргумент
функции f, обозначенный на рис. 10.4 как Ki, называется ключом раунда и
является результатом обработки ключа шифрования процедурой расширения
ключа. Задачей процедуры расширения ключа заключается в получении
необходимого количества ключей раунда из исходного ключа шифрования (в
простейших случаях процедура расширения ключа просто разбивает ключ на
несколько фрагментов, которые поочередно используются в раундах
шифрования).
2. Алгоритмы на основе подстановочно-перестановочных сетей. В
отличие от алгоритмов, основанных на сети Фейстеля, данные алгоритмы
обрабатывают за один раунд шифруемый блок целиком. Обработка данных
сводится, в основном, к заменам и перестановкам, зависящим от ключа Ki
(рис. 10.5).
117
118
В основе алгоритма шифрования с открытым ключом лежит идея
использования легко осуществимого на стадии шифрования математического
преобразования, которое сложно было бы обратить (без знания специальной
секретной информации) для реализации второй стадии алгоритма, т. е.
расшифрования. Преобразование, обладающее указанным свойством,
называется односторонней функцией или функцией-ловушкой.
Имеется набор широко известных и всесторонне изученных
односторонних функций. К ним относятся функции, изученные при решении
задачи разложения целых чисел на множители, проблемы вычисления
дискретных логарифмов или вычисления квадратных корней по модулю
составного числа. Отметим, что применяемые функции являются
односторонними только в вычислительном отношении, т.е. имея достаточно
большие компьютерные мощности, их вполне можно обратить, причем
быстрее, чем найти секретный ключ в результате полного перебора.
Рассмотрим построение ассиметричных алгоритмов на примере
системы, разработанной в 1978 году американцами Р.Ривестом, Э.Шамиром
и Л.Адлеманом. По их именам эта система получила название RSA. Вообще
она является первой и наиболее известной системой с открытым ключом.
Пусть абоненты A и B решили организовать для себя возможность
секретной переписки. Для этого каждый из них независимо выбирает два
больших простых числа ( p A1 , p A2 и p B1 , p B2 ), находит их произведение
(rA и rB), функцию Эйлера от этого произведения (ϕ (rA) и ϕ ( rB)) и случайное
число (a и b), меньшее вычисленного значения функции Эйлера и взаимно
простое с ним. Кроме того, A из уравнения
aα ≡ 1 (mod ϕ (rA))
находит α (0 < α < ϕ (rA)), а B из уравнения
bβ ≡ 1 (mod ϕ (rB))
находит β (0 < β < ϕ (rB)). Затем A и B публикуют доступную всем
информацию вида:
119
A: rA, a;
B: rB, b.
Теперь кто-угодно может отправлять конфиденциальные сообщения A
или B. Например, если пользователь C хочет отправить сообщение m для B
(m должен быть меньшим rB или делится на куски, меньшие rB), то он
использует ключ b для получения шифрованного сообщения m1 по формуле
m1 ≡ mb (mod rB),
которое и отправляется B. Получатель сообщения B для дешифрирования m1
использует ключ β в формуле
β
m1β ≡ mb ≡ m (mod rB),
так как bβ ≡ 1 (mod ϕ (rB)), следовательно, bβ = kϕ (rB) + 1 для некоторого
ϕ (rB) + 1 ϕ (rB) ϕ (rB)
целого k и mk ≡ (m )km ≡ m (mod rB), так как m ≡ 1 (mod rB) по
теореме Эйлера-Ферма.
Функция Эйлера ϕ (n), где n – натуральное число, определяется
следующим образом:
1. ϕ (1) = 1;
k
α −1
2. ϕ(n) = ∏ pi i ( pi −1) ,
i =1
120
10.6. Цифровая подпись
Некоторые из асимметричных алгоритмов могут использоваться для
генерирования цифровой подписи. Цифровой подписью называют блок
данных, сгенерированный с использованием некоторого секретного ключа.
При этом с помощью открытого ключа можно проверить, что данные были
действительно сгенерированы с помощью этого секретного ключа.
Цифровые подписи используются для того, чтобы подтвердить, что
сообщение пришло действительно от заявленного отправителя (в
предположении, что лишь отправитель обладает секретным ключом,
соответствующим его открытому ключу). Также подписи используются для
проставления штампа времени на документах: сторона, которой доверяют,
подписывает документ со штампом времени с помошью своего секретного
ключа и, таким образом, подтверждает, что документ уже существовал в
момент, объявленный в штампе времени.
Цифровые подписи также можно использовать для удостоверения
(сертификации) принадлежности документа определенному лицу: открытый
ключ и информация о его принадлежности подписываются стороной,
которой доверяют. При этом доверять подписывающей стороне можно на
основании того, что ее ключ был подписан третьей стороной. Таким образом,
возникает иерархия доверия. Очевидно, что некоторый ключ должен быть
корнем иерархии (т.е. ему доверяют не потому, что он кем-то подписан, а
потому, что априорно известно, что ему можно доверять).
В централизованной инфраструктуре ключей имеется очень небольшое
количество корневых ключей сети (например, облеченные полномочиями
государственные агенства, которые также называют сертификационными
агенствами). В распределенной инфраструктуре нет необходимости иметь
универсальные для всех корневые ключи, и каждая из сторон может доверять
своему набору корневых ключей (скажем своему собственному ключу и
ключам, ею подписанным). Эта концепция носит название сети доверия.
121
Цифровая подпись документа обычно создается следующим образом:
из документа генерируется так называемый дайджест и к нему добавляется
информация о том, кто подписывает документ, штамп времени и прочее.
Получившаяся строка далее зашифровывается секретным ключом
подписывающего с использованием того или иного алгоритма.
Получившийся зашифрованный набор бит и представляет собой подпись.
К подписи обычно прикладывается открытый ключ подписавшей стороны.
Получатель сначала решает для себя доверяет ли он тому, что открытый
ключ принадлежит именно тому, кому должен принадлежать (с помощью
сети доверия или априорного знания), и затем дешифрует подпись с
помощью открытого ключа. Если подпись нормально дешифрировалась, и ее
содержимое соответствует документу (дайджест и др.), то сообщение
считается подтвержденным.
Свободно доступны несколько методов создания и проверки цифровых
подписей. Наиболее известным является метод, основанный на применении
RSA.
10.7. Хэш-алгоритмы
Криптографические хэш-алгоритмы используются обычно для
генерации дайджеста сообщения при создании цифровой подписи. Они
основаны на применении хэш-функций, отображающих сообщение в
имеющее фиксированный размер хэш-значение таким образом, что все
множество возможных сообщений распределяется равномерно по множеству
хэш-значений. При этом криптографическая хэш-функция делает это таким
образом, что практически невозможно подогнать документ к заданному хэш-
значению. Криптографические хэш-функции обычно производят значения
длиной в 128 и более бит (это число значительно больше, чем количество
собщений, которые когда-либо будут существовать в мире). Широко
известны такие хэш-алгоритмы, как MD5 и SHA.
122
Вопросы
1. Модель шифрования.
2. Определение ключа согласно ГОСТ.
3. Криптографическая стойкость.
4. Симметричные алгоритмы шифрования.
5. Алгоритмы на основе сети Фейстеля.
6. Алгоритмы на основе подстановочно-перестановочных сетей.
7. Алгоритмы с квадратной структурой.
8. Ассиметричные алгоритмы шифрования.
9. Алгоритм RSA.
10. Цифровая подпись.
11. Хэш-алгоритмы.
Лекция 17
Тема 11. Программная реализация алгоритмов кодирования
11.1. Программирование алгоритмов сжатия информации
При программной реализации алгоритмов кодирования необходимо
учитывать ограничения на ресурсы вычислительной системы и
характеристики выбранной системы программирования. Особенности
программирования алгоритмов сжатия данных рассмотрим на примере
реализации арифметического кодирования.
Вспомним, что метод арифметического кодирования, разработанный в
70-е годы XX века, основан на идее преобразования входного потока в одно
число с плавающей запятой. Это число имеет значение, меньшее 1 и большее
либо равное 0. Из этого числа можно однозначно восстановить
последовательность символов, при кодировании которых оно было
построено.
В общем виде алгоритм арифметического кодирования на псевдокоде
может быть описан следующим образом:
123
НижняяГраница = 0.0;
ВерхняяГраница= 1.0;
Пока ((ОчереднойСимвол = ДайОчереднойСимвол()) != КОНЕЦ)
Интервал = ВерхняяГраница - НижняяГраница;
ВерхняяГраница = НижняяГраница + Интервал *
ВерхняяГраницаИнтервалаДля(ОчереднойСимвол);
НижняяГраница = НижняяГраница + Интервал *
НижняяГраницаИнтервалаДля(ОчереднойСимвол);
Конец Пока
Выдать (НижняяГраница)
Соответствующий алгоритм арифметического декодирования на
псевдокоде может быть описан так:
Число = ПрочитатьЧисло();
Всегда
Символ = НайтиСимволВинтервалКоторогоПопадаетЧисло(Число)
Выдать (Символ)
Интервал = ВерхняяГраницаИнтервалаДля (Символ) –
НижняяГраницаИнтервалаДля (Символ);
Число = Число - НижняяГраницаИнтервалаДля(Символ);
Число = Число / Интервал;
Конец Всегда
Таким образом, при обработке числа после определения символа, в
интервал которого оно попадает, этот символ выдается как раскодированный,
а его влияние на число устраняется действиями, обратными действиям,
выполнявшимся при кодировании. В приведенном алгоритме не
рассматривается вопрос остановки декодера. В практических реализациях
декодер останавливается при обнаружении специального символа конца
файла EOF.
Несмотря на то, что в исходном описании арифметического
кодирования использовались вещественные числа, на практике он
реализуется с помощью целочисленной (16- или 32-разрядной) арифметики.
Как уже говорилось, при работе алгоритм отслеживает верхнюю и
нижнюю границы возможного кода. Сразу после старта нижняя граница
124
установлена в 0.0, а верхняя — в 1.0. Первое упрощение для работы с
целочисленной арифметикой заключается в замене 1 на 0.999... (или .111...) в
двоичном коде. Дробные части значений границ будем располагать в
целочисленных регистрах, выравнивая их влево (старшие биты значения в
старших битах регистра).
Заполним регистры битами 1 для верхней и 0 для нижней границ
соответственно. Поскольку известно, что значения в регистрах
соответствуют бесконечным дробям, то впоследствии можно будет сдвигать
их влево, втягивая дополнительные биты по мере необходимости. Это
произойдет тогда, когда наиболее значимые цифры в обоих регистрах будут
совпадать. Так как в силу природы алгоритма эти цифры уже никогда не
изменятся, то их можно выдать как первую цифру кода сообщения. Это
можно сделать, сдвигая регистры влево на одну цифру и «втягивая» 9 (для
десятичного представления) или 1 (для двоичного представления) на место
младшей цифры регистра верхней границы.
После того, как будут обработаны все символы сообщения, необходимо
выдвинуть два дополнительных символа либо из верхней границы, либо из
нижней границы для того, чтобы декодер смог правильно обработать код.
В процессе работы алгоритма может возникнуть ситуация, когда
интервал между границами настолько мал, что все последующие итерации не
изменят значений границ, а поскольку старшие цифры границ не совпадают,
то зациклится. Для того чтобы избежать этой ситуации, необходимо
изменить алгоритм следующим образом. Если две старшие цифры границ не
совпадают, то, если они отличаются на единицу, проверим следующие по
значимости цифры границ. Если они равны 0 у верхней границы и 9 (для
десятичного представления) или 1 (для двоичного представления) у нижней,
значит нужно сделать следующее: удалим вторые по значимости цифры
границ и остальные менее значимые сдвинем влево по описанным правилам
(старшие цифры остаются на месте). Затем увеличим специальный счетчик
для запоминания того факта, что цифры были «выброшены». Будем
125
продолжать те же действия до тех пор, пока старшие цифры границ не
совпадут. Затем в код сообщения помещается совпавшая старшая цифра, а за
ней равное счетчику количество девяток (для десятичного представления)
либо единиц (для двоичного представления) или нулей, в зависимости от
того, к цифре верхней или нижней границы сошлись старшие цифры.
На практике число, представляющее собой код сообщения, может
занимать сотни килобайтов (или даже мегабайтов) памяти, и поэтому
«идеальный» алгоритм арифметического декодирования, описанный ранее,
работать не будет (из-за ограниченности разрядной сетки). Однако, как и
кодер, арифметический декодер может работать на целочисленных
регистрах. При этом он использует уже три регистра. Первые два в точности
такие, как у кодера, третий – регистр кода, который содержит очередные
биты декодируемого сообщения. Значение в регистре кода всегда находится
между значениями верхней и нижней границ.
Верхняя и нижняя границы на каждом шаге имеют абсолютно те же
значения, которые они имели при кодировании, и обновляются одинаковым
образом. Так же осуществляется проверка на зацикливание. Выполняя эту
проверку, декодер определяет, когда необходимо помещать очередную
цифру из входного потока в регистр кода. На основании содержимого
регистров кода и границ декодер принимает решение о раскодируемом
символе.
Перед началом декодирования регистры верхней и нижней границ
инициализируются так же, как и перед началом кодирования. Регистр кода
заполняется первыми цифрами кода декодируемого сообщения.
В «идеальном» алгоритме, описанном ранее, возможно определить
текущий символ для декодирования, просто просматривая таблицу
интервалов вероятностей символов в данном сообщении. В целочисленной
реализации интервал вероятностей определяется не как диапазон от 0.0 до
1.0, а как разница между текущими значениями верхней и нижней границ.
126
Целочисленная реализация арифметического декодирования
использует четыре шага для декодирования каждого символа:
1. определяется текущий интервал вероятностей;
2. значение регистра кода масштабируется на основе значений
текущего интервала вероятностей, регистров кода и границ;
3. на основе масштабированного значения регистра кода определяется
очередной символ восстановленного сообщения.
4. код декодированного символа выдается на выход декодера.
127
имеющий m + 1 проверочных символов и d = 4. CRC-коды обладают
следующими важными свойствами:
1. все ошибки кратности 3 или меньше обнаруживаются;
2. все ошибки нечетной кратности обнаруживаются;
3. все пакеты ошибок l = m + 1 или меньше обнаруживаются;
4. доля необнаруживаемых пакетов ошибок l = m + 2 составляет 2–m;
5. доля необнаруживаемых пакетов ошибок l ≥ m + 3 составляет 2–(m–1).
Очевидно, что популярность CRC-кодирования, а CRC-коды
используются во многих приложениях (например, архиваторах WinRAR и
WinZIP), связана не только с эффективностью обнаружения ошибок, но и с
временем, затрачиваемым на это. Поэтому на практике вместо выполнения
побитового деления по модулю 2 (операция XOR) используются табличные
алгоритмы.
Соответствующая модификация алгоритма предусматривает
организацию таблицы из 256 значений, каждое из которых содержит
слагаемые, используемые во время операции деления. Очередное значение из
таблицы выбирается по индексу, равному старшему байту регистра
кодирования. Алгоритм на псевдокоде выглядит следующим образом:
Пока (в строке имеются необработанные биты)
Индекс = СтаршийБайтРегистра;
Регистр = СдвигРегистра OR НовыеБитыИзСтроки;
Регистр = Регистр XOR Таблица [Индекс];
Конец Пока
i = 0;
k = n;
l =2;
Пока (k ≠ 1)
Если (k mod l = 0)
k = k div l;
i = i + 1;
ni = l;
Иначе
Если (l * l > k)
l = k;
Иначе
l = l + 1;
Конец Если
Конец Если
Конец Пока
129
RIPEMD160Managed, SHA1CryptoServiceProvider, SHA256Managed,
SHA384Managed, SHA512Managed, HMACSHA1, MACTripleDES.
Для шифрования данных имеются классы симметричного и
ассиметричного шифрования. Классы симметричного шифрования – это
RijendalManaged (реализует алгоритм Rijendal), RC2 (реализует алгоритм,
разработанный RC2), DES (реализует алгоритм DES), TripleDES (реализует
алгоритм TripleDES). Для реализации алгоритмов с открытым ключом
разработаны классы RSACryptoServiceProvider (алгоритм RSA) и
DSACryptoServiceProvider (для использования цифровых подписей).
Вопросы
1. Особенности практической реализации алгоритмов кодирования.
2. Практическая реализация арифметического кодирования.
3. CRC-алгоритм.
4. Алгоритмы шифрования.
5. Программные средства среды .NET.
6. Классы для реализации алгоритмов сжатия в среде .NET.
7. Классы для реализации алгоритмов проверки целостности данных в
среде .NET.
8. Классы для реализации алгоритмов шифрования в среде .NET.
130