Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Криптография / ОБУЧАЮЩИЕ ПРОГРАММЫ / Пояснительная записка.doc
Скачиваний:
39
Добавлен:
01.05.2014
Размер:
411.65 Кб
Скачать
    1. Использование потоков

В программе существует 2 формата данных, передаваемых криптографическим алгоритмам:

  1. Двоичный формат. Данные интерпретируются как последовательность байт.

  2. Десятичный формат. Он используется для асимметричных алгоритмов. Данные интерпретируются как последовательность чисел, записанных в десятичной системе.

  3. Шестнадцатеричный формат. Он используется для симметричных алгоритмов. Данные интерпретируются как последовательность чисел от 0 до 255, записанных в 16-ричной системе.

Перед обработкой данных требуется указать формат. Пусть, например, алгоритм RSAс открытым ключомn=789499 иe=3 используется для шифрования строки «239». При использовании двоичного формата эта строка сначала будет преобразована в последовательность чисел

50 51 57,

а затем по формуле c=memodnбудет преобразована в последовательность чисел

125000 132651 185193.

При использовании десятичного формата та же строка будет интерпретирована как число 239, и результатом шифрования будет число 230436. Если же передать строку «алгоритм» при использовании десятичного формата, то никаких действий произведено не будет, т.к. эта строка не является последовательностью чисел в десятичной системе.

Передача данных в виде массива символов char*, количества байт и формата обладает несколькими существенными недостатками:

  1. Требуется следить, чтобы использованная память была освобождена.

  2. Для передачи данных из файла требуется сначала считать данные из него в буфер. Но считывание всех данных одновременно приведет к большому расходу памяти, а считывание по частям – к чрезмерно сложному коду.

  3. Часто возникают ошибки из-за невнимательности программиста.

Поэтому было решено использовать классы потокового ввода/вывода из стандартной библиотеки C++. В качестве параметра передается ссылка на объект классаstd::istreamилиstd::ostream. При этом все недостатки первого способа передачи данных исчезают. Разнообразие потоков приводит к тому, что можно легко шифровать или подписывать данные из файла, строки или с консоли, и выводить в любое из перечисленных мест. Например, объявление функцииEncryption::Encryptвыглядит так

voidEncrypt(std::istream&msg,std::ostream&cipher).

Возможности потоков позволяют передать и формат ввода данных. Для вновь созданного потока используется десятичный или шестнадцатеричный формат. Чтобы установить двоичный формат используется специальная функция-манипулятор Binary. Для отмены двоичного обмена используется манипуляторDecHex. Узнать, используется ли двоичный формат, можно с помощью функцииIsBinary.

    1. Использование генераторов ключей

Реализация алгоритма генерации ключей в каждом из классов, представляющих криптографические алгоритмы, приведет к дублированию кода. Вариант, при котором каждый из классов RSAEncrypt,RSADecrypt,RSASignиRSAVerifyнаследовался бы от одного класса, в котором была бы реализована генерация ключей, также не подходит. Ведь ключи генерируются случайным образом, а такой вариант привел бы к тому, что, например, шифратор и дешифратор, имели разные ключи. Поэтому для каждого криптографического алгоритма решено создать отдельный класс – генератор ключей. Сначала создается объект этого класса, затем с его помощью генерируются ключи, а затем эти ключи передаются всем объектам-алгоритмам.

Для двухключевых алгоритмов создано 4 таких генератора – RSAKeyGenerator,ElGamalKeyGenerator,DSAKeyGenerator,GOSTKeyGenerator. В каждом из них определена функция-членGetKeys, которая возвращает пару ключей – открытый и секретный. Для одноключевых алгоритмов создан 1 генератор –BlockKeyGenerator, который возвращает случайный ключ заданной длины.