SEAL (криптографический алгоритм)

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Другие значения

Схема алгоритма SEAL

SEAL (Шаблон:Lang-en, программно-оптимизированный алгоритм шифрования) — симметричный поточный алгоритм шифрования данных, оптимизированный для программной реализации.

Разработан в IBM Шаблон:Iw (Шаблон:Lang-en) и Доном Копперсмитом (Шаблон:Lang-en) в 1993 году. Алгоритм оптимизирован и рекомендован для 32-битных процессоров. Для работы ему требуется кэш-память на несколько килобайт и восемь 32-битовых регистров. Скорость шифрования — примерно 4 машинных такта на байт текста. Для кодирования и декодирования используется 160-битный ключ. Чтобы избежать нежелательной потери скорости по причине медленных операций обработки ключа, SEAL предварительно выполняет с ним несколько преобразований, получая в результате три таблицы определённого размера. Непосредственно для шифрования и расшифрования текста вместо самого ключа используются эти таблицы.

Алгоритм считается очень надёжным, очень быстрым[1] и защищён патентом США № 5454039[2] с декабря 1993 года.

Шаблон:-

История

В 1991 году Ральф Меркл (Шаблон:Lang-en) описал рентабельность программно-ориентированных шифров. По его мнению, наиболее эффективными из них были Khufu, FEAL и RC4. Однако постоянно увеличивающиеся потребности клиентов в надежной криптографии требовали поиска новых и доработки старых решений.

Летом 1992 года началась разработка первой версии нового программно-оптимизированного алгоритма SEAL 1.0. Разработчики взяли основные идеи и принцип работы из блочного шифра Ральфа Меркла (Шаблон:Lang-en) Khufu, который показался им самым совершенным на тот момент. Они решили добиться лучших характеристик проекта (в основном скорости), сузив круг аппаратуры, на которой возможна его реализация. Выбор был сделан в пользу 32-битных машин минимум с восемью регистрами общего назначения и кэшем не менее 8 Кбайт. В марте 1993 года было принято решение создать блочный шифр, но структура из семейства псевдослучайных функций, разработанная к октябрю того же года, работала быстрее, что склонило разработчиков в к поточному шифрованию.

Эта структура состояла из четырёх регистров, каждый из которых изменял своего «соседа» в зависимости от таблицы, полученной из ключа. После некоторого количества таких модификаций значения регистров добавляются в ключевую последовательность, которая растет с каждой итерацией до тех пор, пока не достигнет определённой длины.

При разработке почти все внимание уделялось внутреннему циклу алгоритма, так как процедура инициализации регистров и метод генерации таблиц из ключа оказывали незначительное влияние на его защищенность. В окончательном виде проект SEAL 1.0 появился только в декабре 1993 года.

В 1996 году Хелен Хандшух и Шаблон:Не переведено описали атаки на упрощенную версию SEAL 1.0 и на сам SEAL 1.0. Им потребовалось 230 текстов, каждый длиной в четыре 32-битных слова, чтобы найти зависимость псевдослучайной функции от ключа. В результате, в следующих версиях алгоритма SEAL 3.0 и SEAL 2.0 были сделаны некоторые доработки и изменения. Например, в версии 1.0 каждая итерация с ключевой последовательностью завершалась модификацией только двух регистров, а в версии 3.0 — модифицировались все четыре. Ещё SEAL 3.0 и SEAL 2.0 использовали для генерации таблиц алгоритм SHA-1 (Шаблон:Lang-en) вместо первоначального SHA, что сделало их более устойчивыми к криптоанализу.

Описание

При описании алгоритма используются следующие операции и обозначения:

Создание таблиц шифрования из ключа

Чтобы избежать потери скорости шифрования на медленных операциях алгоритм использует три таблицы: R, S и T. Эти таблицы вычисляются с помощью процедуры из алгоритма SHA-1 и зависят только от ключа. Заполнение данных таблиц можно описать с помощью функции G, которая из 160-битной строки a и 32-битного числа i возвращает 160-битное значение Ga(i).

Введем следующие функции и переменные в зависимости от индекса t:

  • для 0t19 установим Kt=0x5a827999 и ft(B,C,D)=(B&C)(B¯&D);
  • для 20t39 установим Kt=0x6ed9eba1 и ft(B,C,D)=BCD;
  • для 40t59 установим Kt=0x8f1bbcdc и ft(B,C,D)=(B&C)(B&D)(C&D);
  • для 60t79 установим Kt=0xca62c1d6 и ft(B,C,D)=BCD.

Затем 160-битная строка a разбивается на пять 32-битных слов так, что a=H0H1H2H3H4.

Также создается шестнадцать 32-битных слов W0=i,W1=W2=...=W15=032.

Затем выполняются финальные вычисления:

  1. Fort=16to79doWt=(Wt3Wt8Wt14Wt16)1;
  2. A=H0;B=H1;C=H2;D=H3;E=H4;
  3. Fort=0to79do
    TEMP=A5+ft(B,C,D)+E+Wt+Kt;
    E=D;D=C;C=B30;B=A;A=TEMP;
  4. H0=H0+A;H1=H1+B;H2=H2+C;H3=H3+D;H4=H4+E;
  5. Ga(i)=H0H1H2H3H4.

Введем функцию Γa(i)=Himod5i где H05jH15j+1H25j+2H35j+3H45j+4=Ga(j) для j=𝒷i/5𝒸.

Тогда таблицы:

T[i]=Γa(i),0i<512;

S[j]=Γa(0x1000+j),0j<256;

R[k]=Γa(0x2000+k),0k<256.

Далее ключ a в алгоритме не используется.

Инициализация служебных регистров

Перед генерацией псевдослучайной функции нужно подготовить четыре 32-битовых служебных регистра (A, B, C и D) и четыре 32-битовых слова (n1, n2, n3 и n4). Их значения определяются из таблиц R и T, 32-битового числа n и некоторого числа l в следующей процедуре.

procedureInitialize(n,l,A,B,C,D,n1,n2,n3,n4)

AnR[4l];
B(n8)R[4l+1];
C(n16)R[4l+2];
D(n24)R[4l+3];

forj1to2do

PA&0x7fc;BB+T[P/4];AA9;
PB&0x7fc;CC+T[P/4];BB9;
PC&0x7fc;DD+T[P/4];CC9;
PD&0x7fc;AA+T[P/4];DD9;

(n1,n2,n3,n4)(D,B,A,C);

PA&0x7fc;BB+T[P/4];AA9;
PB&0x7fc;CC+T[P/4];BB9;
PC&0x7fc;DD+T[P/4];CC9;
PD&0x7fc;AA+T[P/4];DD9;

Создание псевдослучайной функции

Для шифрования текста необходимо создать псевдослучайную функцию.

functionSEAL(a,n,L)

y=0L;

forl0todo

      Initialize(n,l,A,B,C,D,n1,n2,n3,n4);

      fori1to64do

            PA&0x7fc;BB+T[P/4];AA9;BBA;

            QB&0x7fc;CCT[Q/4];BB9;CC+B;

            P(P+C)&0x7fc;DD+T[P/4];CC9;DDC;

            Q(Q+D)&0x7fc;AAT[Q/4];DD9;AA+D;

            P(P+A)&0x7fc;BBT[P/4];AA9;

            Q(Q+B)&0x7fc;CC+T[Q/4];BB9;

            P(P+C)&0x7fc;DDT[P/4];CC9;

            Q(Q+D)&0x7fc;AA+T[Q/4];DD9;

            yyB+S[4i4]CS[4i3]D+S[4i2]AS[4i1];

            if|y|Lthenreturny0y1...yL1;

            ifodd(i)then(A,B,C,D)(A+n1,B+n2,Cn1,Dn2);

                                else(A,B,C,D)(A+n3,B+n4,Cn3,Dn4);

Процесс шифрования состоит из большого числа итераций, каждая из которых завершается генерацией псевдослучайной функции. Количество пройденных итераций показывает счетчик l. Все они подразделяются на несколько этапов с похожими операциями. На каждом этапе старшие 9 битов одного из регистров (A, B, C или D) используются в качестве указателя, по которому из таблицы T выбирается значение. Это значение складывается арифметически или поразрядно по модулю 2 (XOR) со следующим регистром (снова один из A, B, C или D). Затем первый выбранный регистр преобразуется циклическим сдвигом вправо на 9 позиций. Далее либо значение второго регистра модифицируется сложением или XORом с содержимым первого (уже сдвинутым) и выполняется переход к следующему этапу, либо этот переход выполняется сразу. После 8 таких этапов значения A, B, C и D складываются (арифметически или XORом) с определёнными словами из таблицы S и добавляются в ключевую последовательность y. Завершающий этап итерации заключается в прибавлении к регистрам дополнительных 32-битных значений (n1, n2 или n3, n4). Причем выбор конкретного значения зависит от четности номера данной итерации.

Свойства и практическое применение

При разработке этого алгоритма главное внимание отводилось следующим свойствам и идеям:

  • использование большой (примерно 2 Kбайта) таблицы T, получаемой из большого 160-битного ключа;
  • чередование арифметических операций (сложение и побитовый XOR);
  • использование внутреннего состояния системы, которое явно не проявляется в потоке данных (значения n1, n2, n3 и n4, которые изменяют регистры в конце каждой итерации);
  • использование отличных друг от друга операций в зависимости от этапа итерации и её номера.

Для шифрования и расшифрования каждого байта текста шифр SEAL требует около четырёх машинных тактов. Он работает со скоростью примерно 58 Мбит/с на 32-битном процессоре с тактовой частотой 50 МГц и является одним из самых быстрых шифров.

Примечания

Шаблон:Примечания

Источники

Ссылки

Шаблон:Симметричные криптоалгоритмы

  1. Шаблон:Статья
  2. Шаблон:US patent «Software-efficient pseudorandom function and the use thereof for encryption»