- •Постановка задачи
- •Обзор современного состояния темы
- •Выбор алгоритмов и атак
- •Критерии выбора алгоритмов
- •Выбор симметричных алгоритмов шифрования
- •Выбор алгоритмов шифрования с открытым ключом
- •Выбор алгоритмов цифровой подписи
- •Выбор криптографических атак
- •Описание использованных криптографических алгоритмов
- •Симметричные алгоритмы шифрования
- •Алгоритм гост
- •Асимметричные алгоритмы шифрования
- •Алгоритмы цифровой подписи
- •Алгоритм гост
- •Описание использованных атак
- •Атака на общий модуль против алгоритмаRsa
- •Атака на выбранный шифртекст против алгоритмаRsa
- •Атака против алгоритмаDsa
- •Особенности реализации алгоритмов
- •Управление ключами
- •Генерация ключей
- •Хранение ключей
- •Длина ключа
- •Особенности реализации асимметричных алгоритмов
- •Модульная арифметика
- •Представление многозначных чисел
- •Сложение многозначных чисел
- •Умножение многозначных чисел
- •Деление многозначных чисел
- •Особенности реализации симметричных алгоритмов
- •Дополнение сообщений
- •Подключи и таблицы подстановки для алгоритмаBlowfish
- •Режим использования блочных шифров
- •Проектирование интерфейса
- •Сценарии использования программы
- •Пошаговое выполнение симметричных алгоритмов
- •Пошаговое выполнение асимметричных шифров
- •Пошаговое выполнение алгоритмов цифровой подписи
- •Демонстрация работы атак
- •Оценка скорости работы алгоритма
- •Структура диалога
- •Архитектура программы
- •Использование объектов-функций
- •Использование потоков
- •Использование генераторов ключей
- •Структура модулей
- •Заключение
- •Список литературы
Оценка скорости работы алгоритма
Для обработки достаточно длинных сообщений в программе имеется возможность шифровать или подписывать заданный файл. Структура, содержание и размер файла не имеют значения.
Для шифрования файла требуется задать файл с открытым текстом и файл, в который требуется поместить зашифрованный текст. Это должны быть два разных файла. При этом файл с открытым текстом не изменяется. Точно так же можно провести и дешифрование ранее зашифрованного файла.
При создании цифровой подписи она помещается в отдельный заданный файл. Для проверки подписи требуется задать файл с сообщением и файл с подписью.
После завершения операции с файлом выводятся: время обработки, включая время, затраченное на чтение и запись в файл; размер исходного файла; размер файла с шифртекстом; результат проверки подписи. Для измерения продолжительности операции замеряется системное время до и после выполнения операции.
Структура диалога
Каждый прямоугольник означает экранную форму. Стрелка между формами означает, что пользователь может перейти от одной форме к другой в направлении, показанном стрелкой.
Форма «Выбор алгоритма» предназначена для выбора методов шифрования и цифровой подписи, которые будут использоваться при действиях с файлами.
Архитектура программы
Использование объектов-функций
Одной из основных сущностей в данной программе является криптографический алгоритм. Для представления таких алгоритмов можно использовать функции, но можно и классы. Последнее решение и было использовано, поскольку в таком случае:
Не возникает вопроса о том, где хранить параметры, ключи, подключи и таблицы подстановок. Все это будут члены-данные соответствующих классов. В противном случае их пришлось бы делать глобальными переменными.
Алгоритмы можно расположить в иерархии «обобщение-специализация», например, Blowfish– это вид блочного шифра, а блочный шифр – это шифровальный алгоритм. Это улучшит структурированность программы, не приведет к дублированию кода.
Класс BlockCipherотвечает за хранение ключа и режима использования шифра –ECBилиCBC. Для симметричных шифров возможно хранение ключа в базовом классе, т.к. ключ всегда является последовательностью символов, на структуру которой нет ограничений. Для асимметричных алгоритмов такое представление невозможно.
Класс BlockEncryptionотвечает за разбиение сообщения на блоки фиксированной длины, дополнение сообщений, т.к. эти операции не зависят от конкретного вида шифра. Длина блока получается с помощью чисто виртуальной функцииBlockCipher::GetBlockLength.
Создание двух классов BlockEncryptionиBlockDecryptionвместо одного предусматривает случай, когда алгоритм шифрования существенно отличается от алгоритма дешифрования, хотя в работе таких шифров нет. КлассBlockCipherявляется виртуальным базовым классом, чтобы ключ не дублировался.
В результате, от подклассов, реализующих конкретные шифры, требуется только предоставление информации о длине блока, возможной длине ключа и преобразование отдельного заданного блока.
Каждый из классов Encryption, Decryption, Signature и Verification имеют по одной чисто виртуальной функции Encrypt, Decrypt, Sign, Verify соответственно. Их параметрами являются входное и выходное сообщения.
Хеш-функции также объединены в иерархию, но единственной хеш-функцией в программе является SHA, поэтому у абстрактного классаHashесть только один подкласс.