Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка_осн.doc
Скачиваний:
10
Добавлен:
27.04.2019
Размер:
2.94 Mб
Скачать

8.2Применение компьютерной системы для изучения протоколов электронной цифровой подписи

Для изучения схемы работы цифровой подписи рассмотрим пример передачи подписанного сообщения от ресурса Источник к субъекту Приёмник с использованием алгоритма RSA (см. рисунок 7.2.1).

Рисунок 7.15.1 — Статическая модель для изучения ЭЦП

При определении динамической модели субъект Приёмник представляется в виде процесса R, ресурс Источник — в виде процесса S (см. рисунок 7.2.2).

Рисунок 7.2.2 — Динамическая модель для изучения ЭЦП

При реализации схемы ЭЦП присутствуют следующие потоки данных:

  • процесс S передаёт открытый ключ (E,N) процессу R;

  • процесс S передаёт ЭЦП процессу R;

  • процесс S передаёт сообщение процессу R.

Переменные в области данных процессов приведены в таблице 7.2.1.

Таблица 7.2.16 — Определение переменных процессов

Процесс

Определение области данных

S

RSA rsa = new RSA();

R

RSA rsa=new RSA();

long digest=-1;

String message;

Для получения дайджеста сообщения используется алгоритм 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. Сообщение подлинное