TEA: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 22: Строка 22:
Достоинствами шифра являются его простота в реализации, небольшой размер кода и довольно высокая скорость выполнения, а также возможность оптимизации выполнения на стандартных 32-битных процессорах, так как в качестве основных операций используются операции [[Сложение по модулю 2|исключающего «ИЛИ» (XOR)]], [[битовый сдвиг|побитового сдвига]] и сложения по модулю 2<sup>32</sup>. Поскольку алгоритм не использует таблиц подстановки и раундовая функция довольно проста, алгоритму требуется не менее 16 циклов (32 раундов) для достижения эффективной диффузии, хотя полная диффузия достигается уже за 6 циклов (12 раундов).<ref name="teasite">[http://143.53.36.235:8080/tea.htm Страница шифра TEA]</ref>
Достоинствами шифра являются его простота в реализации, небольшой размер кода и довольно высокая скорость выполнения, а также возможность оптимизации выполнения на стандартных 32-битных процессорах, так как в качестве основных операций используются операции [[Сложение по модулю 2|исключающего «ИЛИ» (XOR)]], [[битовый сдвиг|побитового сдвига]] и сложения по модулю 2<sup>32</sup>. Поскольку алгоритм не использует таблиц подстановки и раундовая функция довольно проста, алгоритму требуется не менее 16 циклов (32 раундов) для достижения эффективной диффузии, хотя полная диффузия достигается уже за 6 циклов (12 раундов).<ref name="teasite">[http://143.53.36.235:8080/tea.htm Страница шифра TEA]</ref>


Алгоритм имеет отличную устойчивость к [[Линейный криптоанализ|линейному криптоанализу]] и довольно хорошую к [[Дифференциальный криптоанализ|дифференциальному криптоанализу]]. Главным недостатком этого алгоритма шифрования является его уязвимость к атакам по ключу (англ. Related-key attack). Из-за простого расписания ключей каждый ключ имеет 3 эквивалентных ключа. Это означает, что эффективная длина ключа составляет всего 126 бит, поэтому данный алгоритм не следует использовать в качестве [[Хеширование|хэш-функции]].
Алгоритм имеет отличную устойчивость к [[Линейный криптоанализ|линейному криптоанализу]] и довольно хорошую к [[Дифференциальный криптоанализ|дифференциальному криптоанализу]]. Главным недостатком этого алгоритма шифрования является его уязвимость к атакам по ключу (англ. Related-key attack). Из-за простого расписания ключей каждый ключ имеет 3 эквивалентных ключа. Это означает, что эффективная длина ключа составляет всего 126 бит<ref name="kelsey1996">{{cite journal |
first = John |
last = Kelsey |
coauthors = Schneier, Bruce; Wagner, David |
url = http://www.schneier.com/paper-key-schedule.pdf |
title = Key-schedule cryptanalysis of IDEA, G-DES, GOST, SAFER, and Triple-DES |
journal = Lecture Notes in Computer Science |
volume = 1109 |
pages = 237–251 | date = 1996 |
doi = 10.1007/3-540-68697-5_19}}</ref><ref name="cryptoanalisys">[http://cs.ua.edu/SecurityResearchGroup/VRAndem.pdf A cryptoanalisys of the tiny encryption algorithm]</ref>, поэтому данный алгоритм не следует использовать в качестве [[Хеширование|хэш-функции]].


==Описание алгоритма==
==Описание алгоритма==
Строка 41: Строка 50:
* X <math>\oplus</math> Y – побитовое [[Сложение по модулю 2|исключающее «ИЛИ» (XOR)]] чисел X и Y, которое в [[Си_(язык_программирования)|языке программирования Си]] обозначается как X ^ Y
* X <math>\oplus</math> Y – побитовое [[Сложение по модулю 2|исключающее «ИЛИ» (XOR)]] чисел X и Y, которое в [[Си_(язык_программирования)|языке программирования Си]] обозначается как X ^ Y
* X <math>\ll</math> Y и X <math>\gg</math> Y - операции [[битовый сдвиг|побитового сдвига]] числа X на Y бит влево и вправо соответственно.
* X <math>\ll</math> Y и X <math>\gg</math> Y - операции [[битовый сдвиг|побитового сдвига]] числа X на Y бит влево и вправо соответственно.
* Константа δ была выведена из [[Золотое сечение|Золотого сечения]] δ = 2654435769 = 9E3779B9<sub>h</sub>. В каждом раунде константа умножается на номер цикла i. Это было сделано для предотвращения простых атак, основанных на симметрии раундов.
* Константа δ была выведена из [[Золотое сечение|Золотого сечения]] δ = 2654435769 = 9E3779B9<sub>h</sub><ref name="tea">Roger M. Needham and David J. Wheeler. [http://www.cix.co.uk/~klockstone/tea.pdf TEA, a Tiny Encryption Algorithm]</ref>. В каждом раунде константа умножается на номер цикла i. Это было сделано для предотвращения простых атак, основанных на симметрии раундов.


Также очевидно, что в алгоритме шифрования TEA нет как такового алгоритма расписания ключей. Вместо этого в нечётных раундах используются подключи К[0] и К[1], в нечётных – К[2] и К[3].
Также очевидно, что в алгоритме шифрования TEA нет как такового алгоритма расписания ключей. Вместо этого в нечётных раундах используются подключи К[0] и К[1], в нечётных – К[2] и К[3].

Версия от 21:43, 5 ноября 2009

TEA
Создатель Дэвид Уилер и Роджер Нидхэм
Создан 1994 г.
Опубликован 1994 г.
Размер ключа 128 бит
Размер блока 64 бит
Число раундов 32
Тип Сеть Фейстеля

В криптографии,Tiny Encryption Algorithm (TEA) — блочный алгоритм шифрования типа «Сеть Фейстеля». Алгоритм был разработан на факультете компьютерных наук Кембриджского университета Дэвидом Уилером (David Wheeler) и Роджером Нидхэмом (Roger Needham) и впервые представлен в 1994 году[1] на симпозиуме по быстрым алгоритмам шифрования в Лёвене (Бельгия).[2]

Шифр не патентован, широко используется в ряде криптографических приложений и широком спектре аппаратного обеспечения благодаря крайне низким требованиям к памяти и простоте реализации. Алгоритм имеет как программную реализацию на разных языках программирования, так и аппаратную реализацию на интегральных схемах типа FPGA.

Свойства

Алгоритм шифрования TEA[2] основан на битовых операциях с 64-битным блоком, имеет 128-битный ключ шифрования. Стандартное количество раундов сети Фейстеля равно 64 (32 цикла), однако для достижения наилучшей производительности или шифрования, число циклов можно варьировать от 8 (16 раундов) до 64 (128 раундов). Сеть Фейстеля несимметрична из-за использования в качестве операции наложения сложения по модулю 32.

Достоинствами шифра являются его простота в реализации, небольшой размер кода и довольно высокая скорость выполнения, а также возможность оптимизации выполнения на стандартных 32-битных процессорах, так как в качестве основных операций используются операции исключающего «ИЛИ» (XOR), побитового сдвига и сложения по модулю 232. Поскольку алгоритм не использует таблиц подстановки и раундовая функция довольно проста, алгоритму требуется не менее 16 циклов (32 раундов) для достижения эффективной диффузии, хотя полная диффузия достигается уже за 6 циклов (12 раундов).[2]

Алгоритм имеет отличную устойчивость к линейному криптоанализу и довольно хорошую к дифференциальному криптоанализу. Главным недостатком этого алгоритма шифрования является его уязвимость к атакам по ключу (англ. Related-key attack). Из-за простого расписания ключей каждый ключ имеет 3 эквивалентных ключа. Это означает, что эффективная длина ключа составляет всего 126 бит[3][4], поэтому данный алгоритм не следует использовать в качестве хэш-функции.

Описание алгоритма

Исходный текст разбивается на блоки по 64 бита каждый. 128-битный ключ К делится на четыре 32-битных подключа K[0], K[1], K[2] и K[3]. На этом подготовительный процесс заканчивается, после чего каждый 64-битный блок шифруется на протяжении 32 циклов (64 раундов) по нижеприведённому алгоритму.

Предположим, что на вход n-го раунда (для 1 ≤ n ≤ 64) поступают правая и левая часть (Ln, Rn), тогда на выходе n-го раунда будут левая и правая части (Ln+1, Rn+1), которые вычисляются по следующим правилам:

Ln+1 = Rn.

Если n = 2 * i - 1 для 1 ≤ i ≤ 32 (нечётные раунды), то Rn+1 = Ln ( { [ Rn 4 ] K[0] } { Rn i * δ } { [ Rn 5 ] K[1] } )

Если n = 2 * i для 1 ≤ i ≤ 32 (чётные раунды), то Rn+1 = Ln ( { [ Rn 4 ] K[2] } { Rn i * δ } { [ Rn 5 ] K[3] } )

Где

  • X Y – операция сложения чисел X и Y по модулю 232.
  • X Y – побитовое исключающее «ИЛИ» (XOR) чисел X и Y, которое в языке программирования Си обозначается как X ^ Y
  • X Y и X Y - операции побитового сдвига числа X на Y бит влево и вправо соответственно.
  • Константа δ была выведена из Золотого сечения δ = 2654435769 = 9E3779B9h[1]. В каждом раунде константа умножается на номер цикла i. Это было сделано для предотвращения простых атак, основанных на симметрии раундов.

Также очевидно, что в алгоритме шифрования TEA нет как такового алгоритма расписания ключей. Вместо этого в нечётных раундах используются подключи К[0] и К[1], в нечётных – К[2] и К[3].

Ниже приведены примеры процедур шифрования и расшифрования на языке программирования Си.


Реализация

Реализация на языке программирования Си (адаптированный вариант кода, представленного в статье Дэвида Уилера и Роджера Нидхэма[1]) функций шифрования и расшифрования с использованием алгоритма TEA:

#include <stdint.h>

void encrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0, i;           /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i < 32; i++) {                       /* basic cycle start */
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}

void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;       /* set up */
    uint32_t delta=0x9e3779b9;                          /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];        /* cache key */
    for (i=0; i<32; i++) {                              /* basic cycle start */
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;                                   
    }                                                   /* end cycle */
    v[0]=v0; v[1]=v1;
}

Комментарии:

  • v — исходный текст состоящий из двух частей по 32 бита
  • k — ключ состоящий из четырёх 32-битных частей

Изменения по сравнению с оригинальным кодом:

  • используется тип uint32_t вследствие того, что он всегда имеет размер 32 бита в отличие от long (присутствующий в оригинальном коде), который может содержать 64 бита (например в некоторых 64 битных системах)
  • исходный код не использует тип const
  • в исходном коде опущены избыточные скобки в выражениях для v0 и v1, в данной модификации они оставлены для большей наглядности

Варианты алгоритма

Выявление ряда серьезных уязвимостей и слабых мест в исходном алгоритме TEA привело к скорому созданию его расширения — XTEA, который затем был так же исправлен и получил название XXTEA. Существует так же альтернативная модификация алгоритма TEA, получившая наименование RTEA. С использованием механизмов генетического программирования был создан алгоритм Raiden, призванный устранить уязвимости шифра TEA. Существует так же шифр GTEA, частично основанный на принципах TEA, имеющий 128-битный блок и использующий таблицы подстановки. В то же время, авторы алгоритма TEA на своей официальной странице обращают внимание на то, что в реальных условиях практического использования алгоритм TEA все еще остается довольно надежным и все найденные уязвимости, как правило, не являются критичными, к примеру, при передаче данных в реальном времени.[2]

См. также

Примечания

  1. 1 2 3 Roger M. Needham and David J. Wheeler. TEA, a Tiny Encryption Algorithm
  2. 1 2 3 4 Страница шифра TEA
  3. Kelsey, John (1996). "Key-schedule cryptanalysis of IDEA, G-DES, GOST, SAFER, and Triple-DES" (PDF). Lecture Notes in Computer Science. 1109: 237—251. doi:10.1007/3-540-68697-5_19. {{cite journal}}: Неизвестный параметр |coauthors= игнорируется (|author= предлагается) (справка)
  4. A cryptoanalisys of the tiny encryption algorithm

Ссылки