Методы и средства защиты компьютерной информации
AddRoundKey (State, ExpandedKey);
for (i = 1; i < Nr; i++)
Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr);
}
Раундовый ключ можно заготовить и вне функции Rijndael, a вместо ключа пользователя CipherKey использовать развертку ключей ExpandedKey. Преимущества такого варианта очевидны, когда для зашифрования текста длиной более одного блока нужно
несколько раз вызывать функцию Rijndael с одним и тем же ключом пользователя.
Rijndael (byte State, byte ExpandedKey)
{
AddRoundKey (State, ExpandedKey);
for (i = 1; i < Nr; i++) Round (State, ExpandedKey + Nb*i);
FinalRound (State, ExpandedKey + Nb*Nr);
}
Для 32-разрядных процессоров раундовое преобразование лучше вычислять заранее и хранить результаты в виде таблиц. Заменяя операции перестановки и умножения на матрицу обращением к таблице, мы значительно сокращаем время работы как при зашифровании, так и (как будет видно позже) при расшифровании. С помощью таблиц вида
каждая из которых содержит по 256 четырехбайтовых слов (здесь w = 0, .,255; S (w) - S-блок подстановки), преобразование блока j = 0, ., Lb - 1, можно быстро выполнить как
,
где (см. ShiftRow) и - j-й столбец раундового ключа.
На последнем раунде преобразование MixColumn не выполняется, поэтому результат получается как
Конечно, можно воспользоваться таблицей из 256 четырехбайтовых слов, тогда
где r (a,b,c,d) = (d,a,b, с) - циклический сдвиг вправо на один байт.д.ля приложений с ограниченной памятью этот вариант чрезвычайно удобен, немного увеличится лишь время вычислений, необходимое для выполнения трех сдвигов.
2.7 РАСШИФРОВАНИЕ
При расшифровании алгоритмом Rijndael процесс зашифрования выполняется в обратном порядке с обратными преобразованиями. Вот эти обратные функции:
InvFinalRound (word State, word RoundKey)
{
AddRoundKey (State, RoundKey);
InvShiftRow (State);
InvByteSub (State);
}
InvRound (word State, word RoundKey)
{
AddRoundKey (State, RoundKey);
InvMixColumn (State);
InvShiftRow (State);
InvByteSub (State);
}
Полная процедура расшифрования выглядит следующим образом:
InvRijndael (byte State, byte CipherKey)
{
KeyExpansion (CipherKey, ExpandedKey);
InvFinalRound (State, ExpandedKey + Nb*Nr);
for (i = Nr - 1; i > 0; i--)
InvRound (State, ExpandedKey + Nb*i);
AddRoundKey (State, ExpandedKey);
}
Алгебраическая структура алгоритма Rijndael позволяет упорядочить преобразования зашифрования так, что и для них можно будет использовать таблицы. Заметим, что подстановка S и преобразование ShiftRow коммутируют, поэтому внутри одного раунда их можно поменять местами. Благодаря свойству гомоморфизма линейных преобразований, операции InvMixColumn и сложение с раундовым ключом можно тоже поменять местами. В пределах одного раунда это выглядит так:
InvFinalRound (word State, word RoundKey)
{
AddRoundKey (State, RoundKey);
InvByteSub (State);
InvShiftRow (State);
}
InvRound (word State, word RoundKey)
{
InvMixColumn (State);
AddRoundKey (State, InvMixColumn (RoundKey));
InvByteSub (State);
InvShiftRow (State);
}
Если порядок функций не менять, то их можно переопределить:
AddRoundKey (State, RoundKey);
InvRound (word State, word RoundKey)
{
InvByteSub (State);
InvShiftRow (State);
InvMixColumn (State);
AddRoundKey (State, InvMixColumn (RoundKey));
}
InvFinalRound (word State, word RoundKey)
{
InvByteSub (State);
InvShiftRow (State);
AddRoundKey (State, RoundKey);
}
Отсюда получаем структуру, аналогичную зашифрованию. Из соображений эффективности в процедуре lnvRound () отложим применение функции InvMixColumn к раундовому ключу до вычисления развертки, в которой первый и последний раундовые ключи из InvMixColumn оставим без изменений. "Обратные" раундовые ключи генерируются процедурой
InvKeyExpansion (byte CipherKey, word InvEpandedKey)
{
KeyExpansion (CipherKey, InvExpandedKey);
for (i = 1; i < Nr; i++)
InvMixColumn (InvExpandedKey + Nb*i);
}
Теперь полная процедура расшифрования выглядит так:
InvRijndael (byte State, byte CipherKey)
{
InvKeyExpansion (CipherKey, InvExpandedKey);
AddRoundKey (State, InvExpandedKey + Nb*Nr);
for (i = Nr-1; i>0; i--)
InvRound (State, InvExpandedKey + Nb*i);
InvFinalRound (State, InvExpandedKey);
}
По аналогии с зашифрованием можно и для расшифрования составить таблицы предвычислений. С помощью следующих преобразований:
(где w = 0, .,255; S-1 (w) - обратный S-блок подстановки) получаем результат обратного раундового преобразования блока j = 0, ., Lb - 1:
,
где и - j-й столбец "обратного" раундового ключа.
Здесь на последнем раунде тоже не выполняется преобразование MixColumn, и результатом последнего раунда будет
,
где j = 0,…,Lb -1.
Для экономии памяти для расшифрования также можно составить таблицу всего из 256 четырехбайтовых слов, в которой
,
где r (а,b,c,d) = (d,a,b, с) - циклический сдвиг вправо на один байт.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. М. Вельшенбах. Криптография на Си и С++ в действии. М.: ТРИУМФ, 2004.
2. М. Яхтсмен. Теория и практика информационной безопасности. Под редакцией Зегжды П.Д. 1996.
3. Методы и средства защиты компьютерной информации. Методические указания к лабораторным работам для студентов специальности 220100 - Вычислительные машины, комплексы, системы и сети и направления 552800 - Информатика и вычислительная техника Сост.С. С. Соколов.
4. Екатеринбург: ГОУ ВПО УГТУ-УПИ, 2005.33 с.
РАБОТА 4. КРИПТОСИСТЕМА PGP
Задание: провести шифрование и расшифрование текстов с помощью криптосистемы PGP.
1. ХАРАКТЕРИСТИКА PGP
PGP (Pretty Good Privacy) - это криптографическая (шифровальная) программа с высокой степенью надежности, которая позволяет пользователям обмениваться информацией в электронном виде в режиме полной конфиденциальности.
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности