Глава 5. Режимы работы блочных шифров
элемента с периодом повторения, кратным размеру блока, в открытом тек-
сте появится два одинаковых блока. В большинстве строк Unicode каждый
второй байт является нулевым, что значительно повышает вероятность воз-
никновения повторяющихся блоков. Многие форматы файлов подразумевают
наличие больших блоков символов, состоящих исключительно из нулей, что
приводит к появлению повторяющихся блоков. К сожалению, данная особен-
ность режима ECB делает его слишком слабым для сколько-нибудь серьез-
ного использования.
5.3
Сцепление шифрованных блоков (CBC)
Наиболее популярным режимом работы блочных шифров является
сцеп-
ление шифрованных блоков (cipher block chaining — CBC)
. В этом случае во
избежание недостатков, свойственных режиму ECB, каждый блок открыто-
го текста складывается с помощью операции XOR с предыдущим блоком
шифрованного текста. Стандартная формулировка режима CBC выглядит
следующим образом:
C
i
=
E
(
K, P
i
⊕
C
i
−
1
)
для
i
= 1
, . . . , k.
Как видите, в открытый текст вносится “элемент случайности” путем его
прибавления к предыдущему блоку шифрованного текста. В режиме CBC
одинаковые блоки открытого текста преобразуются в разные блоки шифро-
ванного текста, что значительно сокращает объем информации об открытом
тексте, доступной злоумышленнику.
5.3.1
Фиксированный вектор инициализации
Следует заметить, что в качестве
C
0
используется значение, называемое
вектором инициализации (initialization vector — IV)
. Использовать фиксиро-
ванный вектор инициализации не следует. В противном случае в первом блоке
каждого сообщения могут возникнуть проблемы, свойственные режиму ECB.
Если два разных сообщения начинаются с одного и того же блока открытого
текста, соответствующие шифрованные сообщения будут начинаться с оди-
наковых блоков шифрованного текста. На практике сообщения часто начи-
наются с одинаковых или похожих блоков шифрованного текста, поэтому не
стоит помогать злоумышленнику.
5.3.2
Счетчик
В качестве вектора инициализации иногда используют счетчик. Напри-
мер, для первого сообщения значение вектора инициализации выбирается
5.3. Сцепление шифрованных блоков (CBC)
91
равным 0, для второго — 1 и т.д. Но это не совсем удачная идея. Как уже от-
мечалось, в реальной жизни многие сообщения начинаются примерно одина-
ково. Если первые блоки сообщений будут иметь простые отличия, использо-
вание в качестве вектора инициализации простого счетчика может нейтрали-
зовать эти различия с помощью операции XOR и вновь привести к генерации
одинаковых блоков шифрованного текста. В частности, значения 0 и 1 отли-
чаются друг от друга ровно одним битом. Если начальные блоки открытого
текста первых двух сообщений будут различаться только этим битом (что
происходит гораздо чаще, чем можно было ожидать), то начальные блоки
шифрованного текста обоих сообщений будут одинаковы. В этом случае зло-
умышленник сможет сразу же сделать определенные выводы относительно
различий между сообщениями, чего никогда не должна допускать безопасная
схема шифрования.
5.3.3
Случайный вектор инициализации
Все проблемы с режимом ECB, а также с использованием фиксированных
векторов инициализации или счетчиков в режиме CBC связаны с тем, что ре-
альные сообщения обладают высокой степенью неслучайности. Большинство
сообщений имеют фиксированный заголовок или стандартную, легко пред-
сказуемую структуру. В режиме CBC для внесения “элемента случайности”
в блоки открытого текста используются блоки шифрованного текста, однако
для шифрования первого блока текста применяется вектор инициализации.
Вот почему этот вектор должен быть случайным.
Применение случайного вектора инициализации связано с определенной
проблемой. Получатель сообщения должен знать значение вектора инициа-
лизации. Обычно для этого выбирают случайное значение IV и посылают его
в качестве первого блока перед самим шифрованным сообщением. В резуль-
тате процедура шифрования выглядит следующим образом:
C
0
:=
случайное значение блока,
C
i
:=
E
(
K, P
i
⊕
C
i
−
1
)
для
i
= 1
, . . . , k
при условии, что (дополненный) открытый текст
P
1
, . . . , P
k
преобразуется в
шифрованный текст
C
0
, . . . , C
k
. Обратите внимание, что шифрованный текст
начинается с блока
C
0
, а не
C
1
; шифрованный текст на один блок длиннее,
чем открытый. Из приведенных выше формул легко вывести соответствую-
щую процедуру дешифрования:
P
i
:=
D
(
K, C
i
)
⊕
C
i
−
1
для
i
= 1
, . . . , k.
Использование случайного вектора инициализации имеет два недостат-
ка. Прежде всего алгоритм шифрования должен иметь доступ к источнику
|