Схема аутентификации на основе сертификата.
Данная схема предполагает наличие третьей стороны, называемой УЦ – удостоверяющим центром или ЦС – центром сертификации, которая выдает удостоверения (сертификаты) всем участникам сетевого домена, входящего в зону действия данного ЦС. При регистрации нового пользователя или сервера в домене ЦС выдает новому участнику сертификат, состоящий из открытой части, содержащий такие данные как:
- Идентификатор владельца сертификата,
- Адрес владельца сертификата,
- Открытый ключ владельца сертификата,
- Категория владельца сертификата (например, пользователь с ограниченными полномочиями или администратор проекта).
- Наименование ЦС и его адрес,
- Алгоритмы, используемые для генерации ключей и формирования ЭЦП, и их версии,
и закрытой части, содержащий ту же информацию, закрепленной электронно-цифровой подписью ЦС (т.е. подвергнутого хеш- преобразованию и последующему шифрованию с помощью закрытого ключа ЦС).
Обе части выдаются соискателю в электронном виде в виде одного файла. Закрытая часть служит для того, чтобы нельзя было подделать сертификат.
Кроме того, соискатель получает отдельно закрытый ключ, соответствующий открытому ключу, находящемуся в сертификате, который соискатель обязуется хранить в секрете.
Кроме того, открытая часть сертификата может выдана в виде бумажного документа, подтвержденного печатью ЦС.
При обмене сообщения каждый участник сопровождает свое послание меткой времени, электронно-цифровой подписью, сформированной на основе своего закрытого ключа, и сертификатом, выданным ему ЦС. Сертификат здесь служит для удостоверения ЭЦП отправителя: получатель подписывает своим закрытым ключом послания, а получатель расшифровывает ЭЦП, используя открытый ключ отправителя, извлеченный из сертификата. Подлинность сертификата подтверждается электронно-цифровой подписью ЦС, которая может быть проверена с помощью расшифровки закрытой части сертификата с использованием открытого ключа ЦС, который является общедоступным.
Программирование хеш-функций в Delphi
СистемаDelphiобращается к встроенным средствам операционной системы Windows для программирования различных функций хеширования, методов шифрования с использованием классической и двухключевой криптографии. Большинство этих средств содержится в библиотеках advapi32.dll и crypt32.dll, которые должны быть подключены к проекту Delphi. Для этого в проект приложения надо добавить модуль Wcrypt2.pas, который можно скачать по адресу
/zip/headerCryptoAPI.rar. Как воспользоваться этим модулем в проекте Delphi можно прочитать в статье Ю.Спектора
/asp/viewitem.asp?catalogID=1271.
Если нет необходимости использовать все возможности этих библиотек, то можно воспользоваться готовой программой для хеш-функции MD5 (см. прил.в конце).
Указания к выполнению лабораторной работе.
Лабораторная работа 4 состоит из двух частей, каждая из которых выполняется в одной форме Delphi.
- В первой части следует разработать клиент-серверное приложение для удаленной аутентификации пользователей на компьютере-сервере согласно номеру своего варианта. Для этого используйте разработку, выполненную в лабораторной работе 2.
- Во второй части надо выполнить написать приложение, представляющее работу Центра Сертификации X.509 по выдаче сертификатов X.509 другим пользователям сети по их запросам.
ВАРИАНТЫ ЗАДАНИЙ
Четные варианты. Разработать приложение, осуществляющее аутентификацию пользователей на основе слова-вызова.
Нечетные варианты. Разработать приложение, осущеставляющее аутентификацию пользователей на основе электронно-цифровой подписи, генерируемой с помощью метода RSA.
КОНТРОЛЬНЫЕ ВОПРОСЫ
- Что такое аутентификация? Перечислите основные методы аутентификации.
- Что такое хеш-преобразование? Перечислите основные свойства хеш-функций.
- В чем заключается аутентификация на основе слова-вызова?
- Что такое электронно-цифровая подпись? Как она формируется?
- Как выполняется проверка послания, подписанного ЭЦП?
- Что такое сертификация X.509? Каковые преимущества имеет аутентификация на основе сертификатов по сравнению с другими видами сертификации?
- Что входит в состав сертификата ?
- Какие основные фунции выполняется Центр Сертификации X.509?
- Сколько различных ключей используется в процедуре аутентификация на основе сертификатов, и каким образом распространяются эти ключи?
- Каким образом осуществляется проверка подлинности сертификата?
Приложение 1. Текст хеш-функции MD5.
Function md5(s:string):string;
var a:array[0..15] of byte;
i:integer; lenhi, lenlo: longword;
index: dword;
hashbuffer: array[0..63] of byte;
currenthash: array[0..3] of dword;
procedure burn;
begin
lenhi:= 0; lenlo:= 0; index:= 0;
fillchar(hashbuffer,sizeof(hashbuffer),0);
fillchar(currenthash,sizeof(currenthash),0);
end;
procedure init;
begin
burn; currenthash[0]:= $67452301;
currenthash[1]:= $efcdab89;
currenthash[2]:= $98badcfe;
currenthash[3]:= $10325476;
end;
function lrot32(a, b: longword): longword;
begin
result:= (a shl b) or (a shr (32-b));
end;
procedure compress;
var data: array[0..15] of dword;
a, b, c, d: dword;
Begin
move(hashbuffer,data,sizeof(data));
a:= currenthash[0]; b:= currenthash[1];
c:= currenthash[2]; d:= currenthash[3];
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 0] + $d76aa478,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 1] + $e8c7b756,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[ 2] + $242070db,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[ 3] + $c1bdceee,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 4] + $f57c0faf,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 5] + $4787c62a,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[ 6] + $a8304613,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[ 7] + $fd469501,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[ 8] + $698098d8,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[ 9] + $8b44f7af,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[10] + $ffff5bb1,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[11] + $895cd7be,22);
a:= b + lrot32(a + (d xor (b and (c xor d))) + data[12] + $6b901122,7);
d:= a + lrot32(d + (c xor (a and (b xor c))) + data[13] + $fd987193,12);
c:= d + lrot32(c + (b xor (d and (a xor b))) + data[14] + $a679438e,17);
b:= c + lrot32(b + (a xor (c and (d xor a))) + data[15] + $49b40821,22);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 1] + $f61e2562,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[ 6] + $c040b340,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[11] + $265e5a51,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 0] + $e9b6c7aa,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 5] + $d62f105d,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[10] + $02441453,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[15] + $d8a1e681,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 4] + $e7d3fbc8,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[ 9] + $21e1cde6,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[14] + $c33707d6,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[ 3] + $f4d50d87,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[ 8] + $455a14ed,20);
a:= b + lrot32(a + (c xor (d and (b xor c))) + data[13] + $a9e3e905,5);
d:= a + lrot32(d + (b xor (c and (a xor b))) + data[ 2] + $fcefa3f8,9);
c:= d + lrot32(c + (a xor (b and (d xor a))) + data[ 7] + $676f02d9,14);
b:= c + lrot32(b + (d xor (a and (c xor d))) + data[12] + $8d2a4c8a,20);
a:= b + lrot32(a + (b xor c xor d) + data[ 5] + $fffa3942,4);
d:= a + lrot32(d + (a xor b xor c) + data[ 8] + $8771f681,11);
c:= d + lrot32(c + (d xor a xor b) + data[11] + $6d9d6122,16);
b:= c + lrot32(b + (c xor d xor a) + data[14] + $fde5380c,23);
a:= b + lrot32(a + (b xor c xor d) + data[ 1] + $a4beea44,4);
d:= a + lrot32(d + (a xor b xor c) + data[ 4] + $4bdecfa9,11);
c:= d + lrot32(c + (d xor a xor b) + data[ 7] + $f6bb4b60,16);
b:= c + lrot32(b + (c xor d xor a) + data[10] + $bebfbc70,23);
a:= b + lrot32(a + (b xor c xor d) + data[13] + $289b7ec6,4);
d:= a + lrot32(d + (a xor b xor c) + data[ 0] + $eaa127fa,11);
c:= d + lrot32(c + (d xor a xor b) + data[ 3] + $d4ef3085,16);
b:= c + lrot32(b + (c xor d xor a) + data[ 6] + $04881d05,23);
a:= b + lrot32(a + (b xor c xor d) + data[ 9] + $d9d4d039,4);
d:= a + lrot32(d + (a xor b xor c) + data[12] + $e6db99e5,11);
c:= d + lrot32(c + (d xor a xor b) + data[15] + $1fa27cf8,16);
b:= c + lrot32(b + (c xor d xor a) + data[ 2] + $c4ac5665,23);
a:= b + lrot32(a + (c xor (b or (not d))) + data[ 0] + $f4292244,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[ 7] + $432aff97,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[14] + $ab9423a7,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[ 5] + $fc93a039,21);
a:= b + lrot32(a + (c xor (b or (not d))) + data[12] + $655b59c3,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[ 3] + $8f0ccc92,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[10] + $ffeff47d,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[ 1] + $85845dd1,21);
a:= b + lrot32(a + (c xor (b or (not d))) + data[ 8] + $6fa87e4f,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[15] + $fe2ce6e0,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[ 6] + $a3014314,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[13] + $4e0811a1,21);
a:= b + lrot32(a + (c xor (b or (not d))) + data[ 4] + $f7537e82,6);
d:= a + lrot32(d + (b xor (a or (not c))) + data[11] + $bd3af235,10);
c:= d + lrot32(c + (a xor (d or (not b))) + data[ 2] + $2ad7d2bb,15);
b:= c + lrot32(b + (d xor (c or (not a))) + data[ 9] + $eb86d391,21);
inc(currenthash[0],a); inc(currenthash[1],b);
inc(currenthash[2],c); inc(currenthash[3],d);
index:= 0; fillchar(hashbuffer,sizeof(hashbuffer),0);
end;
procedure update(const buffer; size: longword);
varpbuf: ^byte;
Begin
inc(lenhi,size shr 29); inc(lenlo,size*8);
if lenlo< (size*8) then inc(lenhi);
pbuf:= @buffer;
while size> 0 do
begin
if (sizeof(hashbuffer)-index)<= dword(size) then
begin
move(pbuf^,hashbuffer[index],sizeof(hashbuffer)-index);
dec(size,sizeof(hashbuffer)-index);
inc(pbuf,sizeof(hashbuffer)-index);
compress;
end
else
begin
move(pbuf^,hashbuffer[index],size);
inc(index,size); size:= 0;
end; end; end;
procedure final(var digest);
Begin
hashbuffer[index]:= $80;
if index>= 56 then compress;
pdword(@hashbuffer[56])^:= lenlo;
pdword(@hashbuffer[60])^:= lenhi; compress;
move(currenthash,digest,sizeof(currenthash)); burn;
End;
Begin
init; update(s[1],length(s));
final(a); result:='';
for i:=0 to 15 do
result:=result+inttohex(a[i],0);
burn;
End;
ЛИТЕРАТУРА:
- С.Г.Баричев, В.В.Гончаров, Р.Е.Серов. Основы современной криптографии – Москва, Горячая линия – Телеком, 2001
- А.В.Беляев. "Методы и средства защиты информации" (курс лекций). /internet/infsecure/index.shtml
- А. А. Болотов, С. Б. Гашков, А. Б. Фролов, А. А. Часовских, «Алгоритмические основы эллиптической криптографии». Учебное пособие. М.: Изд-во МЭИ. 2000 г., 100 с.
- А.Володин. «Кто заверит ЭЦП», журнал «Банковские системы», ноябрь 2000, /system/2000-11/04.html
- Т.Илонен. Введение в криптографию (Ylonen Tatu. Introduction to Cryptography), /psw/crypto/intro.html
- Ш.Т. Ишмухаметов. Технологии защиты информации в сети, Казань, 2008, 91 с. /files/e9zxcqos9
- Н.Коблиц. Теория чисел и криптография, М.:, ТВР, 2001 http://gabro.ge/biblio/0708/0081/file/Cryptography/Koblic_-_Teoriya_Chisel_i_Cryptografiya.rar
- О.Р. Лапонина. Криптографические основы безопасности, курс Интернет-университета, /department/security/networksec
- Р.Лидл, Г.Нидеррайтер. Конечные поля, в 2 т., пер.с англ., М.: Мир, 1998, 438 с.
- А.А. Молдовян, Н.А. Молдовян, Б.Я. Советов. Криптография. М., Лань, 2001
- А.А. Молдовян, Н.А. Молдовян, Введение в криптосистемы с открытым ключом, БХВ-Петербург, 2005, с. 286 /vvedenie_v_kriptosistemy_s_otkrytym_klyuchom
- А.Г.Ростовцев. Алгебраические основы криптографии, СПб, Мир и Семья, 2000.
- А.Г.Ростовцев, Е.Б.Маховенко. Теоретическая криптография. – СПб.: АНО, ПО “Профессионал”, 2005,/index.php?newsid=1265
- Г.Семенов. «Цифровая подпись. Эллиптические кривые».
http://www.morepc.ru/security/crypt/os200207010.html?print
14. В.Столлингс. Основы защиты сетей. Приложения и стандарты, М.: Вильямс, 2002, 429 с.
- Брюс Шнайер. Прикладная криптография, 2-е издание: протоколы, алгоритмы и исходные тексты на языке С, /psw/crypto/appl_rus/appl_cryp.htm
- Dr. Michael Ganley, Thales eSecurity Ltd. Метод эллиптических кривых, /rsp/eliptic_curve_cryptography.htm
- В.М.Фомичев. Дискретная математика и криптология, Диалог-МИФИ, 2003, 399 с.
- Сайт Криптографический ликбез - http://www.ssl.stu.neva.ru/psw/crypto.html
- Jovan Dj. Golic. Cryptanalysis of Alleged A5 Stream Cipher, Beograd, Yugoslavia, /a5-hack.htm
- Ю. Спектор. Использование инструментов криптографии в Delphi-приложе-ниях, /asp/viewitem.asp?catalogID=1271