![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Применение компьютерной системы для изучения алгоритмов шифрования с открытым ключом
Для конфиденциальной передачи данных от отправителя к получателю с использованием алгоритма шифрования с открытым ключом требуется выполнить: а) генерацию пары ключей (открытого и секретного ключей) на стороне получателя сообщения; б) передачу открытого ключа отправителю сообщения; в) шифрование сообщения открытым ключом; г) отправку шифротекста получателю; д) дешифрование с помощью секретного ключа получателем. Для изучения используется передача данных от ресурса Источник субъекту Приёмник (см. рисунок 5.2.1).
Рисунок 5.2.1 — Статическая диаграмма, используемая при конфиденциальной передаче данных
При взаимодействии элементов Приёмник и Источник выполняется передача данных как от Приёмника к Источнику так и в обратную сторону. Приёмник моделируется в виде процесса R, Источник — в виде процесса S. Процесс R генерирует пару ключей: открытый ключ и секретный ключ, затем открытый ключ передается процессу S в незашифрованном виде. После получения открытого ключа процесс S выполняет шифрование исходного сообщения и его отправку процессу R. При получении шифротекста процессом R выполняется дешифрование сообщения с помощью секретного ключа.
Рисунок 5.2.2 — Модель взаимодействия процессов при конфиденциальной передаче данных с использованием алгоритма шифрования с открытым ключом
Для генерации пары ключей будем использовать метод процесса R makeKeys. При получении открытого ключа вызывается обработчик onRecieve процесса S. Шифрование и отправка шифротекста выполняется в методе do_send процесса S. В качестве примера рассмотрим шифрование целого числа алгоритмом RSA. В компьютерной системе разработан класс RSA. Класс RSA предоставляет следующие методы: · boolean setSecureKey(long p, long q) — установка секретного ключа, состоящего из целых чисел p и q (произведение чисел p и q должно быть меньше максимальной целого числа типа long); · long getFi() — метод возвращает значение функции j; · boolean checkOpenKey(long e) — выполняет проверку значения открытого ключа на удовлетворение требований предьявляемых алгоритмом; · void setOpenKey(long e, long n) — выполняет установку открытого ключа; · long encode(long msg) — выполняет шифрование сообщения msg установленным открытым ключом с помощью функции setOpenKey; · long decode(long msg) — выполняет дешифрование сообщения msg установленным секретным ключом с помощью функции setSecureKey.
Секретный и открытый ключи должны удовлетворять требованиям алгоритма RSA. Для проверки этих требований используется класс Numerical.
Методы класса Numerical: · static boolean isPrime(long n) — проверяет является ли число n простым; · static long gcd(long a, long b) — возвращает наибольший общий делитель чисел a и b; · static long inverse(long a, long n) — возвращает мультипликативное обратное числу a по модулю n; · static long power(long x, long n, long p) — возводит число x в степень n по модулю p.
В области данных процессов R и S определена переменная rsa класса RSA: RSA rsa=new RSA();
Алгоритм работы метода makeKeys процесса R имеет следующий вид
long x = 25000; long y = 30000; long fi; long p, q, e; for (p = x;! Numerical.isPrime(p); p++); for (q = y + 2;! Numerical.isPrime(q); q++); rsa.setSecureKey(p, q); logDataMessage(" Секретный ключ", " p=" + p +" q=" +q); fi=rsa.getFi(); for (e = fi / 10; Numerical.gcd(e, fi)! = 1; e++); rsa.checkOpenKey(e); logDataMessage(" Открытый ключ", " e=" + e+" n=" +rsa.getN()); long open_key[]=new long[2]; open_key[0]=e; open_key[1]=rsa.getN(); send(" key_out", open_key);
Получение открытого ключа выполняется в методе-обработчике onRecieve процесса S:
long key[]=(long [])recv(" key_in"); rsa.setOpenKey(key[0], key[1]); logDataMessage(" Получен открытый ключ", " e=" +key[0]+" n=" +key[1]);
Шифрование и отправка данных выполняются в методе do_send:
long message=12345435; logDataMessage(" Исходный текст", message); long code = rsa.encode(message); logDataMessage(" Зашифрованный текст", code); send(" out", new Long(code));
Получение и дешифрование данных процессом R обрабатывается в методе onRecieve:
Long lcode=(Long)recv(" in"); long code=lcode.longValue(); logDataMessage(" Шифротекст", code); long decode = rsa.decode(code); logDataMessage(" Расшифрованный текст", decode);
В результате моделирования получен протокол работы процессов.
Протокол работы процесса S имеет следующий вид:
Регистрация клиента Процесс создан Событие onCreate Получены данные в узле S.key_in / in 75061013, 750665143 Событие onRecieve в узле key_in Получен открытый ключ e=75061013 n=750665143 Запуск метода do_send Исходный текст 12345435 Зашифрованный текст 583217134 Отправка данных с узла S.out / out 583217134
Протокол работы процесса R:
Регистрация клиента Процесс создан Событие onCreate Запуск метода makeKeys Секретный ключ p=25013 q=30011 Открытый ключ e=75061013 n=750665143 Отправка данных с узла R.key_out / out 75061013, 750665143 Получены данные в узле R.in / in 583217134 Событие onRecieve в узле in Шифротекст 583217134 Расшифрованный текст 12345435
|