![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Применение компьютерной системы для изучения протоколов электронной цифровой подписи
Для изучения схемы работы цифровой подписи рассмотрим пример передачи подписанного сообщения от ресурса Источник к субъекту Приёмник с использованием алгоритма RSA (см. рисунок 7.2.1). Рисунок 7.2.1 — Статическая модель для изучения ЭЦП
При определении динамической модели субъект Приёмник представляется в виде процесса R, ресурс Источник — в виде процесса S (см. рисунок 7.2.2). Рисунок 7.2.2 — Динамическая модель для изучения ЭЦП
При реализации схемы ЭЦП присутствуют следующие потоки данных: · процесс S передаёт открытый ключ (E, N) процессу R; · процесс S передаёт ЭЦП процессу R; · процесс S передаёт сообщение процессу R.
Переменные в области данных процессов приведены в таблице 7.2.1.
Таблица 7.2.1 — Определение переменных процессов
Для получения дайджеста сообщения используется алгоритм MD5. В качестве дайджеста выбираются первые 16 бит результата применения алгоритма хэширования MD5. Формирование и отправка открытого ключа процессу приемнику выполняется в методе exchangeKeys:
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.setOpenKey(e, rsa.getN()); 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);
Подпись и отправка сообщения с ЭЦП выполняется в методе sendSignedMessage процесса S: String message=" Тестовое сообщение"; byte digest[]=MD5.digest(message); long calcDigest=0; for (int i=0; i< 16; i++) { calcDigest< < =1; calcDigest|=digest[i]; } logDataMessage(" Cообщение", message); logDataMessage(" Дайджест сообщения", calcDigest); long code = rsa.decode(calcDigest); logDataMessage(" Сформирована ЭЦП", code); send(" hash_out", new Long(code)); send(" msg_out", message);
Получение и обработка данных процессом R определены в обработчике события onRecieve: if (hasMoreData(" key_in")) { long key[]=(long [])recv(" key_in"); rsa.setOpenKey(key[0], key[1]); logDataMessage(" Получен открытый ключ", " e=" +key[0]+" n=" +key[1]); } else if (hasMoreData(" hash_in")) { Long lcode=(Long)recv(" hash_in"); long code=lcode.longValue(); logDataMessage(" Получена ЭЦП", code); digest = rsa.encode(code); logDataMessage(" Дайджест сообщения", digest); } else if (hasMoreData(" msg_in")) { message=(String)recv(" msg_in"); logDataMessage(" Сообщение", message); }
Проверка ЭЦП реализована в методе checkSign процесса R:
if (digest> =0 & & message! =null) {
byte calcByteDigest[]=MD5.digest(message); long calcDigest=0; for (int i=0; i< 16; i++) { calcDigest< < =1; calcDigest|=calcByteDigest[i]; } if (calcDigest==digest) logMessage(" Сообщение подлинное"); else logMessage(" Сообщение ложное"); } else logMessage(" Не получены все данные");
В результате моделирования выполнена проверка целостности отправляемого сообщения. Протокол моделирования процесса S имеет следующий вид: 1. Регистрация клиента 2. Процесс создан 3. Событие onCreate 4. Запуск метода exchangeKeys 5. Секретный ключ p=25013 q=30011 6. Открытый ключ e=75061013 n=750665143 7. Отправка данных с узла S.key_out / out 75061013, 750665143 8. Запуск метода sendSignedMessage 9. Cообщение Тестовое сообщение 10. Дайджест сообщения 42700 11. Сформирована ЭЦП 705409300 12. Отправка данных с узла S.hash_out / out 705409300 13. Отправка данных с узла S.msg_out / out Тестовое сообщение
Протокол моделирования процесса R:
1. Регистрация клиента 2. Процесс создан 3. Событие onCreate 4. Событие onRecieve в узле key_in 5. Получены данные в узле R.key_in / in 75061013, 750665143 6. Получен открытый ключ e=75061013 n=750665143 7. Событие onRecieve в узле hash_in 8. Получены данные в узле R.hash_in / in 705409300 9. Получена ЭЦП 705409300 10. Дайджест сообщения 42700 11. Событие onRecieve в узле msg_in 12. Получены данные в узле R.msg_in / in Тестовое сообщение 13. Сообщение Тестовое сообщение 14. Запуск метода checkSign 15. Сообщение подлинное
|