Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Применение компьютерной системы для изучения симметричных алгоритмов шифрования
В качестве примера рассмотрим задачу конфиденциальной передачи данных от одного процесса источнику сообщения другому процессу получателю сообщения. В компьютерной системе изучения методов и средств аппаратно-программной защиты информации разработана динамическая модель. Графическое представление модели взаимодействия процессов изображено на рисунке 4.2.1. Рисунок 4.2.1 — Диаграмма взаимодействия процессов при конфиденциальной передаче данных
Процесс источник сообщения S выполняет шифрование данных с помощью ключа K, после чего передает шифротекст по каналу процессу получателю R. Процесс R обладает ключом К, с помощью которого выполняется дешифрование шифротекста и получения исходного сообщения. В компьютерной системе реализованы следующие блоки симметричного шифрования: · DES; · IDEA. Для описание алгоритмов работы процессом применяется язык Java. Алгоритмы IDEA и DES реализованы в виде классов, предоставляющих следующие методы: · конструктор — выполняет инициализацию объекта; · void setIV(byte IV[]) — метод устанавливающий начальные вектор для режимов сцепления шифровальных блоков, обратной связи по шифротексту и по выходу; · void resetFB() — выполняет сброс регистра сдвига для режимов обратной связи по шифротексту и по выходу в начальное состояние; · boolean setKey(byte[] key) — метод для установки ключа; · byte[] encode(byte[] key, byte[] data) — метод, выполняющий шифрование одного блока данных data с помощью ключа key; · byte[] decode(byte[] key, byte[] data) — метод, выполняющий дешифрование одного блока данных data с помощью ключа key; · byte[] encodeBlock(byte[] data) — метод выполняет шифрование одного блока данных data с помощью ключа, установленного функцией setKey; · byte[] decodeBlock(byte[] data) — метод выполняет дешифрование одного блока данных data с помощью ключа, установленного функцией setKey; · byte[] encodeData(byte data[], int mode) — выполняет шифрование данных data произвольной длины одним из режимов работы (см. таблицу 4.2.1); · byte[] decodeData(byte data[], int mode) — выполняет дешифрование данных data произвольной длины одним из режимов работы (см. таблицу 4.2.1).
Таблица 4.2.1 — Константы режимов работы блочных шифров
В примере в качестве алгоритма шифрования используется алгоритм IDEA и режим сцепления шифрованных блоков (CBC). Для шифрования определим метод процесса S do_send, блок-схема метода представлена на рисунке 4.2.2.
Рисунок 4.2.2 — Блок-схема работы метода do_send процесса S
При возникновении сообщения в узле процесса R сервер будет вызван метод onRecieve процесса R. Блок-схема работы метода onRecieve процесса R представлена на рисунке 4.2.3.
Для сохранения значений переменных в процессе моделирования существуют методы: · void logMessage(String message) — выполняет сохранение сообщения message в списке сообщений моделирования; · void logDataMessage(String message, data) — выполняет сохранение сообщения message и связанных с сообщением данных data в журнале сообщений моделирования.
Рисунок 4.2.3 — Блок схема работы метода onRecieve процесса R
Для просмотра этих сообщений следует открыть окно сообщений моделирования двойным щелчком на элементе «Моделирование\Сообщения» в древовидном списке приложения. Для работы с бинарными данными используется тип byte[] (массив байтовых целых чисел). Каждый элемент массива представляет собой бинарное число (0 или 1). Для определения и обработки бинарных данных используются методы класса Binary: · static public byte[] random(int len) — метод для генерации случайного бинарных данных длины len; · static public byte[] setByBits(byte[] data) — метод для инициализации бинарных данных путем копирования вектора бинарных чисел data; · static public byte[] setByInt(int num, int len) — метод для инициализации бинарных данных путем преобразования целого числа num в бинарные данные длиной len; · static public byte[] setByLong(long num, int len) — метод для инициализации бинарных данных путем преобразования целого числа num в бинарные данные длиной len; · static public byte[] setByLength(int len) — метод для инициализации бинарных данных длины len нулевыми значениями; · static public byte[] setFromBinary(String binString) — метод для инициализации бинарных данных из строки содержащей число в бинарном формате; · static public byte[] setFromHex(String hexString) — метод для инициализации бинарных данных из строки содержащей число в шестнадцатеричном формате; · static public byte[] setFromString(String data) — метод для инициализации бинарных данных из строки путем перевода кодов символов в бинарные данные; · static public String toBinString(byte[] data) — перевод бинарного значения data в строку, содержащую данные в бинарном формате; · static public String toHexString(byte[] data) — перевод бинарного значения data в строку, содержащую данные в шестнадцатеричном формате; · static public String toString(byte[] data) — перевод бинарного значения data в строку, содержащую символы с кодами из в массиве data; · boolean equals(byte val1[], byte val2[]) — выполняет сравнение двух бинарных значений и возвращает истину если значения равны, иначе — ложь.
Для замера времени выполнения шифрования и дешифрования используется объекты класса TimeUtil. Для измерения времени выполнения определенных действий требуется до начала действий создать экземпляр класса TimeUtil, вызвать метод start(), после — вызвать метод finish(), после чего время в миллисекундах можно получить вызовом функции millisec(). Для передачи данных по каналу применяется метод void send(String node, Object data). В качестве параметров метода send указываются:
· node — узел процесса, выполняющего передачу данных; · data — данные.
У процесса, который принимает данные вызывается обработчик события onRecieve. Для получения данных в обработчике onRecieve выполняется вызов метода Object recv(String node). Параметр node определяет в каком узле следует считывать данные. Если данные не обнаружены метод recv возвращает null, иначе будут возвращены полученные данные. Метод do_send процесса S определяется следующим образом:
byte key[]=Binary.setFromHex(" 9B58 086D 9BF9 CD96 C6EA 3381 B1B4 F637"); byte IV[]=Binary.setFromHex(" 7836 ECD6 C5F0 37B6"); byte data[]=Binary.random(10000); IDEA idea=new IDEA(); idea.setIV(IV); idea.setKey(key); logDataMessage(" Открытый текст", data); TimeUtil t=new TimeUtil(); t.start(); byte code[]=idea.encodeData(data, idea.MODE_CBC); t.finish(); logDataMessage(" Время шифрования ", t.millisec()); logDataMessage(" Зашифрованный текст", code); send(" out", code);
Определение метода onRecieve процесса R представлено ниже.
byte key[]=Binary.setFromHex(" 9B58 086D 9BF9 CD96 C6EA 3381 B1B4 F637"); byte IV[]=Binary.setFromHex(" 7836 ECD6 C5F0 37B6"); IDEA idea=new IDEA(); idea.setIV(IV); idea.setKey(key); byte code[]=(byte[])recv(" in"); TimeUtil t=new TimeUtil(); t.start(); byte data[]=idea.decodeData(code, idea.MODE_CBC); t.finish(); logDataMessage(" Время расшифрования", t.millisec()); logDataMessage(" Расшифрованный текст", data);
|