ЛАБОРАТОРНАЯ РАБОТА № 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 интерфейсы CryptoAPI и 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 (Secure 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!