Вы находитесь на странице: 1из 37

Лекция 13

Тема 9. Помехоустойчивое кодирование


9.1. Помехи
При передаче информации по каналу связи она преобразуется в
сигналы, удобные для прохождения по конкретной линии связи. Линия связи
– физическая среда, обеспечивающая поступление сигнала от передающего
устройства к приемному. Сигналы на выходе линии связи могут отличаться
от переданных из-за действия помех. Помехами называют любые мешающие
возмущения, как внешние, так и внутренние (источником которых являются
технические средства канала связи), вызывающие отклонения принятых
сигналов от переданных и затрудняющие их прием. К внешним помехам
относятся, например, атмосферные, индустриальные и преднамеренные
помехи, а к внутренним – помехи, вызываемые тепловым и дробовым
эффектами. Внешние источники помех вызывают в основном импульсные
помехи, а внутренние − флуктуационные. Помехи, накладываясь на
видеосигнал (последовательность импульсов при цифровой передаче),
приводят к двум типам искажений: краевые и дробления. Краевые искажения
связаны со смещением переднего или заднего фронта импульса. Дробление
связано с дроблением единого видеосигнала на некоторое количество более
коротких сигналов.
Для уменьшения влияния помех применяют помехоустойчивые коды, к
которым относятся коды, обнаруживающие ошибки, и корректирующие
коды.
Построение помехоустойчивых кодов в основном связано с
добавлением к исходной комбинации из k информационных символов r
контрольных символов. Так как закодированная комбинация будет
составлять n = k + r символов, то такие коды часто называют (n, k)-кодами.
Отметим, что при помехоустойчивом кодировании, в отличие от
сжатия, в передаваемую информацию вносится некоторая избыточность, т.е.,

94
как уже говорилось, наличие избыточности не всегда является
отрицательным показателем.
9.2. Коды для обнаружения ошибок
Один из самых старых, простых и используемых кодов для
обнаружения ошибок образуется путем добавления к передаваемой двоичной
комбинации, состоящей из k информационных символов (битов), одного
контрольного символа (0 или 1), так, чтобы общее число единиц в
передаваемой комбинации было четным. Такой код называется кодом с
проверкой на четность и позволяет обнаруживать одиночные ошибки.
Например, пусть даны две комбинации 11011 и 11100, для которых нужно
построить код с проверкой на четность. Первая комбинация имеет четное, а
вторая – нечетное число единиц. Поэтому к первой комбинации добавляется
0, а ко второй – 1. В результате получаем коды 110110 и 111001. Если
предположить, что в результате ошибок вместо указанных комбинаций были
получены 111110 и 110001, то проверка на четность их обнаружит, так как
контрольные символы у принятых комбинаций (если они правильные)
должны быть 1 и 0 соответственно.
Другим примером кодов с обнаружением ошибок является код с
постоянным весом, который содержит постоянное число единиц и нулей. В
этом случае, число возможных кодовых комбинаций составит
n!
N = C nm = ,
m!( n − m)!

где n – общее число символов, m – число единиц в кодовой комбинации.


Например, в таблице 9.1 приведены коды с двумя единицами из пяти (число
5!
кодируемых комбинаций равно C52 = =10 ). Этот код позволяет
2!(5 − 2)!

обнаруживать любые одиночные ошибки и часть многократных ошибок.


Однако с помощью этого кода не обнаруживаются ошибки смещения, когда
одна единица переходит в ноль и один ноль переходит в единицу или два
ноля и две единицы меняются на обратные символы и т. д.

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

Часто также используется корреляционный код (код с удвоением).


При его построении 1 преобразуется в 10, а 0 – в 01. Тогда, например, вместо
комбинации 1010011 будет передаваться 10011001011010. Ошибка
обнаруживается в том случае, если в парных элементах будут одинаковые
символы 00 или 11 (вместо 01 и 10).
Еще одним простым кодом является инверсный код. В этом случае к
исходной комбинации добавляется такая же комбинация по длине. В линию
посылается удвоенное число символов. Если в исходной комбинации четное
число единиц, то добавляемая комбинация повторяет исходную комбинацию,
если нечетное – то добавляемая комбинация является инверсной
относительно исходной. Например, инверсный код для комбинации 11011
будет иметь вид 1101111011 (контрольная комбинация 11011), а для
комбинации 11100 – 1110000011 (контрольная комбинация 00011). Прием
инверсного кода осуществляется в два этапа. На первом этапе суммируются
единицы в первой основной группе символов. Если число единиц четное, то
контрольные символы принимаются без изменения, если нечетное, то
контрольные символы инвертируются. На втором этапе контрольные
символы суммируются с информационными символами по модулю два.
Нулевая сумма говорит об отсутствии ошибок. При ненулевой сумме,
принятая комбинация считается ошибочной. Обнаруживающие способности

96
данного кода достаточно велики. Данный код обнаруживает практически
любые ошибки, кроме редких ошибок смещения, которые одновременно
происходят как среди информационных символов, так и среди
соответствующих контрольных.
Для снижения ошибок при кодировании угла поворота некоторого
объекта (а также и в других случаях) можно использовать код Грея. Примеры
кодов Грея приведены в таблице 9.2. Разряды в коде Грея не имеют
постоянного веса. Вес k-го разряда определяется следующим образом:
k
± ∑ 2i = ±( 2k +1 − 1) .
i =0

При этом все нечетные единицы, считая слева направо, имеют


положительный вес, а все четные единицы отрицательный. Например:
1110 2 = 1 × (23+1 − 1) − 1 × (22+1 − 1) + 1 × (21+1 − 1) = 15 − 7 + 3 = 1110 = 1011 2 .

Для перевода исходной комбинации в код Грея и обратно можно


воспользоваться следующими правилами. Пусть AnAn–1…A0 – исходная
двоичная комбинация, а anan–1…a0 – соответствующий ей код Грея. Тогда

 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
получим помощью куба и определим,

что расстояние между ними d = 7.

Рис.9.1. Представление двоичных кодов с помощью куба

Если код имеет кодовое расстояние d = 1, то все кодовые комбинации


размещаются в вершинах куба. Такой код не является помехоустойчивым –
он не в состоянии обнаружить ошибку. Если же выбрать комбинации с
кодовым расстоянием d = 2, например, 000, 110, 101, 011, то
соответствующий код будет уже более помехоустойчивым – позволит
обнаруживать одиночные ошибки. Назовем выбранные комбинации
разрешенными, предназначенными для передачи информации, а все

98
остальные (001, 010, 100, 111) – запрещенными. Очевидно, что любая
одиночная ошибка приводит к тому, что разрешенная комбинация переходит
в ближайшую запрещенную комбинацию, что можно обнаружить после ее
получения. При выборе комбинаций с кодовым расстоянием d = 3 получим
код, который позволит исправить одну одиночную ошибку или обнаружить
две ошибки. Таким образом, увеличивая кодовое расстояние можно
увеличить помехоустойчивость кода. В общем случае кодовое расстояние
определяется по формуле
d = t + l + 1,
где t – число исправляемых ошибок, l – число обнаруживаемых ошибок, при
этом обычно l > t.
Большинство корректирующих кодов являются линейными кодами, у
которых контрольные символы образуются путем линейной комбинации
информационных символов. Кроме того, корректирующие коды являются
групповыми кодами, т.е. образуют замкнутую группу с нулевым элементом и
операцией сложения. Замкнутость группы означает, что при сложении двух
элементов группы получается элемент, принадлежащий этой же группе. В
качестве операции сложения используется поразрядное сложение по модулю
2 (так как число разрядов у кодов не должно увеличиваться при выполнении
операции сложения).
Для построения кода способного обнаруживать и исправлять
одиночную ошибку необходимое число контрольных разрядов будет
составлять
n − k ≥ log ( n + 1) ,

где k – число разрядов исходной кодовой комбинации, n – число разрядов


после добавления контрольных символов, r – число контрольных символов.
Если необходимо иметь возможность исправлять однократные и двукратные
ошибки, то число контрольных разрядов определяется неравенством
(
n − k ≥ log 1 + C n1 + C n2 . )

99
В общем случае, число контрольных символов определяется неравенством
Хэмминга
t
n − k ≥ log(1 + C n1 + C n2 + ... + C nt ) = log∑ C ni ,
i =0

где t – максимальное число одновременно исправляемых ошибок.

9.4. Коды Хэмминга


Код Хэмминга является групповым (n, k)-кодом с минимальным
расстоянием d = 3, который позволяет обнаруживать и исправлять
однократные ошибки. Для построения кода Хэмминга используется
порождающая матрица, которая имеет вид
Gk ×n = ( Ak ×( n−k ) I k ) ,

где Ak× (n–k) − матрица двоичных элементов, Ik − единичная матрица, k – число


информационных разрядов кода, n – общее число разрядов кода.
Порождающей матрице соответствует проверочная матрица
(
H ( n−k )×n = I n −k AkT×( n−k ) ).
Матрица Ak× (n–k) содержит k строк, представляющих все возможные двоичные
комбинации длины n – k с не менее чем двумя единицами. Например, (7, 4)-
код Хэмминга из таблицы 9.3 имеет следующие порождающую и
проверочную матрицы:
1 1 0 1 0 0 0
 
0 1 1 0 1 0 0
G4×7 = ,
1 1 1 0 0 1 0

1 
 0 1 0 0 0 1

1 0 0 1 0 1 1
 
H 3×7 = 0 1 0 1 1 1 0 .
0 0 1 0 1 1 1
 

Таблица 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

Данный код является систематическим. Это значит, что каждую кодовую


комбинацию можно представить как
e1e2…en–kx1x2…xk,
где e1, e2, ..., en–k – проверочные символы, x1, x2, …, xk – информационные
символы. С помощью порождающей матрицы Gk× n из исходной кодовой k-
символьной комбинации Ck получается n-символьный код Хэмминга Xn
следующим образом:
Xn = CkGk× n.
Обнаружение ошибок основано на том, что для разрешенных кодовых
комбинаций справедливо равенство
X n H T( n −k )×n = 0 .

Поэтому если результат операции (синдром) не будет нулевым, то можно


сделать вывод о том, что кодовая комбинация содержит ошибку. В этом
случае определяется номер строки транспонированной проверочной матрицы
H T( n −k )×n , равной синдрому, который и будет номером разряда кодовой
комбинации, содержащим ошибку. Например, пусть вместо комбинации
0011010 была получена комбинация 0111010. Тогда синдром равен
1 0 0
 
0 1 0
0 0 1
 
(0 1 1 1 0 1 0) ×1 1 0 =(0 1 0) ,
0 1 1
 
1 1 1
 
1 0 1

что соответствует второй строке проверочной матрицы и, значит, ошибка


обнаружена во втором разряде кодовой комбинации. После исправления
символа во втором разряде с 1 на 0 получим правильную комбинацию:
0011010.

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 ),

где h(х) – заданный многочлен, соответствующий исходной кодовой


комбинации, g(х) – образующий многочлен, который является
неприводимым сомножителем при разложении двучлена хn+1 (таблица 9.6).
При декодировании принятую кодовую комбинацию необходимо
разделить на g(x). Если в результате деления остаток не равен нулю, то
означает, что в кодовой комбинации имеется ошибка.
Для выбора образующего полинома по заданной кодовой комбинации
сначала определяют число контрольных символов из соотношения
n – k = log(n + 1),
которое в численном виде показано в таблице 9.4, а затем из таблицы
неприводимых полиномов (таблица 9.6) выбирают самый короткий
многочлен со степенью, равной числу контрольных символов.

Таблица 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

Пусть, например, требуется закодировать комбинацию вида 1101, что


соответствует h(х) = х3 + х2 + 1. Процесс кодирования последовательно
выполняется в виде следующих шагов.
1. Определим число контрольных символов n – k. Оно будет равно 3.

2. Из таблицы 9.6 выберем многочлен g(х) = х3 + х + 1, т.е. 1011.

3. Умножим h(х) на хn–k: h(x)хn–k = (x3 + x2 + 1)x3 = x6 + x5 + x3, что соответствует

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. В результате получим закодированное

сообщение F(x) = x6 + x5 + x3 + 1 = 1101001.


103
В полученной кодовой комбинации циклического кода
информационные символы h(х) = 1101, а контрольные R(х) = 001.
Закодированное сообщение делится на образующий полином без остатка:
1101001 / 1011 = 1111.
Для образования циклических кодов можно воспользоваться
образующей (порождающей) матрицей. Образующая матрица Gk× n
составляется на основе единичной матрицы Ik, к которой справа
дописывается матрица остатков Rk× (n–k):
Gk ×n = ( I k Rk ×( n −k ) ) .

Матрица Rk× (n–k) получается из остатков ri от деления полинома x2(n–k)–i–1 на


образующий многочлен g(x) для всех строк с номерами i = 1, 2, …, k.
Например, для (7, 4)-кода и g(x) = х3 + х + 1 будут получены остатки,
представленные в таблице 9.5.

Таблица 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

Порождающая матрица для (7, 4)-кода с порождающим многочленом


g(x) = х3 + х + 1 имеет вид
1 0 0 0 1 0 1
 
0 1 0 0 1 1 1
G4×7 = .
0 0 1 0 1 1 0

0 
 0 0 1 0 1 1

Для обнаружения ошибок можно использовать проверочную матрицу


(
H ( n−k )×n = RkT×( n−k ) I n−k ).
Например, для (7, 4)-кода проверочная матрица будет следующей
1 1 1 0 1 0 0
 
H 3×7 = 0 1 1 1 0 1 0.
1 1 0 1 0 0 1
 

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

g1(x5) x5+x2+1 …………… ……………


g2(x5) x5+x3+1 g1(x8) x8+x4+x3+x+1
g3(x5) x5+x3+x4+x+1 g2(x8) x8+x4+x3+x2+1
g4(x5) x5+x4+x2+x+1 …………… ……………
g5(x5) x5+x4+x3+x+1 g1(x9) x9+ x+1
g6(x5) x5+x4+x3+x2+1 g2(x9) x9+x4+ 1

9.6. Сверточные коды и коды Рида-Соломона


Сверточные коды – это коды, исправляющие ошибки, которые
используют непрерывную, или последовательную, обработку информации
короткими блоками. Символы на выходе сверточного кодера зависят как от
информационных символов на входе, так и от предыдущих обработанных
символов, т.е. сверточный кодер представляет собой автомат с памятью.
Наиболее распространенным методом декодирования является алгоритм
Витерби.

105
Коды Рида-Соломона являются q-ичными кодами, где q > 2. Структура
кодов Рида-Соломона и алгоритм декодирования описывается с помощью
спектральных методов.
Изучение сверточных кодов и кодов Рида-Соломона оставляется на
самостоятельную работу.

Вопросы
1. Циклические коды.
2. Полиномиальное представление циклических кодов.
3. Операции над циклическими кодами.
4. Систематические циклические коды.
5. Полиномиальное представление циклических кодов.
6. Порождающая матрица.
7. Проверочная матрица.
8. Обнаружение и исправление ошибок.
9. Сверточные коды.
10. Коды Рида-Соломона.

Лекция 15
Тема 10. Криптография
10.1. Основные принципы информационной безопасности
Настоящее время характеризуется большими информационными
потоками. На основе быстро меняющихся данных постоянно принимаются
важные решения во всех сферах человеческой деятельности. С ростом
объемов информационных потоков и усилением роли информации в жизни
отдельного человека и общества в целом растут так же и требования к
информационной безопасности.
Развитие средств и методов информационной безопасности имеет
несколько этапов. До начала широкого использования автоматизированных
систем обработки данных безопасность информации достигалась

106
исключительно физическими и административными мерами. С появлением
компьютеров стала очевидной необходимость использования автоматических
средств защиты файлов данных и программной среды. Следующий этап
развития автоматических средств защиты связан с появлением
распределенных систем обработки данных и компьютерных сетей, в которых
средства сетевой безопасности используются в первую очередь для защиты
передаваемых по сетям данных.
Рассмотрим основные понятия, относящиеся к информационной
безопасности, и их взаимосвязь (рис. 10.1). Собственник определяет
множество информационных ценностей, которые должны быть защищены от
различного рода атак. Атаки осуществляются противниками или
оппонентами, использующими различные уязвимости в защищаемых
ценностях. Основными нарушениями безопасности являются раскрытие
информационных ценностей (потеря конфиденциальности), их
неавторизованная модификация (потеря целостности) или неавторизованная
потеря доступа к этим ценностям (потеря доступности). Собственники
информационных ценностей анализируют уязвимости защищаемых ресурсов
и возможные атаки, которые могут иметь место в конкретном окружении. В
результате такого анализа определяются риски для данного набора
информационных ценностей. Этот анализ определяет выбор контрмер,
который задается политикой безопасности и обеспечивается с помощью
механизмов и сервисов безопасности. Следует учитывать, что отдельные
уязвимости могут сохраниться и после применения механизмов и сервисов
безопасности. Политика безопасности определяет согласованную совокупность
механизмов и сервисов безопасности, адекватную защищаемым ценностям и
окружению, в котором они используются.

107

Рис. 1.1. Взаимосвязь основных понятий информационной безопасности


Дадим следующие определения введенных понятий:
1. уязвимость – слабое место в системе, с использованием которого может быть

осуществлена атака;
2. риск – вероятность того, что конкретная атака будет осуществлена с
использованием конкретной уязвимости;
3. политика безопасности – правила, директивы и практические навыки, которые

определяют то, как информационные ценности обрабатываются,


защищаются и распространяются в организации и между информационными
системами; набор критериев для предоставления сервисов безопасности;
4. атака – любое действие, нарушающее безопасность информационной

системы (действие или последовательность связанных между собой


действий, использующих уязвимости данной информационной системы и
приводящих к нарушению политики безопасности);
5. механизм безопасности – программное и/или аппаратное средство, которое

определяет и/или предотвращает атаку;


6. сервис безопасности – сервис, который обеспечивает задаваемую политикой

безопасность систем и/или передаваемых данных, либо определяет

108
осуществление атаки; сервис использует один или более механизмов
безопасности.
Ввиду того, что сегодня большая часть обмена информацией проходит
по компьютерным сетям и часто (в бизнесе, военным и прочее) нужно
обеспечивать конфиденциальность, то одной из наиболее важных проблем в
области информационной безопасности является обеспечение безопасного
сетевого взаимодействия, модель которого в общем виде можно
представлена на рис. 10.2.

Рис. 10.2. Модель сетевой безопасности


Все технологии повышения безопасности имеют два компонента. Во-
первых, это относительно безопасная передача информации. Примером
является шифрование, когда сообщение изменяется таким образом, что
становится нечитаемым для противника, и, возможно, дополняется кодом,
который основан на содержимом сообщения и может использоваться для
аутентификации отправителя и обеспечения целостности сообщения. Во-
вторых, это некоторая секретная информация, разделяемая участниками
информационного обмена и неизвестная противнику, примером которой
может служить ключ шифрования.
Из общей модели на рис. 10.1 вытекают три основные задачи, которые
необходимо решить при разработке конкретного сервиса безопасности.
1. Разработать алгоритм шифрования/дешифрования для выполнения
безопасной передачи информации. Алгоритм должен быть таким, чтобы

109
противник не мог расшифровать перехваченное сообщение, не зная
секретную информацию.
2. Создать секретную информацию, используемую алгоритмом
шифрования.
3. Разработать протокол обмена сообщениями для распределения
разделяемой секретной информации таким образом, чтобы она не стала
известна противнику.
Кроме сетевой безопасности существуют так же другие ситуации,
которые не соответствуют описанной выше модели. Общая модель этих
ситуаций проиллюстрирована на рис. 10.3.

Рис. 10.3. Модель безопасности информационной системы

В основу безопасности информационной системы должны быть


положены следующие основные принципы:
1. безопасность информационной системы должна соответствовать
роли и целям организации, в которой данная система установлена;
2. обеспечение информационной безопасности требует комплексного и
целостного подхода;
3. информационная безопасность должна быть неотъемлемой частью
системы управления в данной организации;
4. информационная безопасность должна быть экономически
оправданной;
5. ответственность за обеспечение безопасности должна быть четко
определена;
6. безопасность информационной системы должна периодически
переоцениваться.

110
7. большое значение для обеспечения безопасности информационной
системы имеют социальные факторы, а также меры административной,
организационной и физической безопасности.

10.2. Криптографические методы информационной безопасности


В качестве основных механизмов информационной безопасности
используются:
1. алгоритмы симметричного шифрования – алгоритмы шифрования, в

которых для шифрования и дешифрования используется один и тот же ключ


или ключ дешифрования легко может быть получен из ключа шифрования;
2. алгоритмы асимметричного шифрования – алгоритмы шифрования, в
которых для шифрования и дешифрования используются два разных ключа,
называемые открытым и закрытым ключами, причем, зная один из ключей,
вычислить другой невозможно;
3. хэш-функции – функции, входным значением которых является
сообщение произвольной длины, а выходным значением – сообщение
фиксированной длины (хэш-функции обладают рядом свойств, которые
позволяют с высокой долей вероятности определять изменение входного
сообщения).
Здесь под шифрованием и дешифрированием понимаются
разновидности процессов кодирования и декодирования информации.
Указанные средства основаны на применении криптографических
методов. Разработка и исследование таких методов составляет предмет
специальной науки – криптографии.
Криптография (тайнопись) – это раздел математики, в котором
изучаются и разрабатываются системы изменения письма с целью сделать
его непонятным для непосвященных лиц. Теоретические основы
классической криптографии впервые были изложены Клодом Шенноном в
конце 1940-х годов.

111
Методы криптографии начали развиваться еще в глубокой древности.
Известно, что еще в V веке до нашей эры тайнопись использовалась в
Древней Греции. Очень распространена была простейшая (для настоящего
времени) система шифрования – это замена каждого знака письма на другой
знак по выбранному правилу. Юлий Цезарь, например, заменял в своих
секретных письмах первую букву алфавита на четвертую, вторую – на пятую,
последнюю – на третью и т.п., т.е. A на D, B на E, Z на C и т.п. Его наследник
Октавиан Август заменял каждую непоследнюю букву алфавита на
следующую, а последнюю на первую. Подобные шифры, называемые
простой заменой или подстановкой, описаны в рассказах «Пляшущие
человечки» А. К. Дойла, «Золотой жук» Э. По и других детективных
произведениях.
Шифры простой замены легко поддаются расшифровке при знании
исходного языка сообщения, так как каждый письменный язык
характеризуется частотой встречаемости своих знаков. Например, в
английском языке чаще всего встречается буква E, а в русском – О. Таким
образом, в шифрованном подстановкой сообщения на русском языке самому
частому знаку будет с большой вероятностью соответствовать буква О. При
этом вероятность будет расти с ростом длины сообщения.
Усовершенствованные шифры-подстановки используют возможность
заменять символ исходного сообщения на любой символ из заданного для
него множества символов, что позволяет выровнять частоты встречаемости
различных знаков шифра, но подобные шифры удлиняют сообщение и
замедляют скорость обмена информацией.
В шифрах-перестановках знаки сообщения специальным образом
переставляются между собой, например, записывая сообщение в строки
заданной длины и беря затем последовательность слов в столбцах в качестве
шифра. Сообщение «ТЕОРИЯИНФОРМАЦИИ», используя строки длины 4,
будет в шифрованном таким методом виде выглядеть как

112
"ТИФАЕЯОЦОИРИРНМИ", потому что при шифровании использовался
следующий прямоугольник:
Т Е ОР
И ЯИН
ФОР М
А ЦИИ

Шифры-перестановки в общем случае практически не поддаются


дешифровке. Для их дешифровки необходимо знать дополнительную
информацию. Крупный недостаток подобных шифров в том, что если удастся
каким-то образом расшифровать хотя бы одно сообщение, то в дальнейшем
можно расшифровать и любое другое. Модификацией шифров-перестановок
являются шифры-перестановки со словом-ключом, которое определяет
порядок взятия слов-столбцов.
Системы с ключевым словом или просто ключом, известные с XVI
века, широко применяются до сих пор. Их особенностью является два уровня
секретности. Первый уровень – это собственно способ составления кода,
который постоянно известен лицам, использующим данный шифр. Второй
уровень – это ключ, который посылается отдельно от основного сообщения
по особо защищенным каналам и без которого расшифровка основного
сообщения невозможна.
Наиболее простой способ использования ключа хорошего шифра
следующий: под символами сообщения записывается раз за разом ключ,
затем номера соответствующих знаков сообщения и ключа складываются.
Если полученная сумма больше общего числа знаков, то от нее отнимается
это общее число знаков. Полученные числа будут номерами символов кода.
С ростом длины ключа трудоемкость дешифровки подобного шифра
стремительно растет. Например, рассмотренное ранее сообщение с ключом
"КИБЕРНЕТИКА" в шифрованном виде будет выглядеть как
"ЮОРЦЪНОБЮЪСШЙШОЪ". Процесс шифровки описывается схемой:
Т Е О Р И Я И Н Ф О Р М А Ц И И

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
ЮО Р Ц Ъ Н О Б ЮЪ С ШЙ ШО Ъ

Если в качестве ключа использовать случайную последовательность, то


получится нераскрываемый шифр. Проблема такого шифра – это способ
передачи ключа.
В информационных сетях использование традиционных систем
шифрования с ключом затрудненно необходимостью иметь специальный
особо защищенный способ для передачи ключа. В 1976 году У. Диффи и М.
Хеллман – инженеры-электрики из Станфордского университета, а также
студент Калифорнийского университета Р. Меркль, предложили новый
принцип построения криптосистем, не требующий передачи ключа
принимающему сообщение и сохранения в тайне метода шифрования.

Вопросы
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 – параметры алгоритма.

10.4. Алгоритмы симметричного шифрования

116
Симметричное шифрование делится на два вида: блочное и потоковое.
При блочном шифровании информация разбивается на блоки фиксированной
длины, после чего они поочередно шифруются. Алгоритмы потокового
шифрования обрабатывают данные побитно или посимвольно (можно
считать, что данные разбиваются на блоки единичной длины).
Большинство симметричных алгоритмов работают следующим
образом: над шифруемым текстом выполняется некоторое преобразование с
участием ключа шифрования, которое повторяется определенное число раз
(раундов). При этом по виду повторяющегося преобразования алгоритмы
шифрования принято делить на несколько категорий.
1. Алгоритмы на основе сети Фейстеля. Сеть Фейстеля подразумевает
разбиение обрабатываемого блока данных на несколько субблоков (частей),
один из которых обрабатывается некоторой функцией f и накладывается на
один или несколько остальных (рис. 10.4). Дополнительный аргумент
функции f, обозначенный на рис. 10.4 как Ki, называется ключом раунда и
является результатом обработки ключа шифрования процедурой расширения
ключа. Задачей процедуры расширения ключа заключается в получении
необходимого количества ключей раунда из исходного ключа шифрования (в
простейших случаях процедура расширения ключа просто разбивает ключ на
несколько фрагментов, которые поочередно используются в раундах
шифрования).
2. Алгоритмы на основе подстановочно-перестановочных сетей. В
отличие от алгоритмов, основанных на сети Фейстеля, данные алгоритмы
обрабатывают за один раунд шифруемый блок целиком. Обработка данных
сводится, в основном, к заменам и перестановкам, зависящим от ключа Ki
(рис. 10.5).

117

Рис. 10.4. Сеть Фейстеля Рис. 10.5. Подстановочно-перестановочная сеть


3. Алгоритмы с квадратной структурой. Пример подобного алгоритма
был приведен в разделе 10.2. Для алгоритмов квадратной структуры
характерно представление шифруемого блока данных в виде двумерного
массива байтов. Криптографические преобразования могут выполняться над
отдельными байтами массива, а также над строками или столбцами.
4. Алгоритмы с нестандартной структурой, к которым можно все
остальные существующие алгоритмы симметричного шифрования.

10.5. Алгоритмы асимметричного шифрования


При использовании алгоритмов симметричного шифрования каждая из
обменивающихся информацией сторон должна иметь копию общего
секретного ключа, что создает сложнейшую проблему управления ключами.
Этого недостатка лишены алгоритмы ассиметричного шифрования (однако у
них есть свои собственные недостатки, например, они более медленные).
В ассиметричных алгоритмах (алгоритмах с открытым ключом)
используются два ключа: открытый и секретный. Открытый ключ может
быть опубликован в справочнике наряду с именем пользователя. В
результате любой желающий может зашифровать с его помощью свое
сообщение и послать закрытую информацию владельцу соответствующего
секретного ключа. Расшифровать посланное сообщение сможет только тот, у
кого есть секретный ключ.

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

где pi – простые сомножители числа n, α i – кратности простых


сомножителей числа n.
Задача нахождения секретного ключа в алгоритме RSA будет иметь
такую же сложность, что и задача разложения числа на простые множители,
поскольку здесь использовалась соответствующая односторонняя функция.
Рассмотрим алгоритм RSA на примере. Пусть для A имеем p A1 = 7 и p A2 = 23.
Тогда rA = p A1 p A2 = 161, ϕ (rA) = ϕ (161) = 6 × 22 = 132, a = 7, α = 19. Если
кто-то захочет отправить A секретное сообщение m = 3, то он должен будет
преобразовать его в m1 ≡ 37 ≡ 94 (mod 161). Когда A получит m1 = 94, он
дешифрирует его по формуле m = 9419 ≡ 3 (mod 161).

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. код декодированного символа выдается на выход декодера.

11.2. Программирование проверки целостности информации


При программной реализации алгоритмов помехозащищенного
кодирования также необходимо учитывать ограничения вычислительных
ресурсов и размеры обрабатываемых данных. Покажем это на примере
алгоритма CRC-кодирования.
На практике используются CRC-4, CRC-8, CRC-12, CRC-16, CRC-32.
CRC-коды относятся к классу циклических кодов. Порождающие полиномы
для них приведены в таблице 11.1.
Таблица 11.1
Порождающие полиномы CRC-кодов
Код Порождающий полином
CRC-4 x4 + x + 1
CRC-8 x8 + x2 + x + 1
CRC-12 x12 + x11 + x3 + x2 + x + 1
CRC-16 x16 + x15 + x2 + 1
CRC-16 x16 + x12 + x5 + 1
CRC-32 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

Порождающие полиномы g(x) из таблицы 11.1 получаются из


примитивного многочлена p(x) степени m по формуле
g(x) = (1 + x)p(x).
С помощью порождающего многочлена g(x) может быть построен
циклический CRC (n, k)-код с параметрами n = 2m – 1, k = 2m – m – 2,

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 Таблица [Индекс];
Конец Пока

11.3. Программирование шифрования информации


В настоящее время существует множество алгоритмов шифрования
данных, например, AES, Blowfish, DES, IDEA, RC6, Rijndael, RSA, TripleDES.
Все они основаны на применении достаточно сложного математического
аппарата и требуют учета многих аспектов: от выбора структур данных до
реализации вычислений в условиях ограниченности ресурсов. Например, на
лекции, посвященной вопросам криптографии, было разобрано шифрование
128
по алгоритму RSA, при выполнении которого используется разложение
натурального числа на простые множители. Перебор всех возможных
вариантов в этом случае приводит к неоправданно большим затратам
времени. Поэтому на практике используют более эффективные алгоритмы.
Пусть необходимо определить простые множители (n1, n2, …)
натурального числа n. Приведенный далее алгоритм на псевдокоде
достаточно быстро решает задачу нахождения множителей, больших 1 и
меньших n, используя операции целочисленного деления div и нахождения
остатка mod.

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;
Конец Если
Конец Если
Конец Пока

11.4. Кодирование информации в среде .NET


При программировании в среде .NET имеется ряд средств для
реализации различных алгоритмов кодирования информации.
Для сжатия информации можно использовать средства потокового
ввода-вывода в сочетании с классами GZipStream и DeflateStream, которые
реализуют такие алгоритмы сжатия как GZIP и DEFLATE.
Для проверки целостности данных имеются средства реализации
следующих хэш-алгоритмов: MD5, RIPEMD160, SHA1, SHA256, SHA384,
SHA512, HMACSHA1, MACTripleDES. Для их использования можно
воспользоваться соответствующим классом: MD5CryptoServiceProvider,

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