Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

длиной слова 16 бит. Этап инициализации будет значительно медленнее, необходим цикл до 65535, если мы хотим в точности следовать конструкции, но получившийся в результате алгоритм будет более быстрым.

Алгоритм SEAL

SEAL (Software Encryption ALgorithm) представляет собой приспособленный для программной реализации потоковый шифр, разработанный Филом Рогэвэем и Доном Копперсмитом из компании IBM. Алгоритм оптимизирован для 32-разрядных процессоров. Для эффективной работы ему требуются 8 32-разрядных регистров и кэш объемом несколько килобайт.

Одним из замечательных свойств этого шифра является то, что он не является потоковым шифром в традиционном смысле, а представляет собой семейство псевдослучайных функций. 160-битовый ключ к и 32-битовое значение п (индекс) шифр преобразует в Z-битовую строку к{п). L может принимать любое значение, меньшее 64 килобайт. Такой шифр мы будем обозначать SEAL(A:, п, L). Предполагается, что если к выбирается случайно, то к(п) будет вычислительно неотличима от случайной L-битовой функции от п.

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

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

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

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

Алгоритм SEAL предусматривает использование трех зави-сяш,их от ключа таблиц: R, S, и Т. Эти таблицы заполняются на предварительном этапе при помош,и алгоритма, основанного на SHA (см. 4.3.1), и зависят только от ключа.

Заполнение таблиц можно описать с помош,ью функции Ga(/), которая представляет собой функцию сжатия из алгоритма SHA. а - 160-битное значение, / - 32-битный индекс. Значение а используется для инициализации внутренних регистров А, В, С, D, и Е в алгоритме SHA, а 512-битный блок для обработки представляет собой строку /ЦО"*". Выходное значение функции G также имеет длину 512 бит.

Построим теперь функцию Г с выходным значением длиной

32 бита, переиндексировав функцию G: /"„(/) = -jj, где для j

= L 5J Яо1я/ЧЯГ1ЯГЧЯГ=С.(7). Теперь определим:

71/] =/;(/), О </< 512, S\j] = /;(0х1000 + У), О <у < 256, R[k] = /;(0х2000 +к),0<к< 256. Собственно алгоритм генерации ключевой последовательности может быть описан на псевдокоде следуюш,им образом: function SEAL(a; п; L) у = 0;

for / = О to оо do

Initialize(«; /; А; В; С; D; п\, Uj, щ; щ); for / = 1 to 64 do

P=A8i 0x7fc; B = B + Т[Р1Ц ,A=A »> 9;B = B@A; Q = B8Lf)xlfc;C = C®J\QIA\,B = B»>9;C=C + B; P = {P + C)& 0x7fc; D = D + 7IP/4]; С = C»> 9; D = D

Q{Q + D)& 0x7fc; AA® TlQ/4]; D=D»>9; A=A+D; P = {P + A)8l 0x7fc; B = B® T[PIA\, A=A»> 9; e = (e + S)&0x7fc;c = c+7ie/4];S = S»>9; P = (P + О & 0x7fc; D = D® 7IP/4]; C=C»> 9; Q = {Q + D)& 0x7fc; A=A + T[Q/4]; D = D»> 9;



9 уу\\В + S[4i - 4] II С + S[4i -3]\\D + S[4i -2]\\A + S[4i

-1];

10 if y > L then return (yoyi ...yi-i);

11 if odd{i) then {A; B; C; D) {A +щ; В + П2, С @ щ; D @ Пг)

else {A; В; С; D) = {A + щ; В + щ; С ® щ; D ® щ);

end; end;

end.

Алгоритм использует подпрограмму инициализации, которая, используя таблицы R и Т, устанавливает начальные значения внутренних переменных и регистров.

procedure Initialize(«; /; А; В; С; D; щ; Uj, щ; «4) А = п@ R[4l]; B = in»>S)@R[4l+ 1]; C = («»>16)ei?[4/ + 2]; Z) = («»>24)ei?[4/ + 3]; for у = 1 to 2 do

PA& 0x7fc; BB + T[P/4]; A=A»> 9; P = 5&0x7fc;C = C+7IP/4];5 = 5»>9; P = С & 0x7fc; Z) = Z) + 7IP/4]; С = 0» 9; P = D& 0x7fc; A=A + T[PI4\, D = D»> 9; end;

{пиП2, пг,щ) = ф; В; A; С); P = A& 0x7fc; B = B + 7IP/4]; A=A»> 9; P = P&0x7fc;C = C+7IP/4];P = P»>9; P = С & 0x7fc; P» = P» + 7IP/4]; С = 0» 9; P = P» & 0x7fc; AA + T[P/4]; D = D»> 9; end.

Таблица T представляет собой блок замены размерностью 9 X 32. На каждом шаге 9 бит одного регистра (А, В, С или D) используются как указатель в таблице Т. Значение, извлеченное из Т, складывается (арифметически или порязрядно по модулю 2) со следуюш,им регистром (вновь А, В, С или D). Затем первый регистр циклически сдвигается на 9 позиций. На некоторых шагах второй регистр дополнительно модифицируется путем сложения по модулю 2 со сдвинутым первым регистром. После 8 шагов каждый регистр маскируется сложением по модулю 2 с

некоторым значением из и выдается в ключевую последовательность. Итерация завершается сложением регистров А и С с зависимыми от п значениями щ, Пг, щ, «4- Какое конкретно значение выбирается, зависит от четности номера итерации. Таким образом, основные идеи, лежаш,ие в основе этого алгоритма, можно сформулировать следуюш,им образом:

1. Использование большого секретного зависяш,его от ключа блока замены Т;

2. Перемежение операций, не коммутируюш,их друг с другом (сложение и исключаюш,ее ИЛИ);

3. Использование внутреннего состояния, явно не про-являюш,егося в потоке данных (значения используемые в конце итерации для модификации регистров А и С);

4. Изменение шаговой функции в зависимости от номера шага и изменение итерационной функции в зависимости от номера итерации.

5. Использование известных и отработанных алгоритмов для заполнения таблиц.

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

Алгоритм WAKE

Алгоритм WAKE (от англ. Word Auto Key Encryption - шифрование слов с автоключом) был предложен Дэвидом Уилером. На выходе мы получаем последовательность 32-битовых слов, которые могут служить в качестве гаммы шифра WAKE работает в режиме СРВ - предыдуш,ее слово шифрованного текста используется для генерации следуюш,его слова ключевой последовательности.

В алгоритме используется специальный блок замены S из 256 32-битных слов. При этом старшие байты этих слов являются перестановкой чисел от О до 255, а остальные три младших байта выбираются случайными. Работа алгоритма описывается следуюш,им образом:



Вначале инициализируется блок замены на основе ключа Затем инициализируются четыре регистра А, В, С и D начальными значениями, также зависящими от ключа (возможно другого): ао, Ьа, Со, й?о- Очередное слово ключевой последовательности получается по формуле:

k = d.

После этого изменяется значение регистров:

а/+1 = М(а„ J,), Ъм = M{bi, a/+i), c,+i = М(с„ Z),+i), й?,+1 = M{di, c,+i),

Mix, у) = (x +>;)» 8 © S(x+;,)& 255,

здесь 8 младших бит суммы х+у используются для входа в таблицу замены.

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

3. АСИММЕТРИЧНЫЕ КРИНТОСИСТЕМЫ

3.1. Общие положения

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

Исходное Отправитель Зашифр. Получатель сообщение (А) сообщение (В) (X) , , Y=Ek,(X)

Шифратор

Открытыйк ключ (Kl)

Дешифратор кх= Dk.(Ek,(X))

Закрытый ключ (Кг)

Рис 3.1. Схема асимметричной криптосистемы.

Криптосистема с открытым ключом определяется тремя алгоритмами: генерации ключей, шифрования и расшифрования. Алгоритм генерации ключей открыт, всякий может подать ему на вход случайную строку г надлежащей длины и получить пару ключей {к\, кг). Один из ключей (например, к\) публикуется, он называется открытым, а второй, называемый секретным, хранится в тайне. Алгоритмы шифрования Е] и расшифрова-



0 1 2 3 4 5 6 7 8 [ 9 ] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24