Классы алгоритмов асимметричного шифрования — КиберПедия 

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

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

2020-04-01 62
Классы алгоритмов асимметричного шифрования 0.00 из 5.00 0 оценок
Заказать работу

 

В библиотеке классов Microsoft.NET Framework существует только два класса, представляющих асимметричные криптографические алгоритмы. Это классы RSACryptoServiceProvider и DSACryptoServiceProvider. Оба класса присутствуют как в Microsoft.NET Framework версии 1.1, так и версии 2.0.

Алгоритм DSA может быть использован только для создания цифровой подписи, в то время как RSA дает возможность как подписывать, так шифровать данные. Оба класса реализованы как обертки для библиотеки Crypto API. Все криптографические операции выполняются в специальном криптографическом провайдере (CSP - Cryptographic Service Provider) в неуправляемом коде и результат передается в управляемый код. Для использования в.NET Framework других алгоритмов, реализованных в криптографических провайдерах, необходимо также написать класс-обертку, наследуемый от соответствующего класса второго уровня и обращаться с помощью интерфейсов Crypto API к функциям криптографического провайдера, преобразовывая входные и выходные данные.

Криптографические провайдеры могут генерировать ключи шифрования и хранить их в специализированных контейнерах. Для определения параметров работы с провайдером служит структура CspParameters. Данная структура применима ко всем классами, реализующим шифрование с использованием криптографических провайдеров. Структура задает имя контейнера для хранения ключей, номер ключа, идентификатор провайдера и некоторые другие параметры. При создании экземпляра класса RSACryptoServiceProvider с заданным именем контейнера для хранения ключевой пары вначале будет проверено, существует ли контейнер с данным именем и присутствует ли в нем ключевая пара. При наличии ключей новые ключи не будут сгенерированы. Если же контейнер или ключи отсутствуют, то будет создан новый контейнер и в него будет сгенерирована новая ключевая пара. Если не указывать имя контейнера, или же не указывать параметров при создании объекта класса RSACryptoServiceProvider, то будет сгенерирована новая ключевая пара, которая не будет храниться в контейнере криптографического провайдера. Если при создании объекта класса RSACrypto ServiceProvider указать имя контейнера, то ключевая пара будет содержаться в нем. Ключи хранятся в контейнере до тех пор, пока они не будут явно удалены. Таким образом, если задать имя нового криптографического контейнера, создать объект класса RSACryptoServiceProvider, сгенерировать ключевую пару и закрыть приложение, то ключи останутся в контейнере и при следующем запуске приложения ключевая пара может быть использована повторно.

Одной из проблем, возникающих при использовании контейнеров, является их уникальное именование. Для этих целей достаточно хорошим решением является их именование с помощью GUID (Global universal Identifier). Получить GUID можно, например, с помощью утилиты из Visual Studio.

За хранение ключей в контейнере криптографического провайдера отвечает свойство PersistKeyInCsp. По умолчанию свойство PersistKeyInCsp = true. Это означает, что новый ключ, сгенерированный в криптографическом провайдере, сохраняется в контейнере. При изменении параметра на 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.

 


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

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.