Режим шифрования

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

История стандартизации[править | править вики-текст]

В 1981 году в FIPS 81 были описаны первые режимы работы блочных шифров, такие как ECB, CBC, OFB, and CFB. Позже, в 2001 NIST пересмотрел список одобренных режимов, включив туда AES в качестве блочного шифра и добавив режим CTR в SP800-38A. И наконец, в январе 2010, NIST добавил XTS-AES в SP800-38E. Существуют также и другие режимы, не одобренные NIST. Например, режим CTS (Сiphertext Stealing) доступен во многих популярных криптографических библиотеках.

Сегодня, режимы шифрования определяются рядом национально и международно признанных организаций. Наиболее влиятельной из них является NIST — Национальный институт стандартов и технологий (США).

Основные режимы[править | править вики-текст]

Существует несколько стандартных режимов шифрования.[1] Ниже приведены основные из них.

Electronic Codebook (ECB)[править | править вики-текст]

Каждый блок открытого текста заменяется блоком шифротекста. В ГОСТ 28147—89 называется режимом простой замены.
Принцип шифрования:
Пусть есть сообщение P которое нужно зашифровать. Оно делится на блоки по n битов. Получаем последовательность блоков P_1,P_2,...,P_q последний из них при необходимости дополняется до длины n[2][3]. По ним определяются блоки C_1,C_2,...,C_q как результат воздействия шифрующей функции:

C_i = E_k \left( P_i \right)

где i — номера блоков, C_i и P_i — блоки зашифрованного и открытого соответственно, а E_k — функция блочного шифрования. Расшифровка аналогична:

P_i = D_k \left( C_i \right)
Шифрование в режиме ECB

Недостаток ECB, в сравнении c другими режимами шифрования, — сохранение статистических особенностей открытого текста[4]:

Tux.jpg Tux ecb.jpg Tux secure.jpg
оригинальная битовая карта

изображения

криптограмма в режиме ECB

(сохранились статистические особенности)

другие режимы шифрования

(псевдослучайная последовательность)

Скорость обработки блоков в режиме ЕСВ фиксирована и определяется эффективностью реализации блочного шифра. Режим ЕСВ допускает эффективное распараллеливание вычислений. Однако конвейерная обработка блоков в данном режиме невозможна.[1]

Cipher Block Chaining (CBC)[править | править вики-текст]

Каждый блок открытого текста (кроме первого) побитово складывается по модулю 2 (операция XOR) с предыдущим результатом шифрования[5]. Шифрование:
Сначала так же как и в случае с ECB, первоначальное сообщение разбиваем на блоки, при необходимости дополнив последний до длины n[6], далее следуют действия:

C_0=IV
C_i = E_k \left( P_{i} \oplus C_{i-1} \right)

где i — номера блоков, IV — вектор инициализации (синхропосылка), C_i и P_i — блоки зашифрованного и открытого текстов соответственно, а E_k — функция блочного шифрования. Расшифрование:

P_i=C_{i-1} \oplus D_k \left( C_{i} \right)
Шифрование в режиме сцепления блоков шифротекста

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

Режим CBC является режимом устраняющим недостатки режима ECB, что происходит следующим образом: каждый блок открытого текста маскируется соответственно блоком шифртекста, полученном на предыдущем этапе. Скорость обработки в данном режиме также определяется скоростью шифра, при этом не ниже производительности блочного шифра — задержка при выполнении операции XOR пренебрежимо мала. Процедура шифрования в режиме СВС трудно распараллеливается, процедура дешифрования легко распараллеливается.[1]

Propagating Cipher Block Chaining (РСВС)[править | править вики-текст]

Недостатки режима CBC привели к созданию усовершенстванного режима распространяющегося сцепления блоков шифра (Propagating Cipher Block Chaining, РСВС)[5]. Естественно этот режим похож на CBC за исключением того, что предыдущий блок открытого текста и предыдущий блок шифртекста подвергается операции XOR с текущим блоком открытого текста перед шифрованием или после него.[1]
c_i = E_k \left( m_{i} \oplus m_{i-1} \oplus c_{i-1} \right)
Сответственно расшифрование: m_i = D_k(c_{i}) \oplus c_{i-1} \oplus m_{i-1}
где m_{0} \oplus c_{0} — вектор иницилизации
Режим шифрования РСВС применяется в протоколе Kerberos 4 версии и позволяет обнаруживать ошибки. Данный режим шифрования не является федеральным или международным стандартом. Режим РСВС — вариант режима СВС, обладающий специфическим свойством — ошибка шифротекста приводит к неправильному дешифрированию всех последующих блоков. Это соответственно означает, что проверка стандартного блока в конце сообщения обеспечивает целостность всего сообщения.

Шифрование в режиме PCBC


Конечно, этот режим не лишен недостатков, так перестановка двух блоков шифротекста приводит к неправильной расшифровке двух соответствующих блоков открытого текста, но из-за XOR над открытым текстом и шифротекстом, дальнейшие ошибки компенсируются. Поэтому, если при проверке целостности проверяются только несколько последних блоков расшифрованного текста, можно получить частично испорченное сообщение. Хотя никто ещё не воспользовался этой уязвимостью в Kerberos, но в 5 версии уже перешли на режим CBC.

Cipher Feedback (CFB)[править | править вики-текст]

Режим обратной связи по шифротексту, режим гаммирования с обратной связью (англ. Cipher Feedback Mode, CFB)[5]. Для шифрования следующего блока открытого текста он складывается по модулю 2 с перешифрованным (блочным шифром) результатом шифрования предыдущего блока.

C_0 = IV
C_i = E_k \left( C_{i-1} \right) \oplus P_i
P_i = E_k \left( C_{i-1} \right) \oplus C_i
Шифрование в режиме обратной связи по шифротексту

Криптостойкость СFВ определяется криптостойкостью используемого шифра. Фиксированные блоки открытого текста маскируются блоками шифротекста. Если в режиме СFВ с полноблочной обратной связью имеется два идентичных блока шифротекста, результат, например, DES-шифрования на следующем шаге будет тем же. Скорость шифрования СFВ-режима с полноблочной обратной связью та же, что и у блочного шифра, причем возможности распараллеливания процедуры шифрования ограничены.[1]

Output Feedback (OFB)[править | править вики-текст]

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

Из-за симметрии операции сложения, шифрование и расшифрование похожи:

C_i=P_i\oplus O_i

P_i=C_i\oplus O_i

O_i=E_k(O_{i-1})

O_0=IV

Шифрование в режиме OFB
Расшифрование в режиме OFB


Каждая операция блочного шифра обратной связи вывода зависит от всех предыдущих и поэтому не может быть выполнена параллельно. Однако, из-за того, что открытый текст или зашифрованный текст используются только для конечного сложения, операции блочного шифра могут быть выполнены заранее, позволяя выполнить заключительное шифрование параллельно с открытым текстом.
Обратная связь по выходу на k разрядов не рекомендуется из соображений криптостойкости. Режим OFB имеет следующее преимущество по сравнению с режимом CFB: ошибки, возникающие в результате передачи по каналу с шумом, при дешифровании не «размазываются» по всему шифротексту, а локализуются в пределах одного блока. Однако открытый текст может быть изменен путем определенных манипуляций с блоками шифротекста. Несмотря на то, что OFB-шифрование не поддается распараллеливанию, эффективность процедуры может быть повышена за счет предварительной генерации независимой последовательности блоков.[1]

Данный метод называется также «режим обратной связи по выходу».

OFB также предполагает некое усовершенствование касающееся метода генерации независимой последовательности блоков: для получения очередного блока предлагается шифровать не с O_i, а c O_i + IV(mod 2^{64}), где IV некоторый вектор инициализации.

Counter Mode (CTR)[править | править вики-текст]

Режим Счетчика (Counter Mode-CTR)[5] предполагает возврат на вход соответствующего алгоритма блочного шифрования значения некоторого счетчика, накопленного с момента старта. Режим делает из блочного шифра потоковый, то есть генерирует последовательность, к которой применяется операция XOR с текстом сообщения. Исходный текст и блок зашифрованного текста имеют один и тот же размер блока, как и основной шифр (например, DES или AES).[7] Режим CTR предусматривает следующие операции.

Шифрование в режиме CTR

C_i=P_i \oplus E_k (Ctr_i); i=1,2,\ldots,m

Расшифровка в режиме CTR

P_i=C_i \oplus E_k (Ctr_i) ;  i=1,2,\ldots,m

Ctr_i — значение счетчика для i-го блока.

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

Во-первых, значения счетчика для шифрования блоков в пределах одного сообщения получаются из начального значения счетчика использованием функции приращения. Чтобы обеспечивать случайность, величина приращения может зависеть от номера блока. Стандартная функция приращения может быть применена как ко всему блоку счетчика, так и к его части. Пусть значение счетчика представляет блок из b битов, а функцию приращения мы применяем к m младшим разрядам.

L_{i+1}= L_i + 1 \mod  2^m

Ctr_{i+1}= M_i|L_{i+1}

| — функция конкатенации; L_i — младшие m битов;  M_i — старшие b-m битов. Уникальность значений счетчика обеспечивается для всех блоков сообщения при условии, что n \le  2^m . Где n — количество блоков, на которое разбивается сообщение.

Во-вторых, начальные значения счетчика для каждого сообщения выбираются таким образом, чтобы обеспечить уникальность всех используемых значений счетчика. Этого можно достичь разными способами. Например, если сообщения шифруются последовательно, то в качестве начального значения счетчика для данного сообщения можно использовать результат применения функции приращения к последнему значению счетчика предыдущего сообщения. При этом если функция приращения использует m битов, общее количество блоков открытого текста не должно превышать 2^m. Другой подход предлагает разбить двоичное представление счетчика на две части. Старшие разряды назначаются одноразовым номером сообщения, а к оставшимся будет применяться функция приращения[8].

При отсутствии обратной связи алгоритмы шифрования и расшифровки в режиме CTR могут выполняться параллельно. Более того большие объёмы вычислений, связанные с шифрованием значений счетчика могут быть выполнены заранее, до того как открытый текст или шифротекст окажутся доступными. Это обеспечивает режиму CTR преимущество перед режимами Cipher Feedback (CFB) и Output Feedback (OFB).

Initialization vector (IV)[править | править вики-текст]

В криптографии, вектор инициализации (IV) представляет собой некоторое число, как правило оно должно быть случайным или псевдослучайным[9]. Случайность имеет решающее значение для достижения семантической безопасности, которая при повторном использовании схемы под тем же ключом не позволит злоумышленнику вывести отношения между сегментами зашифрованных сообщений. Для блочных шифров, использование IV описывается режимами работы. Рандомизация требуется также для других примитивов, таких как универсальная хэш-функции и коды аутентификации сообщений на их основе.

В таких режимах шифрования, как CBC, CFB и OFB на вход подаётся вектор инициализации (IV). Причём как отправитель, так и получатель в начале сеанса связи должны иметь один и тот же IV. Значение IV вовсе не обязано быть секретным и вполне может быть передано вместе с первым блоком шифротектса. Что действительно важно, так это то, что в режимах CBC и CFB это значение должно быть непредсказуемым, а в режиме OFB — уникальным[6].

Непредсказуемости в режимах CBC и CFB можно достичь несколькими способами. Например, можно подвергнуть преобразованию той же функцией значение какого-либо счётчика (скажем счётчика сообщений). Или использовать ГПК для генерации псевдослучайной последовательности нужной длины.

В режиме OFB вектор инициализации не обязан быть непредсказуемым, зато он должен быть уникален для всех сеансов связи в которых в OFB используется один и тот же секретный ключ шифрования K. Этого можно достичь опять же используя счётчик сообщений. Если же не следовать этому требованию, то секретность сообщения в режиме OFB может быть легко скомпрометирована. Одним из следствий этого требования является то, что очередной вектор инициализации для режима OFB нельзя генерировать путём применения функции с тем же ключом K.

Padding[править | править вики-текст]

Режимы ECB, CBC, и CFB работают с сообщениями открытого текста, длина которых должна быть кратна длине одного блока. Если это свойство не выполняется, то к сообщению необходимо добавить необходимое количество битов, называемых дополнением (англ. padding). Например, «padding method 2» ISO/IEC 9797-1 предлагает добавлять в конец сообщения единичный бит, а оставшиеся заполнять нулями[10].

При данном методе, получатель шифротекста должен точно знать, что в сообщении содержится дополнение. Это можно обеспечить прикрепляя дополнение к каждому сообщению. Даже если оно не требуется (в этом случае его посылают отдельным блоком). Это не единственное решение — можно, к примеру, посылать с каждым сообщением информацию о его длине[8].

Распространение ошибок[править | править вики-текст]

Для любого режима бит ошибки в блоке шифротекста приводит к тому, что результат его расшифрования оказывается испорченным. В режимах CFB, OFB, и CTR испорченный бит будет иметь ту же позицию в расшифрованном блоке, что и бит ошибки в блоке шифротекста, на остальные биты блока ошибка не распространится. В режимах ECB и CBC же испорченным может оказаться любой бит блока, с вероятностью около 50 % (зависит от прочности самого шифра). При этом, в режимах ECB, OFB, и CTR испорченным оказывается исключительно блок, получающийся в результате расшифровки испорченного блока. В режиме CBC ошибочному расшифрованию подвержен также и следующий блок, при этом испорченные биты будут соответствовать битам ошибке в шифротексте предыдущего блока. В режиме CFB бит ошибки в сегменте шифротексте влияет на следующие b/s (округляя до целого, b — длина блока, s — длина сегмента) сегментов, а ошибочным может оказаться любой из битов расшифрованного текста[8].

Наличие битов ошибок в векторе инициализации также наносит ущерб процессу расшифровки. В режиме OFB бит ошибки в IV поражает каждый блок шифротекста в соответствующем соответствующем сообщении. В режиме CFB при ошибках в векторе инициализации испорченым окажется, по крайней мере, первый сегмент шифротекста. Будут ли испорчены остальные сегменты зависит от положения самого правого бита в IV (в худшем случае пострадают b/s сегментов шифротекста). При использовании режимов OFB и CFB в результате появления бита ошибки в IV испорченным может оказаться любой бит поврежденного шифротекста. В режиме CBC испорчены будут исключительно биты первого блока шифротекста, стоящие на позициях, соответствующих битам ошибки в векторе инициализации.

Для режима CTR бит ошибки в значении счетчика приводит к тому, что любой бит в расшифровке соответствующего шифротекста может оказаться испорченным с вероятностью около 50 %.

Помимо возникновения бита ошибки в блоке шифротекстаможет произойти стирание или вставка бита. Это приводит к нарушению границ всех последующих блоков шифротекста, а результаты расшифровки будут абсолютно неверными, пока синхронизация границ не восстановится. При использовании режима 1-битного CFB синхронизация восстанавливается автоматически спустя b+1 позиций после появившегося или исчезнушего бита. В остальных режимах автоматического восстановления синхронизации не происходит[8].

Выбор режима шифрования[править | править вики-текст]

Выбор режима шифрования зависит от поставленной вами цели. Если вам важны скорость и простота, то ECB — самый простой и быстрый способ использования блочных шифров. Но ECB очень просто криптоанализировать. Хорошо подходит для шифрования других ключей. Так как данные малого размера и случайны, то недостатки ECB сказываются не сильно.

Для обычного открытого текста можно использовать CBC, CFB или OFB. Для шифрования файлов лучше пользоваться СBC. Значительно увеличивается безопасность, при появлении ошибок в хранимых данных почти никогда не бывает сбоев синхронизации. Конкретный режим зависит от ваших требований. В целом выбор метода шифрования это поиск компромисса между эффективностью и производительностью[11]

Литература[править | править вики-текст]

  • Брюс Шнайер «Прикладная криптография».
  • В. В. Ященко «Введение в криптографию».
  • А. П. Чмора «Современная прикладная криптография».

Ссылки[править | править вики-текст]