ЛАБОРАТОРНАЯ РАБОТА № 3. ХЭШИРОВАНИЕ И ЭЛЕКТРОННАЯ ЦИФРОВАЯ ПОДПИСЬ



ЦЕЛЬ РАБОТЫ:

1. Изучение методов формирования дайджеста сообщения (хэш-функции) и электронной цифровой подписи (ЭЦП);

2. Изучение реализаций хэш-функций и ЭЦП в среде  .NET Framework;

3. Реализация существующих хэш-функций и алгоритмов ЭЦП.

 

Теоретическое введение

Рассмотренные в предыдущей лабораторной работе асимметричные криптосистемы, использовались для достижения конфиденциальности.

Но существует еще одна сфера применения асимметрич­ных алгоритмов - это электронная цифровая подпись (ЭЦП), при помощи которой решаются задачи аутентификации, контроля целостности и подтверждения обяза­тельств.

В данной лабораторной работе   рассматривается принцип создания ЭЦП, изучается работа алгоритмов RSA и DSA для реализации ЭЦП. Оба данных алгоритма, RSA и DSA, полностью поддер­живаются в .NET Framework.

Технология ЭЦП требует использования еще одного криптографического примитива, известного, как «криптографический хеш». Наиболее часто используются хеш-алгоритмы SHA-1 и MD5. Ал­горитм SHA-1 создает 160-битовый хеш, а алгоритм MD5 - 128-битовый. Для достижения более высоких степеней безопасности могут использовать­ся SHA-256, SHA-384 и SHA-512, создающие, соответственно, значения размером 256, 384 и 512 бит. Все эти хеш-алгоритмы поддерживаются в .NET Framework  без установки каких-либо дополнительных компонентов. Причем, данные алгоритмы необходимо использовать еще до использования самой ЭЦП.

 

Требования, предъявляемые к хеш-функциям

Криптографические хеш-функции используются в технологии цифровой подписи потому, что они позволяют эффективно выявлять нарушения целостности сообщения. Хеш - это функция, кото­рая ставит в соответствие небольшой, фиксированного размера объем двоичных данных произвольному, сколь угодно большому объему вход­ных данных. Хеш называют также дайджестом сообщения или отпе­чатком пальца.

К хеш-функции предъявляются следующие требования:

1. Хорошая хеш-функция должна обладать очень низкой вероятностью того, что два разных варианта входных данных дадут в результате одина­ковые хеши.

2. Кроме того, для криптографической функции важно, чтобы она легко вычислялась. Здесь должен иметь место обычный компромисс между производительностью и достигаемым уровнем безопасности. Алгоритмы MD5, SHA-1, так же, как и SHA-256, SHA-384 и SHA-512 до­вольно эффективны, и их выбор позволяет установить баланс между производительностью и безопасностью. Самым быстрым алгоритмом яв­ляется MD5, но он обеспечивает самую низкую безопасность.

3. Желательно чтобы небольшие изменения в битах входных данных приводили к большим и непредсказуемым изменениям в вычис­ленном хеше. Это затрудняет задачу восстановления входных данных по выходным.

Хеш-алгоритмы, поддерживаемые в .NET

Две наиболее часто используемые криптографические хеш-функции -это SHA-1 (Secure Hash Algorithm, хеширующий криптографический алгоритм), опубликованный NIST в середине 1990-х, и MD5 (Message Digest, дайджест сообщения), разработанный Р. Ривестом в начале 1990-х. В добавление к этому было опубликовано несколько новых вер­сий SHA. Также для целей, связанных с аутентификацией сообщений, важную роль играет алгоритм ключевого хеша. Все упомянутые алгорит­мы поддерживаются в .NET Framework в форме классов, производных от HashAlgorithm:

· MD5;

· SHA1;

· SHA256;

· SHA384;

· SHA512;

· KeyedHashAlgorithm.

На рисунке 3.1 изображена иерархия классов хеш-алгоритмов. Иерар­хию возглавляет абстрактный класс HashAlgorithm, производный от класса Object. Производные абстрактные классы KeyedHashAlgorithm, MD5, SHA1, SHA256, SHA384 и SHA512 представляют часто используе­мые криптографические хеш-алгоритмы.

Так как  все это абстрактные классы, их невозможно использовать напрямую, создавая на их основе экземпляры объектов. Из каждого та­кого класса производятся конкретные классы реализации, которые уже используются напрямую. Классы, имена которых заканчиваются на CryptoServiceProvider, реализованы с использованием интерфейса CryptoAPI, предоставляемого операционной системой. Классы, имена которых заканчиваются на Managed, реализованы полностью средствами контролируемого С#-кода, без использования CryptoAPI.

Класс HMACSHA1 производит ключевой хеш (Keyed-Hash Message Authentication Code - код аутентификации сообщения при помощи клю­чевого хеша или НМАС) при помощи хеш-функции SHA-1.

Класс МАСТripleDES производит ключевой хеш НМАС при помощи шифрования TripleDES, использованного в качестве хеш-функции. Ключевой хеш НМАС похож на цифровую подпись в том смысле, что его тоже можно ис­пользовать для верификации аутентичности и целостности сообщения, однако его отличие заключается в том, что для подтверждения обяза­тельств его использовать нельзя. В то время как цифровая подпись пред­ставляет собой асимметричную схему, в которой только один из ключей хранится в секрете, ключевой хеш НМАС требует секретного хранения симметричного ключа у отправителя и получателя одновременно. Посколь­ку ключ известен более чем одной стороне, то любая третья сторона не смо­жет определить, кто из хранителей ключа создал хеш. Хеши HMAC меньше по размерам и вычисляются быстрее, чем цифровая подпись.

Хотя среда .NET допускает свободное расширение, и в ней можно использовать частные хеш-алгоритмы, реализованные в форме классов, производных от HashAlgorithm, рекомендуется этого не делать, так как для того чтобы достоверно подтвердить безопасность алгоритма, необходимо, чтобы он подвергся тщательному анализу многих экспертов на протяжении длительного времени.

Кроме хеш-алогритмов, поддержанных в .NET, не существует других алгоритмов, которые использовались бы в промышленности сколько-ни­будь широко. Реализованные в Microsoft Windows интерфейсы Crypto­API и CSP (поставщик услуг криптографии) поддерживают хеш-алгоритмы MD4, MD5 и SHA-1.

В среде .NET Framework не поддерживается MD4, поскольку поддержана его усовершенствованная версия MD5 (в MD4 была обнаружена критическая уязвимость, устраненная в MD5).  

Среда .NET Framework поддерживает алгоритмы SHA-256, SHA-384 и SHA-512, которые не поддержаны в CryptoAPI, поскольку являются относительно новыми стандартами.

Класс HashAlgorithm

Класс HashAlgorithm обладает внешним (public) свойством Hash, которое пред­ставляет собой байтовый массив, содержащий в себе вычисленный хеш.

Внешнее свойство HashSize содержит значение размера хеша в битах.

Наиболее важный внешний метод класса HashAlgorithm - метод ComputeHash, возвращающий значение хеша в виде байтового массива, вычисленное для заданных во входном параметре - байтовом массиве -входных данных.

В следующем фрагменте кода иллюстрируется применение класса HashAlgorithm на примере конкретного производного класса, инкапсулирующего алгоритм SHA-1. Предполагается, что входные данные уже существуют в форме байтового массива messageByteArray:

HashAlgorithm shal = new SHAlCryptoServiceProvider();

byte[] shalHash = shal.ComputeHash(messageByteArray);

 

Классы MD5 и SHA

Класс MD5 инкапсулирует алгоритм MD5, который производит 128-бито­вый хеш из входных данных произвольного размера. Алгоритм «дайдже­ста сообщения» MD5 определен стандартом RFC 1321. Этот алгоритм первоначально предназначался для приложений цифровой подписи, в ко­торых хеш (то есть дайджест сообщения) шифруется секретным ключом RSA.  MD5 является расширением алгоритма MD4 (опубликованного Ри-вестом в 1990), при этом, работая немного медленнее, он обеспечивает бо­лее высокий уровень безопасности.

Класс SHA1 инкапсулирует алгоритм SHA-1. Алгоритм SHA-1 мо­жет обрабатывать входные данные размером не более 264 бит, произво­дя при этом хеш размером 160 бит. Этот дайджест сообщения можно использовать в алгоритме ЭЦП DSA. Алгоритм SHA-1 был принят в качестве стандарта NIST под названием SHS (Secu­re Hash Standard - стандарт безопасного хеша), который опубликован в документе FIPS PUB 180-1. Причем, в документе FIPS PUB 180-1 утверждается, что алгоритм SHA-1 основан на принципах, сходных с принципами алгоритма дайджеста сообщения MD4. Таким образом, две наиболее широко используемых хеш-функции, MD5 и SHA-1, тесно связаны друг с другом.

Классы SHA256, SHA384 и SHA512 инкапсулируют набор родствен­ных хеш-алгоритмов, которые производят хеши размером 256, 384 и 512 бит. Эти новые алгоритмы, определенные документом FIPS PUB 180-2 в 2002 году, ведут свое происхождение от SHA-1. Они были созданы, посколь­ку со времени первоначальной публикации SHA-1 в 1993 году возникли опасения, что размер хеша в 160 бит не обеспечивает высоконадежной за­щиты на длительную перспективу. В то время как атака методом «грубой силы» на n-битовый симметричный алгоритм измеряется рабочим факто­ром, пропорциональным 2n, такая же атака на n-битовый криптографи­ческий хеш, измеряется рабочим фактором, пропорциональным 2n/2. Причина кроется в том, что атака «по дню рождения» (birthday attack) на хеш считается успешной, если найдены всего два варианта входных данных, дающих одинаковые хеши. Следовательно, рабочий фактор ата­ки на 160-битовый алгоритм SHA-1 пропорционален, практически, всего лишь 280. Это достаточно большое число, и такая атака, вероятно, недо­ступна почти для всех современных противников, но для критически важных случаев и в расчете на длительный период этот уровень безопас­ности, вероятно, уже недостаточен.

ПРИМЕЧАНИЕ

Выражение «атака по дню рождения» описывает метод «грубого» поиска коллизий для хеш-функции. Выражение это происходит из сценария в теории вероятности, который назы­вают «Проблемой дня рождения». Сценарий относится к вычислению вероятности того, что в случайной группе людей найдется два человека с одинаковыми днями рождения. Хотя, инту­итивно, такая вероятность кажется достаточно низкой, на самом деле минимальный размер группы, в которой эта вероятность будет равна 50%, составляет всего 23 человека

Новый стандарт симметричного шифрования AES, известный также под названием Rijndael, предусматривает три ва­рианта, отличающихся длиной ключа: AES-128, AES-192 и AES-256. Размеры хеша в алгоритме SHA (256, 384 и 512) в точности равны удвоенным длинам ключей в AES (128, 192, 256). По­скольку хеш уязвим для атаки методом «грубой силы» с рабочим факто­ром, равным половине рабочего фактора для атаки на симметричный шифр, такие размеры хеша точно уравнивают стойкость шифра и хеша. Это обстоятельство очень важно в случае, когда речь идет о криптографи­ческом протоколе, использующим симметричный шифр и хеш одновре­менно.

Стойкость протокола определяется стойкостью его самого слабого звена. Например, если используется очень сильный симметричный ал­горитм в сочетании со слабым хешем (или наоборот), противник сможет атаковать ту часть протокола, которая обладает наименьшей стойкостью. Фактически, было напрасно потрачено процессорное время и другие ресурсы на реализацию самого сильного звена. И напротив, если в про­токоле сочетаются алгоритмы равной стойкости, то без лишних затрат получается точно рассчитанный уровень безопасности.

 

Класс KeyedHashAlgorithm

Класс KeyedHashAlgorithm представляет собой вариацию на основе концепции обычного хеша, в которой хеш вычисляется не только на основе входных данных, но также на основе дополнительной информа­ции, играющей роль ключа. Алгоритм ключевого хеша, таким образом, представляет собой зависящую от ключа, одностороннюю хеш-функцию. Этот механизм удобен для аутентификации сообщения, поскольку создать или верифицировать такой хеш может лишь владелец ключа.

Та­ким образом, алгоритм ключевого хеша обеспечивает одновременно конт­роль целостности и аутентификацию между доверяющими друг другу сторонами, которые заблаговременно обменялись ключами.

Класс KeyedHashAlgorithm является абстрактным классом, из которого производят­ся классы HMACSHA1 и MACTripleDES. Эти классы инкапсулируют алгоритмы ключевого хеша, основанные на алгоритмах SHA-1 и TripleDES, соответственно.

Идентификаторы объектов

Программистам требуются системы (конвенции) по наименованию объектов, которые позволяют давать однозначные и всем понятные имена множеству различных протоколов, форматов данных и алгоритмов. Меж­дународный стандарт ASN.l OIDs (Object Identifiers - идентификаторы объектов) определен и поддерживается многими организациями, вклю­чая институт стандартов ANSI, и служит для формирования уникальных идентификаторов для компьютерных форматов, логически организован­ных в иерархию имен.

Существует большое число идентификаторов OID, идентифицирующих конкретные протоколы, алгоритмы и форматы дан­ных. В частности, большинство криптографических алгоритмов призна­ны институтом ANSI и получили уникальные идентификаторы OID.

Некоторые идентификаторы приведены в таблице 3.1. Ряд данных идентификаторов OID необходимо исполь­зовать в определенных методах классов .NET Security Framework таких, как методы SignHash и VerifyHash классов RSACryptoServiceProvider и DSACryptoServiceProvider.

 

Таблица 3.1. Идентификаторы ASN.1 OID для некоторых криптографических хеш-алгоритмов

Криптографический хеш-алгоритм OID
MD5 1.2.840.113549.2.5
SHA-1 1.3.14.3.2.26
SHA-2 562.16.840.1.101.3.4.2.1
SHA-3 842.16.840.1.101.3.4.2.2
SHA-5 122.16.840.1.101.3.4.2.3

В приведенном ниже  фрагменте кода показано, как идентификатор OID используется в качестве параметра метода SignHash класса RSACryptoServiceProvider. В примере  предполагается, что переменная (байтовый массив) hashbytes уже создана вызовом метода ComputeHash класса SHA1.

//создать объект RSA с ключом по умолчанию RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

//подписать хеш при помощи OID для алгоритма SHA-1

signaturebytes =rsa.SignHash(hashbytes, "1.3.14.3.2.26");

 

Электронная цифровая подпись

На рисунке 3.2 изображена общая схема применения ЭЦП.

В верхнем левом углу этой диаграммы берется исходное сообщение и создается 160-битовый хеш (дайджест сообщения) при помощи алгоритма SHA-1.

Затем дайджест сообщения шифруется при помощи секретного ключа, известного только его владельцу, то есть отправителю сообщения. Это шифрование не имеет своей целью обеспечение секретности, поскольку используется секретный ключ, и любой желаю­щий может расшифровать хеш, пользуясь общедоступным открытым клю­чом. Именно это и должен сделать получатель сообщения.

Результат этого шифрования и называют электронной цифровой подписью. Никто другой, кроме владельца секретного ключа, не сможет создать такую подпись, даже располагая оригиналом исходного сообщения. По тем же причинам никто не сможет изменить сообщение или создать поддельное сообщение так, чтобы обман не раскрылся.

 

 


В правом верхнем углу диаграммы подписанное сообщение формируется объединением исходного сообщения, его цифровой подписи и от­крытого ключа, соответствующего тому секретному ключу, которым шифровался хеш.

В таком виде подписанное сообщение пересылается по­лучателю. Из диаграммы также видно, что открытый ключ должен быть публично доступен. Эффективный способ обеспечения такого доступа - использование центра сертификации.

 

На рисунке 3.3 изображена  верификация полученного сообщения получателем.

 

 


Получатель хочет убе­диться в том, что сообщение действительно отправлено отправителем, а не кем-либо еще. Также получатель хочет убедиться в том, что по пути следования сообщение не было кем-то изменено.

В левом верхнем углу диаграммы полученное сообщение разбивается на три компоненты - на исходное сообщение, открытый ключ и цифро­вую подпись. Для того чтобы сравнить шифрованный хеш с сообщением, его необходимо заново вычислить. Если вновь вычисленный хеш совпа­дет с расшифрованным хешем, то можно быть уверенным (в весьма высо­кой степени), что сообщение не изменено с момента наложения подписи. И наоборот, если хеши не совпадут, это будет означать, что исходное со­общение повреждено или изменено каким-то образом.

Вычислив заново хеш сообщения, требуется сравнить его с ис­ходным хешем. В правом верхнем углу диаграммы показаны действия  с ЭЦП. Хеш зашифрован секретным ключом отправителя, и для расшифровки можно использовать при­лагающийся открытый ключ. Получатель извлекает открытый ключ и проверяет его - по крайней мере, в первый раз, - при помощи центра сер­тификации, играющего роль доверенной третьей стороны.

Если ключ ве­рифицирован успешно, он используется для дешифрования цифровой подписи и получения хеша, который теперь можно сравнить с хешем, ко­торый вычислен заново. Если хеши совпали, сообщение аутентично и не изменено. Предполагая, что секретный ключ отправителя никому более не доступен, можно сделать также вывод о подтверждении обязательств отправителя, вытекающем из его доказуемого авторства.

 

Стандарт DSS (Digital Signature Standard - Стандарт цифровой подписи), определенный документом FIPS PUB 186-2, предусматривает три  алгоритма подписи: DSA, RSA (как указано в стандарте ANSI X9.31) и Elliptic Curve DSA (DSA с эллиптическими кривыми). Алгоритм  Elliptic Curve DSA не поддержан в настоящее время в библиотеке классов .NET Security.


Дата добавления: 2018-08-06; просмотров: 948; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!