Содержание статьи
-
Описание алгоритма шифрования TEA
-
Реализация TEA
-
Устраняем критические ошибки TEA и получаем XTEA (Block TEA)
-
Реализация XTEA
-
Еще лучше: XXTEA (Corrected Block TEA)
-
Криптоанализ алгоритмов шифрования
Введение
Рассмотрим некоторые определения, используемые в статье. Существуют два типа шифрования: симметричные и несимметричные.
В симметричных алгоритмах шифрования один и тот же ключ используется и для шифрования данных, и для их расшифровки. Этот ключ должны знать знать только отправитель и получатель, иначе данные в руках злоумышленников по сути не являются зашифрованными. Человек, зная ключ, который не должен знать, может расшифровать шифротекст и узнать, что вы попросили друга купить в магазине макароны.
В несимметричных алгоритмах шифрования уже используется не один ключ, а целых два: открытый и закрытый. Шифруются данные открытым ключом, расшифровываются только закрытым. Открытый ключ можно раздать всем желающим, а закрытый ключ требуется держать в тайне.
TEA, XTEA, XXTEA являются блочными алгоритмами шифрования. Это вид симметричного шифрования, который оперирует группами бит, фиксированной длины, которые называются блоками.
В данной статье рассматриваются блочные симметричные алгоритмы шифрования, которые в качестве фундамента используют сеть Фейстеля, как и большинство современных блочных шифров.
Ознакомиться с сетью Фейстеля подробнее можете в данной статье.
TEA
TEA a.k.a. Tiny Encryption Algorithm — блочный симметричный алгоритм шифрования. Достаточно скромный и не требуют большой памяти, быстр в выполнении и прост в реализации, благодаря чему нашел широкое применение в криптографии.
Перейдем к самому алгоритму. Данные делятся на блоки по 64 бит, а ключ на четыре части по 32 бита: . Если данные в битовом представлении не делятся на 64, то дополняем ее нулевыми битами. Далее происходит шифрование: целый 32 цикла по 2 раунда. Раунд — это один шаг цикла. То есть множество циклов еще разбивается на части. Для математического описания алгоритма введем операции:
— чиселка, которая нужна для противостояния простым атакам. Можно было взять любую константу, автор шифра решил воспользоваться золотым сечением
— побитовый сдвиг числа X на Y бит влево (вправо аналогично)
— побитовое исключающее ИЛИ — XOR
— сложение чисел по модулю
На n-ом раунде на вход поступает блок, состоящий из двух частей: правой и левой, выходит тоже блок из двух частей
по правилам:
Просто перебрасываем:
Четный раунд:
Нечетный:
Заметим, что меняется только используемый ключ. Для наглядности приведем блок схема алгоритма:

Реализация TEA
Приведем код, в котором реализован TEA на языке программирования С. Авторами данного кода являются создатели самого шифра: David J. Wheeler и Roger M. Needham. Первоисточник — их статья.
-
k[0], k[1], k[2], k[3] — ключ, разбитый на четыре части
-
v[0], v[1] — данные, которые хотим зашифровать
-
encode — (true), когда хотим зашифровать данные, (false), когда хотим расшифровать
void tea(long* v, long* k, bool encode) { unsigned long y = v[0]; unsigned long z = v[1]; unsigned long sum = 0; unsigned long delta = 0x9e3779b9; unsigned long n = 32; if(encode) { // encoding while(n-- > 0) { sum += delta; y += ((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1]); z += ((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3]); } } else { // decoding sum = delta << 5; while(n-- > 0) { z -= ((y << 4) + k[2]) ^ (y + sum) ^ ((y >> 5) + k[3]); y -= ((z << 4) + k[0]) ^ (z + sum) ^ ((z >> 5) + k[1]); sum -= delta; } } v[0] = y; v[1] = z; return; }
XTEA
В TEA со временем нашли серьезные уязвимости, что натолкнуло на его улучшение, что в последствии привело к созданию нового алгоритма XTEA.
XTEA a.k.a. eXtended TEA — алгоритм шифрования, в котором устранены критические ошибки TEA. Предоставлен теми же David J. Wheeler и Roger M. Needham. Как и TEA, оперирует блоками по 64 бита. Единственная разница в том, что в TEA ключ в каждом цикле выбирался одинаково, не было никакого разнообразия. В XTEA эту предсказуемость шифра убрали. Теперь выбор одного из четырех частей ключа выполняется с использованием золотого сечения (в конце математических операций просто берется остаток от деления на 4).
Перейдем к математике. На n-ом раунде снова на ход поступают данные, разделенные пополам:
, выходят
по правилам:
Снова просто перебрасываем:
Четный раунд:
Нечетный:
Блок схема:

Реализация XTEA
Снова приведем код, в котором создатели шифра David J. Wheeler и Roger M. Needham реализовали свой алгоритм на языке программирования С. То, как выглядит оригинальный код (он фактически ничем не отличается), можете посмотреть в их публикации.
-
v — исходные данные из 2 частей
-
k — ключ из 4 частей
-
N — число циклов (создатель шифра рекомендует 32)
-
long — 32 бита
void xtea(long* v, long* k, long N) { unsigned long y = v[0]; unsigned long z = v[1]; unsigned long delta = 0x9e3779b9; if(N > 0) { // encoding unsigned long limit = delta * N; unsigned long sum = 0; while(sum != limit) { y += (z << 4 ^ z >> 5) + z ^ sum + k[sum & 3]; sum += delta; z += (y << 4 ^ y >> 5) + y ^ sum + k[sum >> 11 & 3]; } } else { // decoding unsigned long sum = delta * (-N); while (sum) { z -= (y << 4 ^ y >> 5) + y ^ sum + k[sum >> 11 & 3]; sum -= delta; y -= (z << 4 ^ z >> 5) + z ^ sum + k[sum & 3]; } } v[0] = y; v[1] = z; return; }
Обнаруженные у XTEA уязвимости привели к ряду улучшений: XTEA-1, XTEA-2, XTEA-3. Однако они не получили столь широкого применения на практике. Данные алгоритмы в статье рассматриваться не будут.
XXTEA
XXTEA a.k.a. Corrected Block TEA (т.к. XTEA называют еще Block TEA) — как понятно из названия, улучшенная версия XTEA. Авторами, снова являются David J. Wheeler и Roger M. Needham, которые просто улучшили свой старый алгоритм. Они утверждают, что для простоты использования и общей безопасности предпочтительнее использовать версию с большими блоками, если это применимо, по следующим причинам:
-
Изменение одного бита изменит примерно половину битов всего блока, не оставив следа
-
Даже если используется правильное использование постоянного изменения отправляемых данных (возможно, по номеру сообщения), только идентичные сообщения дают одинаковый результат, а утечка информации минимальна
-
Номер сообщения всегда следует проверять, поскольку эта избыточность является проверкой случайного принимаемого сообщения
-
Атака «человек посередине», судя по всему, невозможна
-
Если недопустимо иметь очень длинные сообщения, их можно разбить на блоки, скажем по 60 слов, и связать их аналогично методам, используемым для DES
Как уже описывалось выше, в XXTEA данные шифруются примерно таким же образом. Снова делим данные на блоки, которые еще поделим пополам, ключ, как и в предыдущих случаях, разбивается на четыре части. За один раунд зашифровывается одно слово из блока. Рассмотрим шифрование одного слова на n-ом раунде:
Пусть слово состоит из правого и левого частей. Константа
такая же, как во все прошлые разы. Выберем сначала ключ (один из четырех):
. Рассчитаем два параметра:
Тогда зашифрованное слово получится:
Приведем блок-схему:

Реализация XXTEA
Приведем код, предложенный самими авторами алгоритма шифрования — David J. Wheeler и Roger M. Needham. Подробнее в их статье.
-
v — слово из 2 частей
-
k — ключ из 4 частей
-
N — число циклов
-
long — 32 бита
#define MX (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z) long xxtea(long* v, long * k, long N) { unsigned long z = v[N - 1]; unsigned long y = v[0]; unsigned long sum = 0; unsigned long e = 0; unsigned long delta = 0x9e3779b9; long m = 0; long p = 0; long q = 0; if(N > 1) { // encoding q = 6 + 52 / N; while(q-- > 0) { sum += delta; e = sum >> 2 & 3; for(p = 0; p < N - 1; p++) { y = v[p + 1]; z = v[p] += MX; } y = v[0]; z = v[N - 1] += MX; } return 0; } else if(N < -1) { // decoding N = -N; q = 6 + 52 / N; sum = q * delta; while(sum != 0) { e = sum >> 2 & 3; for(p = N - 1; p > 0; p--) { z = v[p - 1]; y = v[p] -= MX; } z = v[N - 1]; y = v[0] -= MX; } return 0; } return 1; }
Анализ TEA, XTEA, XXTEA
TEA не особо подвержен атакам дифференциального криптоанализа. Для 17 раундов получается сложность по времени порядка . Однако при «атаке на связанных ключах» TEA уязвим, так как ключи распределены внутри цикла статически (всегда один и тот же выбор). Еще возникает проблема с эквивалентными ключами: на каждый ключ есть три эквивалентных, которые зашифровывают и расшифровывают данные таким же образом.
XTEA, как ни странно, является более защищенным, чем TEA. Но из-за особенностей реализации (присутствие XOR) XTEA хуже справляется с дифференциальными и усеченными дифференциальными атаками, чем TEA. Лучший способ расправиться с XTEA шифрованием — дифференциальная атака на связанных ключах.
XXTEA уже неплох. E. Yarrkov в 2010 году реализует атаку на основе подобранного открытого текста против всего цикла XXTEA с широким блоком. Работа основана на дифференциальном криптоанализе. Чтобы зашифровать 212 байт и более, алгоритм выполняет всего 6 раундов, а тщательно подобранные битовые комбинации позволяют обнаруживать и анализировать лавинный эффект. Но E. Yarrkov говорит, что добавление двух дополнительных раундов устраняет эту проблему.
Основные источники
-
Roger M. Needham and David J. Wheeler: TEA, a Tiny Encryption Algorithm
-
А. Roger M. Needham and David J. Wheeler: TEA extensions
-
David J. Wheeler, Roger M. Needham: Correction to XTEA
-
Elias Yarrkov: Cryptoanalysis of XXTEA
ссылка на оригинал статьи https://habr.com/ru/post/534474/
Добавить комментарий