Андрей Смирнов
Время чтения: ~25 мин.
Просмотров: 1

Криптография в java

Архиваторы

Любой файл, сжатый для уменьшения объема и уменьшения степени влияния на жесткий диск пользователя, был, скорее всего, обработан программой, использующей AES-шифрование. Это особенно актуально для архивов таких программ, как WinZip, 7 Zip и RAR.

Инструменты шифрования дисков/разделов

Если вы разбираетесь в криптографии и стремитесь к тому, чтобы максимально эффективно защитить ваши личные данные, то наверняка используете программы для шифрования дисков или разделов, которые используют алгоритм AES. Программы вроде BitLocker, FileVault и CipherShed используют AES, чтобы обеспечить и защитить приватность ваших данных.

Вспомогательный код

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

Взглянем на листинг. Там как раз описаны две наши вспомогательные функции и один макрос.

// Для шифрования
void cycles(volatile unsigned __int64 *rtn)
{
#if defined(_MSC_VER)
__asm // считываем Pentium Time Stamp Counter
{ cpuid
rdtsc
mov ecx,rtn
mov ,eax
mov ,edx
cpuid
}
#else
#include <time.h>
time_t tt;
tt = time(NULL);
((unsigned long*)rtn) = tt;
((unsigned long*)rtn) = tt & -36969l;
return;
#endif
}
#define RAND(a,b) (((a = 36969 * (a & 65535) + (a >> 16)) << 16) + \
(b = 18000 * (b & 65535) + (b >> 16)))

void FillRand(char *buf, const int len)
{
static unsigned long a, mt = 1, count = 4;
static char r;
int i;

if(mt) { mt = 0; cycles((unsigned __int64 *)a); }

for(i = 0; i < len; ++i)
{
if(count == 4)
{
*(unsigned long*)r = RAND(a, a);
count = 0;
}

buf = r;
}
}

Все это хозяйство служит для заполнения массива псевдослучайных чисел. Непосредственно же заполнением занимается эта функция:

Как ее использовать, ты узнаешь чуть позже. Макрос RAND(a,b) вычисляет псевдослучайное число, а функция cycles считывает число из таймера процессора. Все это войдет в cpp-файл с реализацией класса. Также нам надо включить еще три заголовочных файла:

Здесь, caes.h описывает наш класс; aes.h – один из тех файлов, что мы нашли в интернете; stdio.h — говорить стыдно, все и так должны знать, что это стандартный ввод/вывод в
C.

Usage

Default Key Length

AES can use 16, 24, or 32 byte keys (128, 192, and 256 bits respectively). The default key length in Crypto++ is 16 bytes and specified by AES::DEFAULT_KEYLENGTH.

Instance of block cipher

When using AES (or any other block cipher) you typically you use a mode that «has a» instance of a block cipher. For example, for CFB mode you would write:

CFB_Mode<AES>::Encryption encryptor;

CFB_Mode takes the block cipher as a template parameter. Below is some pseudo code describing it:

template < class CIPHER >
class CFB_Mode
{
public:
    ...
private:
    CIPHER m_cipher;
};

Reference to block cipher

You can also create a mode object that holds a reference to an external block cipher object rather than an instance of it. Below is an example of using CFP mode with an external AES object:

AES::Encryption aesEncryption(key, AES::DEFAULT_KEYLENGTH);
CFB_Mode_ExternalCipher::Encryption cfbEncryption(aesEncryption, iv);

The ExternalCipher modes were added to support FIPS on Windows, and you should avoid it unless it is needed.

ECB and CBC mode remarks

For ECB and CBC mode, you must process data in multiples of the block size. Alternatively, you can wrap StreamTransformationFilter around the mode object and use it as a filter object. The StreamTransformationFilter will buffer data into blocks and pad as required.

If you are processing full block sizes and don’t want padding then use the NO_PADDING option for StreamTransformationFilter:

StringSource(data, true, new StreamTransformationFilter(encryptor, new StringSink(result), NO_PADDING))

Криптостойкость

В июне 2003 года Агентство национальной безопасности США постановило, что шифр AES является достаточно надёжным, чтобы использовать его для защиты сведений, составляющих государственную тайну (англ. classified information). Вплоть до уровня SECRET было разрешено использовать ключи длиной 128 бит, для уровня TOP SECRET требовались ключи длиной 192 и 256 бит.

XSL-атака

Основная статья: XSL-атака

В отличие от большинства других шифров, AES имеет простое математическое описание. Это беспокоило в том числе и Нильса Фергюсона, который в своей работе отметил, что безопасность шифра основывается на новом непроверенном предположении о сложности решения определённых видов уравнений (англ. «The security of Rijndael depends on a new and untested hardness assumption: it is computationally infeasible to solve equations of this type»), а также Брюса Шнайера, который написал в совместной с Нильсом книге:

Николя Куртуа (англ. Nicolas Courtois) и Йозеф Пепшик (англ. Josef Pieprzyk) в 2002 году опубликовали статью, в которой описали теоретическую атаку, названную ими XSL-атакой (англ. eXtended Sparse Linearization), которая могла бы позволить вскрыть шифры AES и Serpent. Тем не менее, результаты работы не всеми были восприняты оптимистично:

На странице, посвящённой обсуждению конкурса NESSIE, в конце 2002 года один из авторов шифра, Винсент Рэймен, заявил, что XSL-атака является всего лишь мечтой (англ. The XSL attack is not an attack. It is a dream) (данная точка зрения позже была повторена в 2004 году на 4-й конференции AES в Бонне). На это Куртуа ответил, что данная мечта может стать для автора AES кошмаром (англ. It may also be a very bad dream and turn into a nightmare) (игра слов: dream переводится и как мечта и как сновидение. Nightmare переводится как кошмарный сон, ночной кошмар).

В 2003 году Шон Мёрфи и Мэтт Робшоу (англ. Matt Robshaw) опубликовали работу, в которой (в предположении ,что результаты Куртуа и Пепшика верны) обосновали возможность атаки на алгоритм AES, сокращающей количество операций для взлома с 2128 до 2100. Однако на 4-й конференции AES Илья Толи (англ. Ilia Toli) и Альберто Дзанони (англ. Alberto Zanoni) показали, что работа Мёрфи и Робшоу неверна. Позже, в 2007 году, Чу-Ви Лим (англ. Chu-Wee Lim) и Хунгминг Ху (англ. Khoongming Khoo) также показали, что данная атака не может работать в том виде, как она была описана.

Атака по сторонним каналам

Основная статья: Атака по сторонним каналам

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

В апреле 2005 года Дэниел Бернштейн (англ.)русск. (Daniel J. Bernstein) опубликовал работу с описанием атаки, использующей для взлома информацию о времени выполнения каждой операции шифрования. Данная атака потребовала более 200 миллионов выбранных шифротекстов для нахождения ключа.

В октябре 2005 года Даг Арне Освик, Ади Шамир и Эран Трумер представили работу с описанием нескольких атак, использующих время выполнения операций для нахождения ключа. Одна из представленных атак получала ключ после 800 операций шифрования. Атака требовала от криптоаналитика возможности запускать программы на той же системе, где выполнялось шифрование.

В декабре 2009 года была опубликована работа, в которой использование дифференциального анализа ошибок (англ. Differential Fault Analysis), искусственно создаваемых в матрице состояния на 8-м раунде шифрования, позволило восстановить ключ за 232 операций.

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

Алгоритм обработки ключа состоит из двух процедур:

  • Алгоритм генерации раундовых ключей (алгоритм расширения ключа)
  • Алгоритм выбора раундового ключа (ключа итерации)

Алгоритм генерации раундовых ключей

Алгоритм AES, используя процедуру KeyExpansion() и подавая в неё Cipher Key, K, получает ключи для всех раундов. Всего получается Nb*(Nr + 1) слов: изначально для алгоритма требуется набор из Nb слов, и каждому из Nr раундов требуется Nb ключевых набора данных. Полученный массив ключей для раундов обозначается как wi{\displaystyle w\left}, ≤i<Nb∗(Nr+1){\displaystyle 0\leq i<Nb*(Nr+1)}. Алгоритм KeyExpansion() показан в псевдокоде ниже.

Функция SubWord() берёт четырёхбайтовое входное слово и применяет S-box к каждому из четырёх байтов. То, что получилось, подаётся на выход. На вход RotWord() подаётся слово a,a1,a2,a3{\displaystyle }, которое она циклически переставляет и возвращает a1,a2,a3,a{\displaystyle }. Массив слов, постоянный для данного раунда, Rconi{\displaystyle Rcon\left}, содержит значения xi−1,00,00,00{\displaystyle }, где x = {02}, а xi−1{\displaystyle x^{i-1}} является степенью x{\displaystyle x} в GF(28){\displaystyle GF\left(2^{8}\right)} (i{\displaystyle i} начинается с 1).

Из рисунка можно видеть, что первые Nk{\displaystyle Nk} слов расширенного ключа заполнены Cipher Key. В каждое последующее слово, wi{\displaystyle w}, кладётся значение, полученное при операции XOR wi−1{\displaystyle w} и wi−Nk{\displaystyle w\left}, те XOR’а предыдущего и на Nk позиций раньше слов. Для слов, позиция которых кратна Nk, перед XOR’ом к w применяется трансформация, за которой следует XOR с константой раунда Rcon. Указанная выше трансформация состоит из циклического сдвига байтов в слове (RotWord()), за которой следует процедура SubWord() — то же самое, что и SubBytes(), только входные и выходные данные будут размером в слово.

Важно заметить, что процедура KeyExpansion() для 256-битного Cipher Key немного отличается от тех, которые применяются для 128- и 192- битных шифроключей. Если Nk=8{\displaystyle Nk=8} и i−4{\displaystyle i-4} кратно Nk{\displaystyle Nk}, то SubWord() применяется к wi−1{\displaystyle w} до XOR’а.

Алгоритм выбора раундового ключа

На каждой итерации i{\displaystyle i} раундовый ключ для операции AddRoundKey выбирается из массива wi{\displaystyle w\left},начиная с элемента wNb∗i{\displaystyle w\left} до wNb∗(i+1){\displaystyle w\left}.

Шифрование файла

Настало время заняться функцией шифрования. Прототип ее выглядит так:

Содержимое из файла inFileName будет шифроваться ключом secretKey и записываться в файл outFileName. Код этой функции частично представлен в листинге.

int CAes::encryptFile(std::string inFileName, std::string outFileName, std::string secretKey)
{
gen_tabs();

unsigned long i = 0;
int by = 0, key_len, err = 0;
const char* cKey = secretKey.c_str();
char ch,key;

const char* cp = &cKey; // указатель на символ в key

i = 0; // счетчик обработанных цифр

while(i < 64 && *cp) // максимальная длина ключа — 32 байта и,
{ // следовательно, максимум 64 шестнадцатеричные цифры
ch = toupper(*cp++);
if(ch >= ‘0’ && ch <= ‘9’)
by = (by << 4) + ch — ‘0’;
else if(ch >= ‘A’ && ch <= ‘F’)
by = (by << 4) + ch — ‘A’ + 10;
else // ошибка, если символ не шестнадцатеричная цифра
return -2;

// запоминаем байт ключа для каждой пары шестнадцатеричных цифр
if(i++ & 1)
key[i / 2 — 1] = by & 0xff;
}

if(*cp)
return -3;
else
if(i < 32 || (i & 15))
return -4;

key_len = i / 2;

int encrypted = 0;

FILE* inFile = fopen(inFileName.c_str(), «rb»);
if (!inFile)
return -5;

FILE* outFile = fopen(outFileName.c_str(), «wb»);

if (!outFile)
return -5;

aes_encrypt_ctx ctx;

aes_encrypt_key((unsigned char*)key, key_len, ctx);

/* далее идет непосредственно алгоритм шифрования; в этом листинге он опускается по причине громоздкости; полную версию функции можно увидеть на диске, прилагаемом к журналу, в файле caes.cpp */

// закрываем файлы, чтобы сохранить информацию в них
fclose(inFile);
fclose(outFile);
return 0;
}

Весь код, к сожалению, мы привести не можем, поскольку он занял бы значительный объем статьи; полностью ты найдешь его только на нашем диске. 

Здесь первым делом мы объявляем и инициализируем несколько переменных. Затем в цикле проверяем корректность введенного ключа, а поскольку передается он в функцию в виде строки, то должен содержать лишь цифры от 0 до 9 и латинские буквы от A до F. Кроме этого, дополнительно мы проверяем длину ключа. После этого открываем входной и выходной файлы и проводим предварительную инициализацию нужных нам структур. Далее в листинге должен идти код шифрования, но, как мы уже говорили, он опущен. Вот и все, главное — после шифрации не забыть корректно закрыть файлы, чтобы сохранить все изменения.

AES vs. DES: новая эра шифрования

Стандарт Data Encryption Standard, он же просто DES, был предшественником AES. В начале 70-х годов прошлого века компания IBM разработала стандарт DES, он был передан в Национальное бюро стандартов США и стал использоваться в АНБ. DES был стандартным алгоритмом безопасности правительства США целых 20 лет, пока команда distributed.net не объединилась с представителями Electronic Frontier Foundation и не взломала шифрование DES менее чем за сутки.

Разработка AES началась в Национальном институте стандартов и технологий (NIST) сразу после того, как стало ясно, что DES уязвим перед брутфорс-атаками. Новый алгоритм был разработан с тем, чтобы его можно было без особых проблем использовать с аппаратными устройствами и программами, а также в ограниченных и закрытых средах. AES не был засекречен. Этот стандарт смог защитить правительственные данные от самых разных атак. AES как минимум в 6 раз быстрее, чем даже тройное DES-шифрование.

Major projects

Fluence

Launched during January 2018, Fluence is a joint venture between AES Energy Storage and Siemens that is focused on the development of, and expansion of energy storage technologies and services. Chaired by former AES vice-president for energy storage platforms Stephen Coughlin, and headquartered in Washington D.C., Fluence aims to implement AES’s extensive research into the potential of lithium-ion powered energy sources by relying upon Siemens’ expansive global presence in the industrial sector; for the purpose of addressing the rapidly rising demand for clean energy technologies. Fluence has been deployed in 16 countries, with major projects including the following:

  1. The creation of a new 40 megawatt storage facility on behalf of San Diego Gas & Electric’s new 40 MW storage facility.
  2. Three solar powered projects throughout Arizona and two 10 MW projects in the Dominican Republic.
  3. The installation of six storage projects across Germany that will provide grid stabilization.
  4. The construction of a hybrid microgrid on the Mediterranean Island of Ventotene. Said microgrid will be developed as per an agreement between Fluence and the Italian energy utility Enel, and will combine diesel generators with renewables in order to aid in the efforts to reduce carbon costs and emissions. The key technology platforms developed by Fluence include the following.

Key Fluence technologies

Fluence is expected to employ three different types of grid technology.

i):SIESTORAGE: An electrical energy storage system fueled predominantly by wind and solar energy. Siestorage relies upon the closed-loop controls and pulse modulation built into its semiconductors, in order to provide consumers with increased dependability.

ii):Advancion: A storage system that is made up of several small, modular nodes and powered by Lithium ion batteries, which enables the Advancion energy store system to provide consumers with a heightened degree of consistency in performance.

iii): Sunflux Energy: Announced in January 2018, Sunflex was developed for the purpose of expanding upon the possibilities offered by photovoltaic solar energy. This technology is built to capture energy during peak solar hours in order to expand energy delivery.

Projected ventures using Fluence technologies

Presently, the biggest project in Fluence’s portfolio is a 100–400 Mwh «power center energy storage project» for Southern California Edison. This system will be housed within AES’s power center in Los Alamitos, California.

During January 2018, the subsidiary AES India, working in partnership with Mitsubishi, commenced construction of a 10 MW energy storage solution that will be located in Rohini. This storage solution, which shall operate off Fluence’s Advancion technology, is projected to be the first utility-scale system to be in India.

sPower

Headquartered in Salt Lake City and acquired from Fir Tree Partners Inc in a purchase during 2017, as part of a joint acquisition with Alberta Investment Management Corporation. Spower is one of the largest operators and developers of utility-scale solar in the United States; operating across 11 states, and with particular focus on the states of California and North Carolina. Spower’s current operating portfolio includes 1.3 GW worth of solar and wind based properties, in addition to over 10,000 MW worth of projects that are in the developmental stage.

As part of an effort by AES to protect its employees from industry hazards and to improve workplace safety, the company announced a partnership with the nation’s leading drone provider, Measure, to inspect their various energy infrastructures sites across 17 countries.

Расширение ключа

AES использует ключи шифрования трех фиксированных размеров: 128, 192, и 256 бит. В зависимости от размера ключа, конкретный вариант алгоритма AES может обозначаться как AES-128, AES-192 и AES-256 соответственно .
Задача процедуры расширения ключа состоит в формировании нужного количество слов расширенного ключа для их использования в операции AddRoundKey. Как было сказано выше, под «словом» здесь понимается 4-байтный фрагмент расширенного ключа, один из которых используется в первичном наложении материала ключа и по одному – в каждом раунде алгоритма. Таким образом, в процессе расширения ключа формируется 4∗(R+1){\displaystyle 4*(R+1) \,\!} слов.
Расширение ключа выполняется в два этапа, на первом из которых производится инициализация слов расширенного ключа (обозначаемых как Wi{\displaystyle W_i \,\!}): первые Nk{\displaystyle N_k \,\!} (Nk{\displaystyle N_k \,\!} – размер исходного ключа шифрования K{\displaystyle K\,\!} в словах, т.е. 4, 6 или 8) слов Wi{\displaystyle W_i \,\!} (т.е. i=…Nk−1{\displaystyle i = 0 … N_{k-1} \,\!}) формируются их последовательным заполнением байтами ключа (см. рис. 7).


Рис. 7 Инициализация расширенного ключа

Последующие слова Wi{\displaystyle W_i \,\!} формируются следующей последовательностью операций для каждого i=Nk…4∗(R+1)−1{\displaystyle i = N_k … 4*(R+1)-1 \,\!}:Шаг 1. Инициализируется временная переменная T{\displaystyle T\,\!} :
T=Wi−1{\displaystyle T=W_{i-1} \,\!}.
Шаг 2. Данная переменная модифицируется следующим образом:a. если i{\displaystyle i\,\!} кратно Nk{\displaystyle N_k \,\!}, то:T=SubWord(RotWord(T))ÅRCëiNkû{\displaystyle T = SubWord(RotWord(T)) Å RCëi/Nkû \,\!};
константы RCn{\displaystyle RC_n \,\!} представляют собой слова, в которых все байты, кроме первого являются нулевыми, а первый байт имеет значение 2n−1mod256{\displaystyle 2^{n-1} mod 256 \,\!};
b. если Nk=8{\displaystyle N_k = 8 \,\!} и imodNk=4{\displaystyle i mod N_k = 4 \,\!}, то:
T=SubWord(T){\displaystyle T = SubWord(T) \,\!};
c. в остальных случаях модификация переменной T{\displaystyle T\,\!} не выполняется.
Шаг 3. Формируется i{\displaystyle i\,\!}-е слово расширенного ключа:
Wi=Wi−NkÅT{\displaystyle W_i = W_{i-N_k} Å T \,\!}.
Операция SubWord выполняет над каждым байтом входного значения табличную замену, которая была описана выше – см. операцию SubBytes.
Операция RotWord побайтно вращает входное слово на 1 байт влево.
Как видно, процедура расширения ключа является достаточно простой по сравнению со многими другими современными алгоритмами шифрования. Процедура расширения ключа имеет также несомненное достоинство в том, что расширение ключа может быть выполнено «на лету» (on-the-fly), т.е. параллельно с зашифрованием данных.

Шифрование

AES является стандартом, основанным на алгоритме Rijndael. Для AES длина input(блока входных данных) и State(состояния) постоянна и равна 128 бит, а длина шифроключа K составляет 128, 192, или 256 бит. При этом, исходный алгоритм Rijndael допускает длину ключа и размер блока от 128 до 256 бит с шагом в 32 бита. Для обозначения выбранных длин input, State и Cipher Key в байтах используется нотация Nb = 4 для input и State, Nk = 4, 6, 8 для Cipher Key соответственно для разных длин ключей.

В начале шифрования input копируется в массив State по правилу sr,c=inr+4c{\displaystyle s = in }, для ≤r<4{\displaystyle 0 \le r < 4 } и ≤c<Nb{\displaystyle 0 \le c < Nb }. После этого к State применяется процедура AddRoundKey() и затем State проходит через процедуру трансформации(раунд) 10, 12, или 14 раз(в зависимости от длины ключа), при этом надо учесть, что последний раунд несколько отличается от предыдущих. В итоге, после завершения последнего раунда трансформации, State копируется в output по правилу outr+4c=sr,c{\displaystyle out = s}, для ≤r<4{\displaystyle 0 \le r < 4 } и ≤c<Nb{\displaystyle 0 \le c < Nb }.

Отдельные трансформации SubBytes(), ShiftRows(), MixColumns(), и AddRoundKey() — обрабатывают State. Массив w[] — содержит key schedule.

SubBytes()

Процедура SubBytes() обрабатывает каждый байт состояния, независимо производя нелинейную замену байтов используя таблицу замен(S-box). Такая операция обеспечивает нелинейность алгоритма шифрования. Построение S-box состоит из двух шагов. Во-первых, производится взятие обратного числа в GF2 {\displaystyle GF_2\ }. Во-вторых, к каждому байту b из которых состоит S-box применяется следующая операция: bi′=bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕ci{\displaystyle b^{‘}_{i} = b_{i} \oplus b_{(i+4)mod8} \oplus b_{(i+5)mod8} \oplus b_{(i+6)mod8} \oplus b_{(i+7)mod8} \oplus c_{i} }, где ≤i<8{\displaystyle 0 \le i < 8}, и где bi есть i-ый бит b, а ci — i-ый бит c = {63} или {01100011}. Таким образом, обеспечивается защита от атак, основанных на простых алгебраических свойствах.

∥b′b1′b2′b3′b4′b5′b6′b7′∥=∥1111111111111111111111111111111111111111∥∗∥bb1b2b3b4b5b6b7∥+∥1111∥{\displaystyle

\begin{Vmatrix} b^{‘}_{0}\\b^{‘}_{1}\\b^{‘}_{2}\\b^{‘}_{3}\\b^{‘}_{4}\\b^{‘}_{5}\\b^{‘}_{6}\\b^{‘}_{7} \end{Vmatrix} =
\begin{Vmatrix} 1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1\\ 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1\\
1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0\\ 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0\\
0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \end{Vmatrix} *
\begin{Vmatrix} b_{0}\\b_{1}\\b_{2}\\b_{3}\\b_{4}\\b_{5}\\b_{6}\\b_{7} \end{Vmatrix} + \begin{Vmatrix} 1\\1\\0\\0\\0\\1\\1\\0 \end{Vmatrix}
}

ShiftRows()

ShiftRows работает со строками State. При этой трансформации строки состояния циклически сдвигаются на r байт по горизонтали, в зависимости от номера строки. Для нулевой строки r = 0, для первой строки r = 1Б и тд.. Таким образом каждая колонка выходного состояния после применения процедуры ShiftRows состоит из байтов из каждой колонки начального состояния. Для алгоритма Rijndael паттерн смещения строк для 128 и 192-ух битных строк одинаков. Однако для блока размером 256 бит отличается от предыдущих тем, что 2, 3, и 4-е строки смещаются на 1, 3, и 4 байта соответственно.

MixColumns()

В процедуре MixColumns, четыре байта каждой колонки State смешиваются используя для этого обратимую линейную трансформацию. MixColumns обрабатывает состояния по колонкам, трактуя каждую из них как полином четвертой степени. Над этими полиномами производится умножение в GF(28){\displaystyle GF(2^8)} по модулю x4+1{\displaystyle x^4+1} на фиксированный многочлен c(x)=3×3+x2+x+2{\displaystyle c(x) = 3x^3 + x^2 + x + 2}. Вместе с ShiftRows , MixColumns вносит диффузию в шифр

AddRoundKey()

В процедуре AddRoundKey, RoundKey каждого раунда объединяется со State. Для каждого раунда Roundkey получается из CipherKey используя процедуру KeyExpansion; каждый RoundKey такого же размера, что и State. Процедура производит побитовый XOR каждого байта State с каждым байтом RoundKey .

Downloads

AES-GCM-Test.zip — Demonstrates encryption and decryption using AES in GCM mode (confidentiality and authentication)

AES-CCM-Test.zip — Demonstrates encryption and decryption using AES in CCM mode (confidentiality and authentication)

AES-EAX-Test.zip — Demonstrates encryption and decryption using AES in EAX mode (confidentiality and authentication)

AES-ECB-Filter.zip — Demonstrates encryption and decryption using AES in ECB mode with filters (confidentiality only)

AES-CBC-Filter.zip — Demonstrates encryption and decryption using AES in CBC mode with filters (confidentiality only)

AES-CFB-Filter.zip — Demonstrates encryption and decryption using AES in CFB mode with filters (confidentiality only)

AES-OFB-Filter.zip — Demonstrates encryption and decryption using AES in OFB mode with filters (confidentiality only)

Проверка работы

И в заключение напишем маленькую программку, которая будет шифровать/дешифровать файлы. Для этого нам понадобится консольный проект (я использовал Visual Studio 2003). Включим в проект файлы нашего недавно созданного класса и то, что мы скачали из интернета (aes.h, aeskey.c, aescrypt.c, aesopt.h, aestab.c, aestab.h). Проект мы назвали AES_demo, а потому и главный cpp-файл называется aes_demo.cpp. В нем мы подключим caes.h и определим 256-битный ключ шифрования.

Чтобы зашифровать какой-либо файл, надо запустить программу со следующими параметрами:

AES_demo.exe /encrypt not_crypt_file.txt crypt_file.txt

После такого вызова в crypt_file.txt мы увидим зашифрованное содержимое not_crypt_file.txt. Для дешифровки надо вбить в командную строку следующее:

AES_demo.exe /decrypt crypt_file.txt decrypt_file.txt

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

Особенности AES

Благодаря следующим своим особенностям протокол AES является одним из лучших алгоритмов продвинутого шифрования данных:

  • Безопасность:алгоритм AES лучше сопротивляется попыткам взлома, чем прочие методы шифрования.
  • Стоимость:созданный для максимально широкого распространения (и, как следствие, бесплатный), алгоритм AES весьма эффективно использует вычислительные ресурсы устройства и, в частности, оперативную память.
  • Реализация:алгоритм AES обладает достаточной степенью гибкости и отлично подходит как для использования с аппаратными и программными продуктами, так и вне их.

Шифрование – кодирование частных данных

Скорее всего, на вашем телефоне, ноутбуке, планшете или ином устройстве наверняка есть важные данные — например, финансовые. Без шифрования доступ к вашим личным данным могут получить посторонние!

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

На данный момент самыми продвинутыми из доступных уровней шифрования являются 128- и 256-битное. Если не вдаваться в подробности, то битность указывает на размер ключа шифрования, выступающего в качестве пароля. Чем длиннее ключ, тем сложнее его взломать. Немного занимательных фактов для наглядности: 128-битное шифрование используется банками и военными, оно в триллион раз сильнее 40-битного шифрования.

История AES

В далеком 1998 году NIST объявил конкурс на создание алгоритма, удовлетворяющего выдвинутым институтом требованиям. Он опубликовал все несекретные данные о тестировании кандидатов на роль AES и потребовал от авторов алгоритмов сообщить о базовых принципах построения используемых в них констант. В отличие от ситуации с DES, NIST при выборе AES не стал опираться на секретные и, как следствие, запрещенные к публикации данные об исследовании алгоритмов-кандидатов.

Чтобы быть утвержденным в качестве стандарта, алгоритм должен был:

  1. реализовать шифрование частным ключом;
  2. представлять собой блочный шифр;
  3. работать со 128-разрядными блоками данных и ключами трех размеров (128, 192 и 256 разрядов).

Дополнительно кандидатам рекомендовалось:

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

Кроме того, алгоритм, претендующий на роль стандарта, должен распространяться по всему миру на неэксклюзивных условиях и без платы за пользование патентом.

Перед первым туром конкурса в NIST поступило 21 предложение, 15 из которых соответствовали выдвинутым критериям. Затем были проведены исследования этих решений, в том числе связанные с дешифровкой и проверкой производительности, и получены экспертные оценки специалистов по криптографии. В августе 1999 года NIST объявил пять финалистов, которые получили право на участие во втором этапе обсуждений.
2 октября 2000 года NIST сообщил о своем выборе – победителем конкурса стал алгоритм RIJNDAEL (произносится как «райндол») бельгийских криптографов Винсента Раймана и Йоана Дамана, который зарегистрирован в качестве официального федерального стандарта как FIPS 197 (Federal Information Processing Standard).

Для меня остается загадкой, зачем в российском вузе преподают стандарты иностранных государств. Видимо, исходят из принципа, что врага надо знать в лицо :). Ладно, в общем-то, это не наше дело. Нам надо просто программно реализовать основу национальной безопасности США.

Два вида шифрования: симметричное и асимметричное

Что симметричное, что асимметричное шифрование позволяют надежно защитить передаваемые данные. Но для асимметричного шифрования вам не потребуется передавать свой закрытый ключ шифрования — как следствие, процесс получается безопаснее. В свою очередь, симметричное шифрование просто быстрее, так как оно менее требовательно к вычислительным ресурсам устройства.

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

Определения и вспомогательные процедуры

Определения
Block последовательность бит, из которых состоит input, output, State и Round Key. Также под Block можно понимать последовательность байт
Cipher Keyсекретный, криптографический ключ, который используется Key Expansion процедурой, чтобы произвести набор ключей для раундов(Round Keys); может быть представлен как прямоугольный массив байтов, имеющий четыре строки и Nk колонок.
Ciphertextвыходные данные алгоритма шифрования
Key Expansionпроцедура используемая для генерации Round Keys из Cipher Key
Round KeyRound Keys получаются из Cipher Key используя процедуру Key Expansion. Они применяются к State при шифровании и расшифровании
Stateпромежуточный результат шифрования, который может быть представлен как прямоугольный массив байтов имеющий 4 строки и Nb колонок
S-boxнелинейная таблица замен, использующаяся в нескольких трансформациях замены байт и в процедуре Key Expansion для взаимнооднозначной замены значения байта
Nbчисло столбцов(32-ух битных слов), составляющих State. Для, AES Nb = 4
Nkчисло 32-ух битных слов, составляющих шифроключ. Для AES, Nk = 4,6, или 8
Nrчисло раундов, которое является функцией Nk и Nb. Для AES, Nr = 10, 12, 14
Rcon[]массив, который состоит из битов 32-х разрядного слова и является постоянным для данного раунда
Вспомогательные процедуры
AddRoundKey() трансформация при шифровании и обратном шифровании, при которой Round Key XOR’ится c State. Длина RoundKey равна размеру State(те, если Nb = 4, то длина RoundKey равна 128 бит или 16 байт)
InvMixColumns()трансформация при расшифровании которая является обратной по отношению к MixColumns()
InvShiftRows()трансформация при расшифровании которая является обратной по отношению к ShiftRows()
InvSubBytes()трансформация при расшифровании которая является обратной по отношению к SubBytes()
MixColumns()трансформация при шифровании которая берет все столбцы State и смешивает их данные (независимо друг от друга), чтобы получить новые столбцы
RotWord()функция, использующаяся в процедуре Key Expansion, которая берет 4-х байтное слово и производит над ним циклическую перестановку
ShiftRows()трансформации при шифровании, которые обрабатывают State, циклически смещая последние три строки State на разные величины
SubBytes()трансформации при шифровании которые обрабатывают State используя нелинейную таблицу замещения байтов(S-box), применяя её независимо к каждому байту State
SubWord()функция, используемая в процедуре Key Expansion, которая берет на входе четырёх-байтное слово и применяя S-box к каждому из четырёх байтов выдаёт выходное слово
Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации