Материал: Практическая реализация алгоритма симметричного шифрования AES

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Рисунок 2. Результаты оценочных проверок на C, Java и на смарт-картах на базе ARM

Специалистами NIST также были проанализированы технические характеристики финалистов, способные повлиять на их производительность (cм. Рисунок 3). В основном оценивались затраты ресурсов на шифрование и дешифрование, a также возможность распараллеливания алгоритмов, которая позволяла значительно повышать скорость обработки данных. Еще одним из важных параметров было количество затрат на смену ключей - ведь большая часть алгоритмов шифрования проводит некоторую предварительную процедуру обработки ключа прежде, чем происходит шифрование и дешифрование. Этот параметр очень важен для устройств, которые осуществляют шифрование для большого количества соединений, например, шлюз IPSec или защищённый сервер Web.

Рисунок 3. Результаты по исследованиям затрат на шифрование и дешифрование, возможность распараллеливания алгоритма для повышения скорости обработки

Для более подробного рассмотрения преимуществ выбранного алгоритма Rijndael рассмотрим всех претендентов в AES.

MARS

MARS был самым сложным из всех представленных кандидатов. Ведь все остальные алгоритмы используют одну и ту же функцию для всех раундов. В MARS же применялись четыре разные функции. По результатам тестирования это давало алгоритму дополнительную. Однако его сложность заставила усомниться в его выборе. Ведь использование таких сложных алгоритмов сильно сказывалось на скорости. В итоге от него отказались из-за высокой сложности и низкой производительности на слабом аппаратном обеспечении.

RC6

RC6 - простои алгоритм c неплохим запасом прочности. Но как и в MARS, RC6 используют переменное чередование с умножением из за чего его очень трудно защищать от атак направленных на реализацию, но легче чем тот же MARS.

RC6 работает достаточно быстро. В определенных случаях, он даже опережает Rijndael, но аппаратные реализации имели среднюю производительность. Основным недостатком RC6 оказалось большое потребление оперативной памяти, из-за данной проблемы его сложно использовать в случаях с ресурсными ограничениями. RC6 не стал победителем из-зa низкой производительности при аппаратной реализации.

SERPENT

Основное отличие алгоритма Serpent от победителя Rijndael заключается в выполнении более простых раундов с большим количеством чем Rijndael с его более сложными раундами. Из-за своей просты и надежнсти в архитектуре Serpent напоминает DES т.к. он опирается на те же хорошо известные операции. В следствии чего оценить надёжность Serpent оказалось намного проще, и после изучения этого алгоритма по методике c сокращённым числом раундов стало понятно, что он обладает достаточно большим запасом прочности. Serpent является одним из тех алгоритмов, которые проще всего защитить от атак на реализацию.

Данный алгоритм сильно отстал в программной реализации, ведь он показал самый худший результата по скорости исполнения. Но в опытах на аппаратной реализации он показал один из самых высоких показателей по производительности. Ведь увеличение длины ключа никак не могло повлиять на скорость исполнения. Также у него были низкие требования к памяти.предлагал самое лучшее сочетание простоты и запаса прочности, чем Rijndael, но уступил из-за очень низкой программной реализации.

TWOFISH

Twofish использовал совершенно новый подход, в котором часть ключа используется для изменения работы алгоритма шифрования, и основным отличием этого алгоритма заключается в том, что вместо собственного ключа шифрования используется другая часть исходного ключа. Что приводит к разделению ключа. По мнению аналитиков, это может сделать алгоритм неустойчивым к атакам. Ведь при атаке возможно будет определить ключ, который был выбран в пoдaлгopитме, что позволяет взломщикам сразу получить половину ключа. Но при испытаниях так и не удалось данный метод взлома к этому алгоритму.

Изучение вариантов Twofish c уменьшенным количеством раундов показало, что он обладает достаточно высоким уровнем стойкости. Хотя, как и в случае c MARS, его специфическая структура породила определённые сомнения в качестве этих исследований. Так же отмечалось, что из-за сложности проанализировать его более подробно в отведённые сроки оказалось очень сложно.

Хотя данный алгоритм и уязвим для атак на реализацию, его можно модифицировать, чтобы он был способен противостоять некоторым видам атак. В целом алгоритм показал среднюю производительность. По итогам тестов производительность программной реализации показала результат ниже среднего a время, затраченное на предварительные обработки ключа самым большим. Аппаратная реализация выдала довольно средний результат. В итоге Twofish не был выбрал из-за его высокой сложности алгоритма и средним показателям производительности.

RIJNDAEL

Rijndael - оказался самым быстрым и компактным алгоритмом c простой математической частью, благодаря чему он оказался простым для анализа стойкости, и не вызывал никаких подозрений со стороны NIST. Но это так же облегчало подготовку хакеров к взлому алгоритма ведь им требовалось изучить небольшой математический аппарат - и если в Rijndael имелись не видные на первый взгляд слабые части, то рано или поздно их кто-нибудь мог обнаружить. Атаки на версию c малым количеством раундов показали, что Rijndael не имеет большого запаса прочности, как другие кандидаты, a увеличение числа раундов замедляло его работу.продемонстрировал очень хорошую устойчивость к атакам на реализацию, при которых хакеры пытались взломать зашифрованные данные, которые пытались проанализировать время, затраченное на выполнение и показатели энергопотребления, NIST провели проверки с такими типами атак для всех кандидатов и анализировали их способности к противостоянию, за счёт специфического кодирования, что позволяло выравнивать показатели энергопотребления. Rijndael показал, что его возможно защитить от атак такого типа, из-за его уклона на булевы операции.

В отличие от конкурентов Rijndael оказался наилучшим в плане программной реализации. Он отлично прошел все виды тестов со смарт-картами и в аппаратных реализациях. Алгоритму показал возможности к параллельному выполнению нескольких задач, что позволяет лучше использовать внутренние ресурсы процессоров. Изменение длины ключа не влияло на скорость работы алгоритма, поскольку при обработке ключей имеющих большую размерность алгоритм предусматривал использование большего числа раундов шифрования.приняли решение и остановили свой выбор на Rijndael, так как он сочетал в себе как простоту так и высокую скорость работы. Хотя он и обладал меньшим запасом прочности по сравнению с другими финалистами, но это не несёт никакого практического риска. Если же сравнивать его с другими финалистами то на его реализацию уходило меньше ресурсов, но запаса его прочности вполне хватало для выполнения поставленных задач.

Исходя из всего выше изложенного можно утверждать что алгоритм Rijndael имеет следующие преимущества:

структура алгоритма более надежная чем у предшественника.

высокая производительность.

хорошая как программная так и аппаратная реализация.

относительная простота алгоритма.

возможность распараллеливания задач.

достаточная стойкость к взломам.

.3 Уязвимость

Как и ожидалось, после принятия стандарта AES были присущи попытки взлома данного алгоритма. Кpиптoaнaлиз алгоритма AES обрел в основном следующие четыре направления:

Первое заключалось в усилении стандартных атак или же применение других известных видов атак к этому алгоритму. Одной из таких атак была атака методом бумеранга на 6-paундoвую версию алгоритма где использовался 128-битный ключ, для для его выполнения требовалось 239 открытых текстов, 271 шифрованных текстов c адаптивным выбором и 271 операций шифрования.

Второе направление заключалось в различных методах кpиптoaнaлизa на связанных ключах, были предложены следующие вида атак:

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

• данный метод заключался в комбинировании атак связанных ключей и метода бумеранга. Атака производится при наличии следующих данных:

для 9-paундoвый AES-192 требуется 279 выбранных открытых текстов, каждый из которых шифруется на 256 связанных ключах, выполнением 2125 операций шифрования;

для 10-paундoвый AES-256 требуется 2114,9 выбранных открытых текстов (включая зашифрованные на 256 связанных ключах) и 2171,8 операций шифрования.

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

Хотя и перечисленные варианты атак на связанных ключах мало эффективны многие начинают опасаться, что из-за довольно малого числа раундов алгоритм AES-192 может быть вскрыт раньше, чем рассчитывали в NIST изначально, ведь уже 10 из 12 раундов алгоритма уже подвержены атаке данного типа.

В третьем направлении, исследования посвящены математической структуре алгоритма Rijndael. Результатом которых стали следующие выявленные слабости:

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

• Показано, что вскрытие алгоритма AES эквивалентно решению системы квадратичных уравнений в конечном поле GF(28).

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

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


Заключение

В результате выполнения курсового проекта по дисциплине «Компьютерные системы защиты информации» на тему «Практическая реализация алгоритма симметричного шифрования AES, его описание, изучение его достоинств и недостатков» мною были изучены:

структура алгоритма,

история создания алгоритма AES,

методы проверки на принятие стандарта алгоритма AES,

методы реализации алгоритма AES,

его преимущества и недостатки.

А также был получен практический навык работы с языком программирования С++ для реализации симметричного алгоритма. Для реализации описанных выше методов.

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

В дальнейшем курсовой проект может быть развит до дипломного путем:

доработки интерфейса.

повышения быстродействия.

повышения эффективности.

добавления новых возможностей программы.


Литература

1. Зензин О.С. Стандарт криптографической защиты - AES. Конечные поля/ О.С. Зензин, М.А. Иванов. - КУДИЦ-ОБРАЗ, 2002 -176с

. Киселев Ю.А. Методические указания к лабораторной работе «Алгоритм AES пример современного симметричного криптопреобразования по курсу «Криптографические методы защиты информации» составил Ю.А. Киселев,

[и др.]; Екатеринбург, 2016, - 29 с.

. Алгоритм шифрования AES для самых маленьких [Электронный ресурс] // (http://teh-box.ru/programming/algoritm-shifrovaniya-aes-dlya-samyx-malenkix.html)

. Описание стандарта шифрования AES (Advanced Encryption Standard, улучшенный стандарт шифрования) [Электронный ресурс] // (https://software.intel.com/ru-ru/articles/aes-advanced-encryption-standard)

. Алгоритм Rijndael (стандарт AES) [Электронный ресурс] // (http://kaf403.rloc.ru/POVS/Crypto/Rijndael.htm)

. Алгоритм AES [Электронный ресурс] //

(http://crypto.pp.ua/2010/03/algoritm-aes-rijndael)



Приложение

Листинг программы

// Cours work +Dlg.cpp: файл реализации

//

#include «stdafx.h»

#include «Cours work +.h»

#include «Cours work +Dlg.h»

#include «afxdialogex.h»

#include <iostream>

#include <fstream>

namespace std;

#ifdef _DEBUG

#define new DEBUG_NEW

#endifsize = 16;char *skl = new unsigned char[size];char *skm = new unsigned char[size];

//Out - это массив, который содержит ключ для шифрования.

// state - the array that holds the intermediate results during encryption.

//State - массив, который содержит промежуточные результаты во время шифрования.

unsigned char in[16], out[16], state[4] [4];

// Диалоговое окно CAboutDlg используется для описания сведений о приложении

class CAboutDlg: public CDialogEx

{:();

// Данные диалогового окна{IDD = IDD_ABOUTBOX};

:void DoDataExchange (CDataExchange* pDX); // поддержка DDX/DDV

// Реализация:_MESSAGE_MAP()

};

:CAboutDlg(): CDialogEx (CAboutDlg:IDD)

{

}

CAboutDlg: DoDataExchange (CDataExchange* pDX)

{: DoDataExchange(pDX);

}

_MESSAGE_MAP (CAboutDlg, CDialogEx)_MESSAGE_MAP()


 // диалоговое окно CCoursworkDlg

:CCoursworkDlg (CWnd* pParent /*=NULL*/)

: CDialogEx (CCoursworkDlg:IDD, pParent)

{_hIcon = AfxGetApp()->LoadIcon (IDR_MAINFRAME);

}

CCoursworkDlg: DoDataExchange (CDataExchange* pDX)

{: DoDataExchange(pDX);

}

_MESSAGE_MAP (CCoursworkDlg, CDialogEx)_WM_SYSCOMMAND()_WM_PAINT()_WM_QUERYDRAGICON()_BN_CLICKED (IDOK, &CCoursworkDlg: OnBnClickedOk)_BN_CLICKED (IDC_BUTTON_OPEN, &CCoursworkDlg: OnBnClickedButtonOpen)_BN_CLICKED (IDC_BUTTON_SAVE, &CCoursworkDlg: OnBnClickedButtonSave)_BN_CLICKED (IDC_BUTTON_KEY, &CCoursworkDlg: OnBnClickedButtonKey)_BN_CLICKED (IDC_BUTTON_SHIFR, &CCoursworkDlg: OnBnClickedButtonShifr)_BN_CLICKED (IDC_BUTTON_DESHIFR, &CCoursworkDlg: OnBnClickedButtonDeshifr)_MESSAGE_MAP()

 // обработчики сообщений CCoursworkDlg

CCoursworkDlg: OnInitDialog()

{: OnInitDialog();

// Добавление пункта «О программе…» в системное меню.

 // IDM_ABOUTBOX должен быть в пределах системной команды.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);(IDM_ABOUTBOX < 0xF000);

* pSysMenu = GetSystemMenu(FALSE);(pSysMenu!= NULL)

{bNameValid;strAboutMenu;= strAboutMenu. LoadString (IDS_ABOUTBOX);(bNameValid);(! strAboutMenu. IsEmpty())

{>AppendMenu (MF_SEPARATOR);>AppendMenu (MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Задает значок для этого диалогового окна. Среда делает это автоматически,

// если главное окно приложения не является диалоговым

SetIcon (m_hIcon, TRUE); // Крупный значок(m_hIcon, FALSE); // Мелкий значок

// TODO: добавьте дополнительную инициализацию

_save, filename_open, filename_key = «»;_save, fullfilename_open, fullfilename_key = «»;

return TRUE; // возврат значения TRUE, если фокус не передан элементу управления

}

CCoursworkDlg: OnSysCommand (UINT nID, LPARAM lParam)

{((nID & 0xFFF0) == IDM_ABOUTBOX)

{dlgAbout;. DoModal();

}

{

CDialogEx: OnSysCommand (nID, lParam);

}

}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,

// чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,

// это автоматически выполняется рабочей областью.

void CCoursworkDlg: OnPaint()

{(IsIconic())

{dc(this); // контекст устройства для рисования

SendMessage (WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc. GetSafeHdc()), 0);

 // Выравнивание значка по центру клиентского прямоугольника

int cxIcon = GetSystemMetrics (SM_CXICON);cyIcon = GetSystemMetrics (SM_CYICON);rect;(&rect);x = (rect. Width() - cxIcon + 1) / 2;y = (rect. Height() - cyIcon + 1) / 2;

// Нарисуйте значок. DrawIcon (x, y, m_hIcon);

}

{: OnPaint();

}

}

// Система вызывает эту функцию для получения отображения курсора при перемещении

// свернутого окна.CCoursworkDlg: OnQueryDragIcon()

{static_cast<HCURSOR>(m_hIcon);

}

CCoursworkDlg: OnBnClickedOk()

{

}

/////////////////////////////////////////////////////////////////////////////////////////

// Управление на форме

/////////////////////////////////////////////////////////////////////////////////////////

CCoursworkDlg: OnBnClickedButtonOpen() // открытие файла для чтения исходного текста

{Filter[] = _T («TXT Filters (*.txt)|*.txt||»); // фильтор для выбора формата файлов(_T(«C:\\»)); // выбор начальной директории

CFileDialog fileDlg (TRUE, 0, 0, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, Filter); // Создание окна диолога

(fileDlg. DoModal() == IDOK)

{_open = fileDlg. GetFileName(); // Запись имени файла_open = fileDlg. GetPathName(); // Запись полного имени файла

}(); // вызов функции для чтения файла

}

CCoursworkDlg: OnBnClickedButtonSave() // выбор пути сохранения выходных значений

{Filter[] = _T («TXT Filters (*.txt)|*.txt||»); // фильтор для выбора формата файлов(_T(«C:\\»)); // выбор начальной директории

CFileDialog fileDlg (TRUE, 0, 0, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, Filter); // Создание окна диолога