Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 13 сентября 2016 года; проверки требуют 50 правок.
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 13 сентября 2016 года; проверки требуют 50 правок.
Режим шифрования
Режим шифрования — метод применения блочного шифра (алгоритма), позволяющий преобразовать последовательность блоков открытых данных в последовательность блоков зашифрованных данных. При этом для шифрования одного блока могут использоваться данные другого блока.
Обычно режимы шифрования используются для изменения процесса шифрования так, чтобы результат шифрования каждого блока был уникальным вне зависимости от шифруемых данных и не позволял сделать какие-либо выводы об их структуре. Это обусловлено, прежде всего, тем, что блочные шифры шифруют данные блоками фиксированного размера, и поэтому существует потенциальная возможность утечки информации о повторяющихся частях данных, шифруемых на одном и том же ключе.
В 1981 году был принят стандарт FIPS 81. В стандарте были описаны первые режимы работы блочных шифров: ECB, CBC, OFB и CFB. В 2001 году институт NIST (национальный институт стандартов и технологий США) пересмотрел список режимов и добавил в него описание работы блочного шифраAES в режиме CTR (SP800-38A). В январе 2010 года NIST добавил в стандарт описание работы шифра AES в режиме XTS (SP800-38E).
В стандарте описаны не все режимы, а только режимы, одобренные институтом NIST. Например, режим CTS (англ.ciphertext stealing) в стандарте не описан, но реализован во многих популярных криптографических библиотеках.
Режимы шифрования определяются рядом национально и международно признанных организаций. Наиболее влиятельной из них является NIST.
В ГОСТ 28147—89 этот режим называется режимом простой замены.
Шифрование:
Пусть дано сообщение (открытый текст, последовательность бит, данные).
Во время шифрования выполняются следующие действия:
Шифрование в режиме ECB (режиме электронной кодовой книги)
Сообщение делится на блоки одинакового размера. Размер (длина) блока равен n и измеряется в битах. В результате получается последовательность блоков . Последний блок при необходимости дополняется до длины [2][3].
Каждый блок шифруется алгоритмом шифрования с использованием ключа k:
Криптограмма, полученная шифрованием в режиме ECB. На изображении видны черты исходного изображения
Криптограмма, полученная шифрованием в режиме, отличном от ECB. Изображение представляет собой псевдослучайную последовательность пикселей
Достоинства ECB:
постоянная скорость обработки блоков (скорость определяется эффективностью реализации шифра);
возможно распараллеливание вычислений (так как блоки не связаны между собой).
Этот режим называется режимом электронной кодовой книги, так как существует возможность создать книгу, в которой каждому блоку открытого текста будет сопоставлен блок зашифрованного текста. Однако создать книгу — нетривиальная задача. Если размер блока равен x бит, то в книге будет содержаться 2x записей, и каждая книга будет соответствовать одному ключу.
Для шифрования некоторого сообщения выполняются следующие действия[4].
Шифрование в режиме CBC (режиме сцепления блоков шифротекста)
Сообщение разбивается на блоки одинакового размера. Размер (длина) блока равен n и измеряется в битах. При необходимости последний блок дополняется до длины [2].
Шифрование очередного (i-го) блока сообщения () выполняется с использованием предыдущего зашифрованного ((i-1)-го) блока (). Для первого блока () зашифрованного блока () не существует, поэтому первый блок шифруют с использованием «вектора инициализации» (англ.initialization vector, IV):
(вектор инициализации — случайное число)
Размер (длина) IV равна размеру блока (n).
В функцию шифрования передаётся сумма по модулю 2 («⊕», «xor») текущего блока сообщения и предыдущего зашифрованного блока :
Расшифровка выполняется функцией с использованием тех же ключа k и вектора инициализации IV:
Недостатки CBC:
возможность определения начала изменения данных по изменению шифротекста (если сравнить шифротексты двух сообщений с одним и тем же ключом, то номер первого блока, в котором шифротексты различаются, будет соответствовать номеру первого блока, в котором различаются исходные сообщения);
возможность изменения открытого текста при перемещении[куда?] блоков[каких?]; (Предыдущий автор, наверное, хотел сказать, о смене порядка блоков шифра. Это скорее недостаток ECB, и да, возможно изменить открытый текст при ECB, просто меняя блоки шифра местами).
невозможность распараллеливания шифрования (поскольку для шифрования каждого i-го блока требуется блок, зашифрованный на предыдущем шаге (блоки связаны между собой))[1].
Достоинства CBC:
постоянная скорость обработки блоков (скорость определяется эффективностью реализации шифра; время выполнения операции «xor» пренебрежимо мало);
отсутствие статистических особенностей, характерных для режима ECB (поскольку каждый блок открытого текста «смешивается» с блоком шифротекста, полученным на предыдущем шаге шифрования);
Недостатки режима CBC привели к созданию усовершенствованного режима распространяющегося сцепления блоков шифра (Propagating Cipher Block Chaining, РСВС)[4]. Естественно, этот режим похож на CBC за исключением того, что предыдущий блок открытого текста и предыдущий блок шифротекста подвергается операции XOR с текущим блоком открытого текста перед шифрованием или после него.[1] Соответственно расшифрование: где — вектор инициализации
Режим шифрования РСВС применяется в протоколе Kerberos 4 версии и позволяет обнаруживать ошибки. Данный режим шифрования не является федеральным или международным стандартом. Режим РСВС — вариант режима СВС, обладающий специфическим свойством — ошибка шифротекста приводит к неправильному дешифрированию всех последующих блоков. Это соответственно означает, что проверка стандартного блока в конце сообщения обеспечивает целостность всего сообщения.
Шифрование в режиме PCBC
Конечно, этот режим не лишён недостатков, так перестановка двух блоков шифротекста приводит к неправильной расшифровке двух соответствующих блоков открытого текста, но из-за XOR над открытым текстом и шифротекстом дальнейшие ошибки компенсируются. Поэтому, если при проверке целостности проверяются только несколько последних блоков расшифрованного текста, можно получить частично испорченное сообщение. Хотя никто ещё не воспользовался этой уязвимостью в Kerberos, но в 5 версии уже перешли на режим CBC.
Криптостойкость CFB определяется криптостойкостью используемого шифра. Блоки открытого текста «смешиваются» («маскируются») с блоками шифротекста. Если в режиме CFB с полноблочной обратной связью имеется два идентичных блока шифротекста, результат, например, шифрования алгоритмом DES на следующем шаге будет тем же. Скорость шифрования режима CFB с полноблочной обратной связью та же, что и у блочного шифра, причём возможности распараллеливания процедуры шифрования ограничены[1].
Режим (OFB)[4] обратной связи вывода превращает блочный шифр в синхронный шифр потока: он генерирует ключевые блоки, которые являются результатом сложения с блоками открытого текста, чтобы получить зашифрованный текст. Так же, как с другими шифрами потока, зеркальное отражение в зашифрованном тексте производит зеркально отражённый бит в открытом тексте в том же самом местоположении. Это свойство позволяет многим кодам с исправлением ошибок функционировать как обычно, даже когда исправление ошибок применено перед кодированием.
Из-за симметрии операции сложения, шифрование и расшифрование похожи:
Шифрование в режиме OFB
Расшифрование в режиме OFB
Каждая операция блочного шифра обратной связи вывода зависит от всех предыдущих и поэтому
не может быть выполнена параллельно. Однако, из-за того, что открытый текст или
зашифрованный текст используются только для конечного сложения, операции блочного
шифра могут быть выполнены заранее, позволяя выполнить заключительное шифрование
параллельно с открытым текстом.
Обратная связь по выходу на k разрядов не рекомендуется из соображений криптостойкости. Режим OFB имеет следующее преимущество по сравнению с режимом CFB: ошибки, возникающие в результате передачи по каналу с шумом, при дешифровании не «размазываются» по всему шифротексту, а локализуются в пределах одного блока. Однако открытый текст может быть изменён путём определённых манипуляций с блоками шифротекста. Несмотря на то, что OFB-шифрование не поддаётся распараллеливанию, эффективность процедуры может быть повышена за счёт предварительной генерации независимой последовательности блоков.[1]
OFB также предполагает некое усовершенствование, касающееся метода генерации независимой последовательности блоков: для получения очередного блока предлагается шифровать не с , а c , где некоторый вектор инициализации.
Режим счётчика (counter mode, CTR)[4] предполагает возврат на вход соответствующего алгоритма блочного шифрования значения некоторого счётчика, накопленного с момента старта. Режим делает из блочного шифра потоковый, то есть генерирует последовательность, к которой применяется операция XOR с текстом сообщения. Исходный текст и блок зашифрованного текста имеют один и тот же размер блока, как и основной шифр (например, DES или AES).[5] Режим CTR предусматривает следующие операции.
Шифрование в режиме CTR
Расшифровка в режиме CTR
— значение счётчика для i-го блока.
Очевидно, что значения счётчика должны быть уникальными для каждого блока открытого текста, кодируемого данным шифром при данном ключе (в противном случае блоки шифротекста, зашифрованные с помощью идентичных значений счётчика, оказываются под угрозой). Это требование удовлетворяется в два этапа.
Во-первых, значения счётчика для шифрования блоков в пределах одного сообщения получаются из начального значения счётчика использованием функции приращения. Чтобы обеспечивать случайность, величина приращения может зависеть от номера блока. Стандартная функция приращения может быть применена как ко всему блоку счётчика, так и к его части. Пусть значение счётчика представляет блок из b битов, а функцию приращения мы применяем к m младшим разрядам.
— функция конкатенации; — младшие битов; — старшие битов. Уникальность значений счётчика обеспечивается для всех блоков сообщения при условии, что . Где — количество блоков, на которое разбивается сообщение.
Во-вторых, начальные значения счётчика для каждого сообщения выбираются таким образом, чтобы обеспечить уникальность всех используемых значений счётчика. Этого можно достичь разными способами. Например, если сообщения шифруются последовательно, то в качестве начального значения счётчика для данного сообщения можно использовать результат применения функции приращения к последнему значению счётчика предыдущего сообщения. При этом если функция приращения использует m битов, общее количество блоков открытого текста не должно превышать . Другой подход предлагает разбить двоичное представление счётчика на две части. Старшие разряды назначаются одноразовым номером сообщения, а к оставшимся будет применяться функция приращения[6].
При отсутствии обратной связи алгоритмы шифрования и расшифровки в режиме CTR могут выполняться параллельно. Более того, большие объёмы вычислений, связанные с шифрованием значений счётчика, могут быть выполнены заранее, до того, как открытый текст или шифротекст окажутся доступными. Это обеспечивает режиму CTR преимущество перед режимами CFB и OFB.
Режим Random Delta используется для устранения предсказуемости изменения счётчика в режиме CTR. К примеру, это AES, и размер блока 16 байт. Берётся случайный Initialization Vector (например, с помощью RdRand). Его младшие 8 байт считаются случайной дельтой — Random Delta (RD):
Initialization Vector для Random Delta
Initial (Initialization Vector) шифруется и передаётся в начале сообщения. Блок 0 перед шифрованием XOR-ится с Initial. Для каждого последующего блока величина Initial увеличивается на Delta (в беззнаковом целочисленном представлении — uint128 += uint64):
Режим сцепления «Random Delta»
Таким образом устраняется предсказуемость изменения счётчика в режиме CTR. Если там дельта — всегда единица, здесь дельта — случайное число, одно из 2^64. Злоумышленнику оно, как и Initial, неизвестно.
Также, CTR настораживает непосредственным соседством открытого текста с шифротекстом через XOR. В Random Delta между открытым текстом и шифротекстом лежит AES.
Открытость передачи Initial также вызывает вопросы. Чем меньше атакующий видит — тем лучше. Чем более открытый текст отдалён от шифротекста — тем лучше. Все известные режимы — ECB, CBC, OFB, CTR — обладают какими-то из этих недостатков. В Random Delta всё лежит за AES'ом, а Initial и Delta — случайные величины, которые злоумышленнику неизвестны.
Впрочем, один из недостатков CTR в RD присутствует. Знание формата передаваемых данных позволяет вбрасывать в определённые места этих данных случайные искажения, что может быть использовано для атаки. Для проверки целостности в блочную последовательность может быть добавлен хэш:
Random Delta + Hash
Похоже, что Random Delta + Hash указанных недостатков лишён. Передано в общественное достояние.
Важный момент: между закрытым текстом и открытым должно лежать множество пермутаций AES'а, иное ослабляет глубину шифрования. Закрытый текст как функция от открытого посредством одной лишь XOR сводит на нет глубину шифрования, которую даёт AES (а именно такой способ используют режимы OFB, CFB, CTR).
Криптостойкость Random Delta не намного ниже криптостойкости самого AES'а.
Если требуется более высокая степень случайности дельты (например, 128-битная), она может генерироваться отдельно и передаваться в начале сообщения вместе с Initial.
Как и CTR, Random Delta позволяет осуществлять шифрование/дешифрование блоков параллельно, с большей производительностью, не дожидаясь шифрования/дешифрования предыдущего блока (что является необходимостью в CBC, PCBC, CFB, OFB).
Режим "Random Delta 128" отличается использованием отдельных 128-битных Initial и Delta. Даёт бОльшую случайность тени.
В криптографии вектор инициализации () представляет собой некоторое число, как правило, оно должно быть случайным или псевдослучайным. Случайность имеет решающее значение для достижения семантической безопасности, которая при повторном использовании схемы под тем же ключом не позволит злоумышленнику вывести отношения между сегментами зашифрованных сообщений. Для блочных шифров использование описывается режимами работы. Рандомизация требуется также для других примитивов, таких как универсальные хеш-функции и коды аутентификации сообщений на их основе.
В таких режимах шифрования, как CBC, CFB и OFB на вход подаётся вектор инициализации (). Причём как отправитель, так и получатель в начале сеанса связи должны иметь один и тот же . Значение вовсе не обязано быть секретным и вполне может быть передано вместе с первым блоком шифротекста. Что действительно важно, так это то, что в режимах CBC и CFB это значение должно быть непредсказуемым, а в режиме OFB — уникальным[2].
Непредсказуемости в режимах CBC и CFB можно достичь несколькими способами. Например, можно подвергнуть преобразованию той же функцией значение какого-либо счётчика (скажем, счётчика сообщений). Или использовать ГПК для генерации псевдослучайной последовательности нужной длины.
В режиме OFB вектор инициализации не обязан быть непредсказуемым, зато он должен быть уникален для всех сеансов связи, в которых в OFB используется один и тот же секретный ключ шифрования . Этого можно достичь, опять же используя счётчик сообщений. Если же не следовать этому требованию, то секретность сообщения в режиме OFB может быть легко скомпрометирована. Одним из следствий этого требования является то, что очередной вектор инициализации для режима OFB нельзя генерировать путём применения функции с тем же ключом .
Режимы ECB, CBC и PCBC работают с сообщениями открытого текста, длина которых должна быть кратна длине одного блока. Если это свойство не выполняется, то к сообщению необходимо добавить необходимое количество битов, называемых дополнением (англ.padding). Например, «padding method 2» ISO/IEC 9797-1 предлагает добавлять в конец сообщения единичный бит, а оставшиеся заполнять нулями[7].
При данном методе получатель шифротекста должен точно знать, что в сообщении содержится дополнение. Это можно обеспечить, прикрепляя дополнение к каждому сообщению, даже если оно не требуется (в этом случае его посылают отдельным блоком). Это не единственное решение — можно, к примеру, посылать с каждым сообщением информацию о его длине[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. Для шифрования файлов лучше пользоваться CBC: значительно увеличивается безопасность, при появлении ошибок в хранимых данных почти никогда не бывает сбоев синхронизации. Конкретный режим зависит от ваших требований. В целом выбор метода шифрования - это поиск компромисса между эффективностью и производительностью[8].