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.
Использование случайного вектора инициализации имеет два недостат-
ка. Прежде всего алгоритм шифрования должен иметь доступ к источнику