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

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

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

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

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

В 1981 году был принят стандарт FIPS 81. В стандарте были описаны первые режимы работы блочных шифров: ECB, CBC, OFB и CFB. В 2001 году институт NIST (национальный институт стандартов и технологий США) пересмотрел список режимов и добавил в него описание работы блочного шифра AES в режиме CTR (SP800-38A). В январе 2010 года NIST добавил в стандарт описание работы шифра AES в режиме XTS (SP800-38E).

В стандарте описаны не все режимы, а только режимы, одобренные институтом NIST. Например, режим CTS (англ. ciphertext stealing) в стандарте не описан, но реализован во многих популярных криптографических библиотеках.

Режимы шифрования определяются рядом национально и международно признанных организаций. Наиболее влиятельной из них является NIST.

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

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

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

В ГОСТ 28147—89 этот режим называется режимом простой замены.

Пусть дано сообщение P (открытый текст, последовательность бит, данные).

Во время шифрования выполняются следующие действия.

Шифрование в режиме ECB (режиме электронной кодовой книги)
  • Сообщение делится на блоки одинакового размера. Размер (длина) блока равен n и измеряется в битах. В результате получается последовательность блоков P_1,P_2,...,P_q. Последний блок при необходимости дополняется до длины n[2][3].
  • Каждый блок P_i шифруется алгоритмом шифрования E_k с использованием ключа k:
C_i = E_k \left( P_i, k \right),
где:
В результате получаются зашифрованные блоки C_1,C_2,...,C_q.

Расшифровка выполняется функцией D_k с использованием того же ключа k:

P_i = D_k \left( C_i, k \right).

Особенности:

  • каждый блок шифруется/расшифровывается независимо от других блоков.

Недостатки ECB:

Tux.jpg Tux ecb.jpg Tux secure.jpg
Открытый текст в виде изображения Криптограмма, полученная шифрованием в режиме ECB. На изображении видны черты исходного изображения Криптограмма, полученная шифрованием в режиме, отличном от ECB. Изображение представляет собой псевдослучайную последовательность пикселей

Достоинства ECB:

  • постоянная скорость обработки блоков (скорость определяется эффективностью реализации шифра);
  • возможно распараллеливание вычислений (так как блоки не связаны между собой).

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

Для шифрования некоторого сообщения P выполняются следующие действия[4].

Шифрование в режиме CBC (режиме сцепления блоков шифротекста)
  • Сообщение разбивается на блоки одинакового размера. Размер (длина) блока равен n и измеряется в битах. При необходимости последний блок дополняется до длины n[2].
  • Шифрование очередного (i-го) блока сообщения (P_i) выполняется с использованием предыдущего зашифрованного ((i-1)-го) блока (C_{i-1}). Для первого блока (P_1) зашифрованного блока (C_0) не существует, поэтому первый блок шифруют с использованием «вектора инициализации» (англ. initialization vector, IV):
C_0 = IV
Размер (длина) IV равна размеру блока (n).
C_i = E_k \left( P_{i} \oplus C_{i-1}, k \right),
где:

Расшифровка выполняется функцией D_k с использованием тех же ключа k и вектора инициализации IV:

C_0 = IV
P_i = C_{i-1} \oplus D_k \left( C_{i}, k \right)

Недостатки CBC:

Достоинства CBC:

  • постоянная скорость обработки блоков (скорость определяется эффективностью реализации шифра; время выполнения операции «xor» пренебрежимо мало);
  • отсутствие статистических особенностей, характерных для режима ECB (поскольку каждый блок открытого текста «смешивается» с блоком шифротекста, полученном на предыдущем шаге шифрования);
  • возможность распараллеливания расшифровки[1].

Propagating cipher block chaining (РСВС)[править | править вики-текст]

Недостатки режима CBC привели к созданию усовершенстванного режима распространяющегося сцепления блоков шифра (Propagating Cipher Block Chaining, РСВС)[4]. Естественно этот режим похож на 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 feed back (CFB)[править | править вики-текст]

Режим обратной связи по шифротексту, режим гаммирования с обратной связью (англ. cipher feed back mode, CFB)[4]. Во время шифрования каждый блок открытого текста складывается по модулю 2 с блоком, зашифрованным на предыдущем шаге.

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

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

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

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

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

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)[4] предполагает возврат на вход соответствующего алгоритма блочного шифрования значения некоторого счетчика, накопленного с момента старта. Режим делает из блочного шифра потоковый, то есть генерирует последовательность, к которой применяется операция XOR с текстом сообщения. Исходный текст и блок зашифрованного текста имеют один и тот же размер блока, как и основной шифр (например, DES или AES).[5] Режим 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. Другой подход предлагает разбить двоичное представление счетчика на две части. Старшие разряды назначаются одноразовым номером сообщения, а к оставшимся будет применяться функция приращения[6].

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Выбор режима шифрования зависит от поставленной вами цели.

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

См. также[править | править вики-текст]

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

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

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