Криптографические средства Microsoft .NET

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

а на false ключевая пара более не хранится в контейнере, но остается доступной в самом объекте класса RSACryptoServiceProvider до его уничтожения. Для уничтожения ключевой пары необходимо создать экземпляр класса RSACryptoServiceProvider с заданным именем контейнера, изменить параметр PersistKeyInCsp на false и очистить ресурсы, используемые объектом класса, вызвав метод Clear.

Класс RSACryptoServiceProvider позволяет подписывать пользовательские данные. Для этого могут быть использованы следующие методы:

SignHash(byte[] hash, OID AlgOID);

SignData(byte[] data, HashAlgirithm hm).

Подписываемые данные или значение хеша данных должны быть представлены в виде массива байт.

Первый метод позволяет подписывать значение хеша данных. Для этого перед созданием подписи требуется предварительно вычислить хеш подписываемых данных и передать в метод SignHash значение хеша и объектный идентификатор (OID) используемого алгоритма хеширования. Для этого при формировании подписи используется вспомогательный класс CryptoConfig. Он позволяет получать объектный идентификатор криптографического алгоритма, а также создавать экземпляр класса, реализующего криптографический алгоритм, по строковому идентификатору алгоритма.

Второй метод сам вычисляет значение хеша данных и подписывает его. Для его использования необходимо передать подписываемые данные в экземпляр класса, реализующего один из алгоритмов хеширования, т.е. в любой объект класса, наследуемого от класса HashAlgorithm. В этом случае значение хеша данных будет вычислено самим объектом класса RSACryptoServiceProvider.

Для проверки цифровой подписи используются методы VerifyHash и VerifyData.

Оба метода возвращают значение булевого типа. В случае действительности подписи возвращается значение true, в случае ее неверности - false.

Метод VerifyHash используется в случае, когда значение хеша данных вычислено ранее. При использовании метода VerifyData объект класса RSACryptoServiceProvider сам вычислит значение хеша с помощью объекта класса, реализующего алгоритм хеширования. В данном случае благодаря архитектуре криптографической библиотеки Microsoft .NET Framework вместо объекта класса SHA1Managed можно использовать объект класса SHA1CryptoServiceProvider. Несмотря на это результаты проверки подписи будут идентичными.

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

Ключи алгоритма RSA представляют собой набор математических величин: модуль, экспонента, коэффициенты D и Q. Открытым ключом служат значения модуля и экспоненты, а коэффициенты D и Q характеризуют секретный ключ. В структуре RSAParameters ключи хранятся в виде байтовых массивов. Имена переменных соответствуют именам параметров в алгоритме RSA. Например: (D,Q,ND,NQ, Modulus, Exponent). Для экспорта и импорта параметров используются методы ExportParameters и ImportParameters класса RSACryptoServiceProvider. Если при создании экземпляра класса задать имя контейнера и присвоить значение свойства PersistKeyInCsp = true, а затем с помощью метода ImportParameters задать новое значение ключа, то оно не будет сохранено в контейнере криптографического провайдера и при повторном запуске приложения будет использоваться ранее сгенерированная ключевая пара. При экспорте только открытого ключа задаются параметры Exponent и Modulus, а остальные параметры равны null.

 

1.3 Классы алгоритмов хеширования

 

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

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

Для вычисления значения криптографического хеша данных в библиотеке классов .NET Framework реализовано несколько классов. Часть из них использует вызовы криптографических функций Microsoft Crypto API, а часть реализовывает алгоритмы полностью на управляемом коде.

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

Класс SHA1CryptoServiceProvider при вычислении значения хеша использует метод Crypto API и обращается к криптографическому провайдеру.

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

SHA1Managed hash = SHA1Managed.Create();[] outputBytes = hash.ComputeHash(inputBytes);

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

Все реализации хэш-алгоритма MD5 наследуются от абстрактного класса MD5. Размер хэша для данного алгоритма составляет 128 бит. Методы ComputeHash класса MD5 возвращают хэш в вид