Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Максим Филимонов.doc
Скачиваний:
39
Добавлен:
18.09.2019
Размер:
680.45 Кб
Скачать
    1. Собственная реализация aes на Python

Итак, начнем с того, что зададим словарь, который бы будет содержать все допустимые размеры ключей:

keySize = {

"SIZE_128":16,

"SIZE_192":24,

"SIZE_256":32}

Все, что заключается в фигурные скобки в Python является словарем. Словари задаются так: доступ в них определяется по ключу, который указан слева. Справа указывается значение, присвоенное определенному ключу. В источниках название словарей может быть также “hash” или “dictionary”. В любом случае, словарь – это изменяемый итерируемый объект (а значит, мы можем получить его элемент по индексу – в данном случае ключу). Словари могут использоваться для хранения многомерных массивов или таблиц.

Далее, создадим нелинейную таблицу замен, которую будем использовать в трансформациях для взаимооднозначной замены байта. Предварительно рассчитанные значения возьмем с сайта Wikipedia.ru и вставим в нашу программу в качестве list (списка). Список – массив, доступ к элементам которого предоставляется по индексу или срезу. Это, как и словари, изменяемый итерируемый объект, однако у списков свои методы. Нелинейная таблица замен называется S-box, а при расшифровке мы также будем пользоваться инвертированной таблицей замен.

sbox = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,

, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ]

Так как таблица большая, не будем приводить ее здесь, полную таблицу нелинейных замен s-box и инвертированную таблицу (rsbox) можно просмотреть в приложении 1.

Далее мы определяем три функции, две из которых – это получение значения из списков s-box и инвертированной s-box, а третья – функция rotate, которая производит циклическую перестановку.

Frame1

В тексте программы мы определяем функцию через ключевое слово def, после которого следует название функции и в скобках передаваемые аргументы. Функции getSBoxValue и getSBoxInvert просто-напросто забирают значения по индексу из таблиц sbox и rsbox. Функция rotate с помощью цикла for производит смещение бит влево, например:

rotate(1d2c3a4f) = 2c3a4f1d

Нужно сказать здесь еще о range – счетной функции-итераторе, которая используется в циклах. Например, range(3) в данном случае означает, что итератор передает значения из списка [0,1,2,3]. То есть, цикл повторяется 4 раза.

Еще одна таблица, которая уже сгенерирована, и ее не надо рассчитывать – это таблица Rcon (массив слов, постоянный для каждого цикла перестановки).

Rcon = [0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,

…, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb ]

Здесь нужно оговориться, как бы шла генерация данных значений, если бы они не были предварительно рассчитаны. Во-первых, для таблиц нужно было бы брать значения из поля Галуа, а затем производить сложение XOR с каждым байтом (для таблиц s-box).

  1. Взятие обратного числа в поле Галуа

  1. XOR-сложение

Таблица значений RCon – это массив значений, с которыми производится операция XOR после циклического сдвига, и рассчитывается он также из поля Галуа.

def getRconValue(self,num): return self.Rcon[num] – следующая функция позволяет нам получить значение из таблицы значений Rcon.

Итак, мы произвели вставку в программу основных констант. Рассмотрим функции и их поведение в программе.

def core(self,word, iteration) – кернел-функция, производящая циклический сдвиг (посредством функции rotate), замену значений байтов на s-box значения и XOR-сложение со значениями RCon (XOR-сложение в языке Python производится посредством оператора ^)

def expandKey(self,key, size, expandedKeySize) – функция расширения ключа. Расширяет ключи 128, 192, 256-байтовые соответственно в 176, 208 и 240-байтовые ключи. В данной функции получаются ключи для каждого циклического сдвига из Cypher key (ключа шифрования).

def addRoundKey(self,state, roundKey) – функция трансформации при шифровании и обратном шифровании, при которой происходит XOR ключа трансформации (Round Key) и State (промежуточный результат, который представляет собой матрицу ).

def createRoundKey(self,expandedKey,roundKeyPointer) – функция для создания ключа промежуточной трансформации при помощи полученного расширенного ключа.

Рассмотрим поподробнее функцию шифрования:

Frame2

Выше мы пропустили несколько функций, совершающих вспомогательные преобразования (такие как, например, galois_multiplication (умножение в поле Галуа), совершающую в функции mixColumn XOR-преобразование или ShiftRows – функцию, смещающую циклически промежуточный результат State). Все они производятся в теле функции aes_main, которая в свою очередь, вызывается из тела функции encrypt.

На вход подается обработанный 128-битный блок, на основе которого, в соответствии с заданным размером ключа, производится преобразование. Затем производится выдача расширенного ключа и передача полученного значения на выход.

Таким образом, осталось только посмотреть реализацию Mode, то есть режимов шифрования в AES.

В реализованном приложении поддерживаются 3 режима шифрования данных: все они снова записаны в словарь под названием modeOfOperation.

  • OFB

  • CFB

  • CBC

Описание класса режимов шифрования AES находится в описании класса AESModeOfOperation. В функции encrypt при помощи трехступенчатого оператора if описаны все варианты режимов шифрования.

Формулы, по которым задается шифрование в определенном режиме:

- CBC

Шифрование:

Зашифрование:

IV – вектор инициализации

Pj – очередной j-й блок открытого текста

Cj – очередной, j-ый блок шифротекста.

LSBm (X) - m младших бит (less significant bits) двоичного числа X

MSBm (X) - m старших бит (most significant bits) двоичного числа X

X Y – конкатенция битовых строк, представленных числами X и Y,

- OFB зашифрование:

OFB расшифрование:

В уравнениях приняты следующие обозначения:

IV – вектор инициализации;

Pj – очередной, j-ый блок открытого текста.

Cj – очередной, j-ый блок шифротекста.

MSBr (X) - r старших бит (most significant bits) двоичного числа X

- CFB

Шифрование:

Расшифрование:

В уравнениях приняты следующие обозначения:

IV – вектор инициализации;

Pj – очередной, j-ый блок открытого текста.

Cj – очередной, j-ый блок шифротекста.

LSBm (X) - m младших бит (less significant bits) двоичного числа X

MSBm (X) - m старших бит (most significant bits) двоичного числа X

X Y – конкатенция битовых строк, представленных числами X и Y,