Rijndael (byte State, byte CipherKey)
{
KeyExpansion (CipherKey, ExpandedKey);
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 (byteState, byteExpandedKey)
{
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, с) - циклический сдвиг вправо на один байт.д.ля приложений с ограниченной памятью этот вариант чрезвычайно удобен, немного увеличится лишь время вычислений, необходимое для выполнения трех сдвигов.
При расшифровании алгоритмом 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 (wordState, wordRoundKey)
{
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 (byteCipherKey, wordInvEpandedKey)
{
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 с.
Задание: провести шифрование и расшифрование текстов с помощью криптосистемы PGP.
PGP (Pretty Good Privacy) - это криптографическая (шифровальная) программа с высокой степенью надежности, которая позволяет пользователям обмениваться информацией в электронном виде в режиме полной конфиденциальности.
Главное преимущество этой программы состоит в том, что для обмена зашифрованными сообщениями пользователям нет необходимости передавать друг другу тайные ключи, т.к эта программа построена на новом принципе работы - публичной криптографии или обмене открытыми (публичными) ключами, где пользователи могут открыто посылать друг другу свои публичные ключи с помощью сети "Интернет" и при этом не беспокоиться о возможности несанкционированного доступа каких-либо третьих лиц к их конфиденциальным сообщениям.
В PGP применяется принцип использования двух взаимосвязанных ключей: открытого и закрытого. К закрытому ключу имеете доступ только вы, а свой открытый ключ вы распространяете среди своих корреспондентов.
Еще одно преимущество этой программы состоит также в том, что она бесплатная и любой пользователь, имеющий доступ к Интернету, может ее закачать на свой компьютер в течение получаса. PGP шифрует сообщение таким образом, что никто кроме получателя сообщения, не может ее расшифровать. Создатель PGP Филипп Циммерман открыто опубликовал код программы, который неоднократно был исследован специалистами крипто-аналитиками высочайшего класса и ни один из них не нашел в программе каких-либо слабых мест.
Филипп Циммерман следующим образом объясняет причину создания программы: "Людям необходима конфиденциальность. PGP распространяется как огонь в прериях, раздуваемый людьми, которые беспокоятся о своей конфиденциальности в этот информационный век. Сегодня организации по охране прав человека используют программу PGP для защиты своих людей за рубежом. Организация Amnesty International также использует ее". Пользователям сети Интернет рекомендуется использовать эту программу именно по той же причине, почему люди предпочитают посылать друг другу письма в конвертах, а не на открытках, которые могут быть легко прочитаны почтовыми служащими. Дело в том, что электронные сообщения, в том виде и формате, который существует на сегодняшний день, легко могут быть прочитаны и архивированы любым человеком, имеющим доступ к серверу Интернет провайдера (поставщика услуг сети Интернет). В настоящий момент спецслужбам проще и дешевле подключиться к электронным адресам большого количества лиц, нежели к телефонным разговорам. Здесь вообще ничего делать не надо. Все сделает компьютер. Агенту спецслужбы или другому заинтересованному человеку остается только сесть за компьютер и просмотреть все ваши сообщения. Научно-технический прогресс облегчил задачу таким людям, однако, этот же самый прогресс предоставил возможность пользователям сети Интернет скрыть свои сообщения от третьих лиц таким образом, что даже суперкомпьютер стоимостью несколько десятков миллионов долларов не способен их расшифровать.
Когда пользователь шифрует сообщение с помощью PGP, то программа сначала сжимает текст, что сокращает время на отправку сообщения через модем и увеличивает надежность шифрования. Большинство приемов криптоанализа (взлома зашифрованных сообщений) основаны на исследовании рисунков, присущих текстовым файлам, что помогает взломать ключ. Сжатие ликвидирует эти рисунки и таким образом повышает надежность зашифрованного сообщения. Затем PGP генерирует сессионный ключ, который представляет собой случайное число, созданное за счет движений вашей мышки и нажатий на клавиши клавиатуры.