
- •Введение
- •I. Обзор основных методов шифрования связи
- •1.1. Основные проблемы и положения
- •1.2. Способы решения
- •1.3. Шифрование аналогового потока
- •1.4. Плюсы и минусы методов шифрования аналогового потока
- •1) Использование шума:
- •2) Частотные преобразования:
- •3)Использование временных преобразований (скремблирование)
- •1.5. Шифрование в цифровом канале связи
- •Гост 28147-89
- •II. Алгоритм шифрования des
- •Блочный шифр.
- •Алгоритм шифрования aes
- •Высокоуровневое описание алгоритма
- •Гост 28147-89
- •Разработка приложения на языке Python
- •Описание языка Python
- •Установка языка Python
- •Библиотека PyCrypto на Python
- •Собственная реализация aes на Python
- •Запуск и сопровождение программы
- •Заключение
- •Список литературы
Собственная реализация 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, которая производит циклическую перестановку.
В тексте программы мы определяем функцию через ключевое слово 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).
Взятие обратного числа в поле Галуа
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) – функция для создания ключа промежуточной трансформации при помощи полученного расширенного ключа.
Рассмотрим поподробнее функцию шифрования:
Выше мы пропустили несколько функций, совершающих вспомогательные преобразования (такие как, например, 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,