Анимация
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

Этот полином является взаимно простым с х +1 и поэтому умножение обратимо. В матричной форме данное преобразование можно представить как

02 01 01 03

03 02 01 01

01 03 02 01

01 01 03 02

аз

Обратное преобразование представляет собой умножение на полином, мультипликативно обратный к с{х) по модулю х"* +1:

ф) = OBhx + ODhx + 09hx + OEh.

AddRoundKey

Добавление ьслюча итерации осуществляется простым побитовым сложением по модулю 2 каждого байта массива состояния с соответствующим байтом массива ключа Это преобразование является обратным самому себе.

Алгоритм обработки ключа.

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

Общее число бит ключей итерации равно длине блока, умноженной на количество итераций плюс один. (Например, для блока 128 бит и 10 итераций потребуется 1408 бит ключей итерации). Ключ шифрования расширяется до расширенного ключа. Ключи итерации берутся из расширенного ключа следующим образом: первый ключ итерации состоит из первых Nb слов, второй - из следующих Nb слов и т.д. Алгоритм расширения ключа

Расширенный ключ представляет собой линейный массив 4-байтовых слов и обозначается как W[Nb * (Nr +1)]. Функция расширения ключа зависит от Nk. Существует две версии - для Nk < 6 и для Nk > 6. KeyExpansion(byte Key[4*Nk], word W[Nb*(Nr+l)]) { for(i = 0;i<Nk; i++)

W[i] = (Key[4*i],Key[4*i+l],Key[4*i+2],Key[4*i+3]);

for(i = Nk; i < Nb * (Nr + 1); i++) { temp = W[i- 1]; if(i%Nk - 0)

temp = SubByte(RotByte(temp)) Rcon[i / Nk]; W[i] = W[i-Nk]temp;

Здесь SubByte(W) - функция, возвращающая слово, в котором каждый байт является результатом применения блока замены шифра к байту, находящемуся на соответствующей позиции во входном слове. Функция RotByte(W) - циклический сдвиг байтов в слове, так что входное слово (а, Ь, с, d) преобразуется в слово (Ь, с, d, а).

Для Nk > 6 алгоритм выглядит так: KeyExpansion(byte Key[4*Nk] word W[Nb*(Nr+l)]) { for(i = 0; i < Nk; i++)

W[i] = (key[4*i],key[4*i+l],key[4*i+2],key[4*i+3]); for(i = Nk; i < Nb * (Nr + 1); i++) { temp = W[i - 1]; if(i%Nk - 0)

temp = SubByte(RotByte(temp)) Rcon[i / Nk]; elseif(i%Nk - 4)

temp = SubByte(temp); W[i] = W[i-Nk]temp;

Константы итерации Rcon не зависят от Nk и определяются как

Rcon[/] = (RC[/], 00, 00, 00),

где RC[/] являются представлениями элементов поля GF{2) со значениями х ~ \ т.е. RC[1] = 1 (т.е. 01), и RC[/] = х (т.е. 02)RC[/-1].

Выбор ключа итерации

Ключ итерации с номером / задается словами из буфера расширенного ключа, начиная с W[Nb * /] и до W[Nb *(/+!)].

Итак, процесс шифрования состоит из трех этапов: начального добавления подключа; Nr -1 итераций;



конечной итерации. На псевдокоде это выглядит следующим образом: Rijndael(State,CipherKey) {

KeyExpansion(CipherKey,ExpandedKey);

AddRoundKey(State,ExpandedKey);

For( i=l ; i<Nr ; i++ ) Round(State,ExpandedKey + Nb*i);

FinalRound(State,ExpandedKey + Nb*Nr);

2.4.3. Алгоритм RC6

В качестве одного из кандидатов фирмой RSA Data Security, Inc. был представлен алгоритм RC6 прошедший второй тур отбора. В нем предусматривается использование четырех рабочих регистров, а также введена операция целочисленного умножения, позволяющая существенно увеличить возмущения, вносимые каждым циклом шифрования, что приводит к увеличению стойкости и/или возможности сократить число циклов.

RC6 является полностью параметризованным алгоритмом шифрования. Конкретная версия RC6 обозначается как RC6-wlrlb, где м> обозначает длину слова в битах, г - ненулевое количество итерационных циклов шифрования, &Ь - длину ключа в байтах. Во всех вариантах КСв-м>1г1Ъ работает с четырьмя м>-битовыми словами, используя шесть базовых операций, обозначаемых следующим образом:

а + Ъ-целочисленное сложение по модулю2*;

а-Ъ- целочисленное вычитание по модулю 2*;

а®Ь-побитовое "исключающее ИЛИ" н-битовыхслов;

ахЬ-целочисленное умножение по модулю2*;

а « b - циклический сдвиг н-битового слова влево на величину, заданную log2H младшими битами Ь;

а» b - циклический сдвиг н-битового слова вправо на величину, заданную logiw младшими битами Ь;

Шифрование при помощи RC6-w/r/b описывается следующим образом:

Вход: Исходный текст, записанный в 4 н-битовых входны

регистрах В, С, D; Число циклов шифрования г; Ключевая таблицаS{; ... 2г + 3] н-битовых слов.

Выход: Шифрованный текст в регистрах В, С, D.

Процедура: ВВ + 8Щ D=D+Sm for / = 1 to г do {

/ = (5х(25+ l))«log2W M = (Z)x(2Z)+ l))«log2W A = {{A® t) « u) + S[2i] C = iiC®u)«t) + S[2i+\] {A; B; C; D) = (B; C; D; A)

A=A+S[2r + 2] C=C + S[2r + 3] Расшифрование в этих обозначениях выглядит очень похоже:

Вход: Шифрованный текст, записанный в 4 н-битовых вхо;

ных регистрах В, С, D; Число циклов шифрования г; Ключевая таблица «[О; ... 2г + 3] н-битовых слов.

Выход: Исходный текст в регистрах В, С, D.

Процедура: CC-S[2r + 3] AA-S[2r + 2] for / = г downto 1 do {

(A; В; С; D) = (D; A; B; C) u = iDx{2D+\))«log2W t = iBx{2B+\))«log2W C = iiC-S[2i+\])»t)@u A = iiA-S[2i])»u)@t

D = D-S[\] BB-S[0]

Алгоритм вычисления ьслючей для RC6-w/r/b выглядит следующим образом:

Пользователь задает ключ длиной b байтов. Достаточное число ненулевых байтов дописываются в конец, чтобы получилось целое число слов. Затем эти байты записываются начиная с младшего в массив из с слов, т.е. первый байт ключа записывается в L[0], и т.д., а L[c - 1] при необходимости дополняется со



стороны старших разрядов нулевыми байтами. В результате работы алгоритма генерации ьслючей будет вычислено 2г + 4 слов, которые будут записаны в массиве S[0; ...; 2г + 3].

Константы Рз2 = B7E15163h and Q32 = 9E3779B9h - это константы, получаемые из двоичного представления е -2, где е -основание натуральных логарифмов, и ф - \, где ф - золотое сечение, соответственно. Подобные же константы могут быть аналогичным образом получены и для RC6 с другим размером слова. Выбор констант является в некотором роде произвольным, и поэтому можно использовать и другие константы, получая при этом "частные" версии алгоритма.

Вход: Определенный пользователем й-байтовый ключ, пре;

варительно загруженный в массив Z[0;.. .с - 1]; Число циклов шифрования г.

Выход: Ключевая таблицаS[0;...2г +4] из н-битовых слов.

Процедура: 8Щ = Р„

for / = 1 to 2г + 3 do

A = B = i=j = f)

V = 3 X max{c, 2r + 4}

for s = 1 to V do {

A = S{i\ = {S{i\+A + B)«3

В = L[f\ = {L[j] +A+B)«{A+B)

/ = l)mod (2r + 4)

j = (j+ l)modc

Структура шифра RC6 является обобш,ением сети Фейстела. Блок текста разбивается не на 2, а на 4 подблока, и на каждой итерации изменяются 2 подблока из четырех. При этом в конце итерации шифрования производится циклический сдвиг подблоков влево (при расшифровании, соответственно, вправо). Однако, такое обобш,ение привело к тому, что было утеряно свойство инвариантности блоков шифрования и расшифрования, хотя это и не является определяюш,им в оценке данного алгоритма.

2.4.4. Российский стандарт шифрования ГОСТ 28147-89

В Российской Федерации установлен единый стандарт криптографического преобразования текста для информационных систем. Он носит обязательный характер для государственных органов, организаций, предприятий, банковских и иных учреждений, чья деятельность связана с обеспечением информационной безопасности государства. Для других организация и частных лиц, ГОСТ имеет рекомендательный характер.

Данный стандарт формировался с учетом мирового опыта и, в частности, были приняты во внимание недостатки и нереализованные возможности алгоритма DES, поэтому использование стандарта ГОСТ предпочтительнее. Алгоритм шифрования построен с использованием сети Фейстела.

32...

32...

К ЗУ

хо(ко)

Xi(Ki)

х2(к2)

хз(кз)

Х4(К4)

Х5(К5)

хб(кб)

Х7(К7)

... 1

32...

... 1

32...

... 1

32...

... 1

СМ 2

Рис 2.4. Алгоритм шифрования ГОСТ 28147-89. Режим простой замены.

Введем ассоциативную операцию конкатенации, используя для нее мультипликативную запись. Кроме того будем использовать следуюш,ие операции сложения:

А © В - побитовое сложение по модулю 2;

А [+] В - сложение по модулю 2



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