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

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Российский Государственный Социальный Университет

Факультет Информационных Технологий

Кафедра информационной безопасности

Курсовой проект

Дисциплина: Программно-аппаратная защита информации

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

Выполнил:

студент группы КЗИ-Д-4

Левин А.А.

Проверил:

Хорев П.Б.

Москва

2009

Введение

Microsoft. NET Framework — управляемая среда для разработки и исполнения приложений, обеспечивающая контроль типов. Среда контролирует все аспекты выполнения программы: выделяет память, отвечает за освобождение или повторное использование ресурсов, а также разрешает или запрещает программе выполнять те или иные действия. Microsoft. NET Framework состоит из двух основных компонент: библиотеки классов. NET Framework (FCL) и общеязыковой исполняемой среды (CLR — common language runtime). Основная задача CLR — выполнение программ. Среда отвечает за базовые функции, такие как компиляция кода, выделение памяти, управление потоками, проверка разрешений. Кроме того, CLR выполняет строгую проверку типов.

Библиотека классов. NET Framework содержит огромный набор классов. Типы из библиотеки являются полностью объектно-ориентированными и обеспечивают бесшовную интеграцию приложений, написанных на. NET Framework.

В Microsoft. NET Framework Class Library (FCL) существует достаточно большое число классов, созданных для криптографической защиты данных. По сравнению с Microsoft. NET Framework 1.1 версия 2.0 содержит гораздо большее число классов для поддержки использования криптографии с открытым ключом и инфраструктуры открытых ключей.

Библиотека классов в Microsoft. NET Framework организована в виде пространств имен. Пространство имен — это логическая группа, объединяющая типы со сходной функциональностью. Например, классы для работы с разрешениями на доступ, криптографией и защитой по правам доступа к коду находятся в пространстве имен System. Security. Все пространства имен библиотеки классов. NET Framework организованы в виде иерархической структуры. Корневым пространством имен является пространство имен System.

1. Обзор криптографических классов библиотеки Framework Class Libr

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

В пространстве имен System. Security. Cryptography содержатся вложенные пространства имен Xml и X509Certificates. Пространство имен System. Security. Cryptography. Xml включает классы, связанные с защитой Xml данных. Например, в нем присутствуют классы поддержки стандартов Xml Digital Signature и Xml Encryption.

В Microsoft. NET Framework существуют три основных разновидности криптографических классов:

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

— Асимметричные алгоритмы шифрования и подписи

— Алгоритмы вычисления значения хеша данных

В Microsoft. NET Framework 2.0 реализованы симметричные алгоритмы шифрования DES, Rijndael (AES), RC2, RC4. Асимметричные алгоритмы представлены только RSA и DSA. Из алгоритмов вычисления хеша данных реализованы SHA1, SHA256, MD5, MD4 и др. (Из вышеперечисленных алгоритмов DES, Rijndael (AES), RC2; RSA и DSA; SHA1, SHA256, MD5 реализованы в виде отдельных классов)

Криптографическая библиотека классов Microsoft. NET Framework спроектирована для поддержки максимальной гибкости в создании новых алгоритмов с помощью механизмов наследования. Иерархия классов, реализующих различные криптографические алгоритмы, содержит три уровня:

— Тип алгоритма (классы первого уровня).

— Класс алгоритма (классы второго уровня). Данные классы наследуются от классов первого уровня.

— На последнем уровне находятся классы, реализующие сами алгоритмы. Они наследуются от классов второго уровня.

Примерами классов первого уровня являются AsymmetricAlgorithm или HashAlgorithm. Классами второго уровня являются RSA или SHA1. Классы третьего уровня реализуют сами алгоритмы. В качестве примера можно привести классы RSACryptoServiceProvider или SHA1Managed. При этом класс RSACryptoServiceProvider, как следует из названия, обращается к криптографическому провайдеру, а класс SHA1Managed полностью реализован на управляемом коде. Таким образом, класс SHA1Managed наследуется от класса SHA1, который, в свою очередь, наследуется от класса HashAlgorithm. Такое устройство библиотеки дает широчайшие возможности по работе с криптографическими алгоритмами, позволяя обеспечить совместимость интерфейсов различных реализаций одного и того же криптографического алгоритма.

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

SymmetricAlgorithm представляет абстрактный базовый класс, от которого наследуются все реализации алгоритмов симметричного шифрования.

Классы блочных шифров, являющиеся производными класса SymmetricAlgorithm, используют режим сцепления, называемый сцеплением блоков шифртекста, в котором для осуществления криптографических преобразований данных используются ключ (Key) и вектор инициализации (IV). Чтобы расшифровать данные, зашифрованные с помощью одного из классов SymmetricAlgorithm, необходимо задать для свойств Key и IV значения, которые использовались при зашифровании. Для безопасного использования алгоритма симметричного шифрования необходимо, чтобы секретный ключ знали только отправитель и получатель.

RijndaelManaged, DESCryptoServiceProvider, RC2CryptoServiceProvider и TripleDESCryptoServiceProvider являются реализациями алгоритмов симметричного шифрования.

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

Все криптографические классы библиотеки. NET Framework, в объекты которых записываются конфиденциальные данные, реализуют метод Clear. При вызове метода Clear происходит обнуление всех конфиденциальных данных объекта с его последующим освобождением, чтобы он мог быть безопасно подобран сборщиком мусора. После обнуления и освобождения объекта необходимо вызвать метод Dispose с заданием для параметра disposing значения True, чтобы освободить все управляемые и неуправляемые ресурсы, связанные с этим объектом.

При наследовании от класса SymmetricAlgorithm необходимо переопределить следующие члены: CreateDecryptor, CreateEncryptor, GenerateIV и GenerateKey.

Свойство IV получает или задает вектор инициализации для алгоритма симметричного шифрования. Метод GenerateIV при переопределении в производном классе генерирует случайный вектор инициализации (IV), используемый для алгоритма. Этот метод используется для генерации случайного вектора инициализации, если он не задан. При каждом создании нового экземпляра одного из классов SymmetricAlgorithm или вызове метода GenerateIV вручную свойству IV автоматически присваивается новое случайное значение. Значения свойств IV и BlockSize должны иметь одинаковый размер (BlockSize получает или задает размер блока криптографической операции (в битах)). Свойство Key получает или задает секретный ключ для алгоритма. Допустимые размеры ключа задаются отдельно каждой реализацией алгоритма симметричного шифрования и перечисляются в свойстве LegalKeySizes. Если при использовании этого свойства оно имеет значение null, вызывается метод GenerateKey для создания нового случайного значения.

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

В библиотеке классов 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.

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

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

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

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

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

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

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

SHA1Managed hash = SHA1Managed. Create ();

byte[] outputBytes = hash. ComputeHash (inputBytes);

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

Все реализации хэш-алгоритма MD5 наследуются от абстрактного класса MD5. Размер хэша для данного алгоритма составляет 128 бит. Методы ComputeHash класса MD5 возвращают хэш в виде 16-байтового массива. Следует иметь в виду, что некоторые реализации MD5 формируют 32-символьные значения хэша в шестнадцатеричном формате. Для обеспечения совместимости с такими реализациями необходимо представлять значения, возвращаемые методами ComputeHash, в шестнадцатеричном формате.

2. Классы для шифрования и расшифрования данных

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

Для формирования зашифрованного сообщения используются классы, наследованные от класса AsymmetricKeyExchangeFormatter. Для расшифрования данных используются классы, наследованные от класса AsymmetricKeyExchangeDeformatter.

В версии Microsoft. NET Framework 2.0 реализованы два класса для шифрования секретных данных с помощью алгоритма RSA:

• RSAOAEPKeyExchangeFormatter,

• RSAPKCS1KeyExchangeFormatter;

и два класса для расшифрования:

• RSAOAEPKeyExchangeDeformatter,

• RSAPKCS1KeyExchangeDeformatter.

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

Классы используются для обмена секретной информацией с использованием алгоритма RSA. Для обмена данными классы используют формат PKCS #1.

Для шифрования данных с помощью класса RSAPKCS1KeyExchangeFormatter необходимо:

1) Создать экземпляр класса.

Определить открытый ключ для шифрования данных можно передав в качестве параметра конструктора объект, представляющий алгоритм RSA, содержащий открытый ключ или же вызвав метод SetKey. Кроме того, можно определить, какой датчик случайных чисел использовать при формировании зашифрованных данных. Если не определить свойство Rnd, то датчик используется по умолчанию.

2) Зашифровать ключевую информацию.

Для этого используется метод CreateKeyExchange. В качестве параметра он принимает данные, которые необходимые зашифровать.

Для расшифрования информации необходимо:

1) Создать экземпляр класса RSAPKCS1KeyExchangeDeformatter.

Определить секретный ключ можно аналогично классу RSAPKCS1KeyExchangeFormatter.

2) Расшифровать полученные данные.

Для этого необходимо вызвать метод DecryptKeyExchange, передав зашифрованные данные в качестве параметра.

2. 1 Классы для формирования и проверки цифровой подписи

В Microsoft. NET Framework 2.0 существуют специализированные классы, осуществляющие автоматическое формирование подписанного документа. Для формирования подписи служат классы, наследованные от класса Asymmetric SignatureFormatter. Для проверки цифровой подписи используются классы, наследованные от класса AsymmetricSignatureDeformatter.

В версии Microsoft. NET Framework 2.0 реализованы два класса для формирования цифровой подписи:

• DSASignatureFormatter,

• RSAPKCS1SignatureFormatter;

и два класса для проверки цифровой подписи:

• DSASignatureDeformatter,

• RSAPKCS1SignatureDeformatter.

Подпись формируется в формате PKCS#1 версии 1.5.

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

Для формирования цифровой подписи с использованием класса RSAPKCS1 SignatureFormatter необходимо:

1)Создать экземпляр класса RSAPKCS1SignatureFormatter.

Определить секретный ключ для формирования подписи можно передав в качестве параметра конструктора объект, представляющий алгоритм RSA, который содержит секретный ключ, или передав объект в метод SetKey.

2) Задать алгоритм вычисления значения хеша.

Это можно сделать с помощью метода SetHashAlgorithm. В качестве параметра он принимает название алгоритма. Например: «SHA1».

3)Сформировать подпись.

Для этого используется метод CreateSignature. В качестве параметра передается значение хеша подписываемых данных.

Для проверки подписи необходимо:

1)Создать экземпляр класса RSAPKCS1SignatureDeformatter.

Задать открытый ключ для проверки подписи можно аналогично заданию ключа для класса RSAPKCS1SignatureFormatter.

2) Задать алгоритм вычисления значения хеша.

3) Проверить подпись.

Для этой цели используется метод VerifySignature. В качестве параметров задается значение хеша документа и подпись значения хеша.

3. Примеры

Симметричное шифрование.

В примере кода для зашифрования файла, заданного строкой inName, используется класс RijndaelManaged с заданным свойством Key и вектором инициализации (IV), а результат зашифрования выводится в файл, заданный строкой outName. Параметры desKey и desIV, передаваемые в данный метод, представляют собой 8-байтовые массивы. Для выполнения этого примера необходимо наличие установленного пакета стойкого шифрования.

Язык Visual C++

void EncryptData (String^ inName, String^ outName, array< Byte>^rijnKey, array< Byte>^rijnIV)

{

//Create the file streams to handle the input and output files.

FileStream^ fin = gcnew FileStream (inName, FileMode: :Open, FileAccess: Read);

FileStream^ fout = gcnew FileStream (outName, FileMode: :OpenOrCreate, FileAccess: Write);

fout-> SetLength (0);

//Create variables to help with read and write.

array< Byte>^bin = gcnew array< Byte>(100);

long rdlen = 0; //This is the total number of bytes written.

long totlen = (long)fin-> Length; //This is the total length of the input file.

int len; //This is the number of bytes to be written at a time.

SymmetricAlgorithm^ rijn = SymmetricAlgorithm: :Create (); //Creates the default implementation, which is RijndaelManaged.

CryptoStream^ encStream = gcnew CryptoStream (fout, rijn-> CreateEncryptor (rijnKey, rijnIV), CryptoStreamMode: :Write);

Console: :WriteLine («Encrypting…»);

//Read from the input file, then encrypt and write to the output file.

while (rdlen < totlen)

{

len = fin-> Read (bin, 0, 100);

encStream-> Write (bin, 0, len);

rdlen = rdlen + len;

Console: :WriteLine («{0} bytes processed», rdlen);

}

encStream-> Close ();

fout-> Close ();

fin-> Close ();

}

Асимметричное шифрование

В примере кода показано, как реализовать пользовательский алгоритм асимметричного шифрования, наследуемый от класса AsymmetricAlgorithm. Для демонстрации порядка использования пользовательского класса приведен дополнительный класс.

Язык Visual C++

#using < System. Xml. dll>

#using < System. Security. dll>

using namespace System;

using namespace System: :Xml;

using namespace System: :Text;

using namespace System: :Security:Cryptography;

using namespace System: :Reflection;

[assembly: AssemblyKeyFile («CustomCrypto. snk»)];

[assembly: AssemblyVersion («1.0.0. 0»)];

[assembly: CLSCompliant (true)];

namespace Contoso

{

// Define a CustomCrypto class that inherits from the AsymmetricAlgorithm

// class.

public ref class CustomCrypto:

public System: :Security:Cryptography:AsymmetricAlgorithm

{

// Declare local member variables.

private:

CspParameters^ cryptoServiceParameters;

array< KeySizes^>^ customValidKeySizes;

// Initialize a CustomCrypto with the default key size of 8.

public:

CustomCrypto ()

{

customValidKeySizes =

gcnew array< KeySizes^>{gcnew KeySizes (8, 64, 8)};

this-> KeySize = 8;

}

// Initialize a CustomCrypto with the specified key size.

public:

CustomCrypto (int keySize)

{

customValidKeySizes =

gcnew array< KeySizes^>{gcnew KeySizes (8, 64, 8)};

this-> KeySize = keySize;

}

// Accessor function for keySizes member variable.

public:

property array< KeySizes^>^ LegalKeySizes

{

virtual array< KeySizes^>^ get () override

{

return (array< KeySizes^>^)customValidKeySizes->Clone ();

}

}

// Modify the KeySizeValue property inherited from the Asymmetric

// class. Prior to setting the value, ensure it falls within the

// range identified in the local keySizes member variable.

public:

property int KeySize

{

virtual int get () override

{

return KeySizeValue;

}

virtual void set (int value) override

{

for (int i = 0; i < customValidKeySizes-> Length; i++)

{

if (customValidKeySizes[i]-> SkipSize == 0)

{

if (customValidKeySizes[i]-> MinSize == value)

{

KeySizeValue = value;

return;

}

}

else

{

for (int j = customValidKeySizes[i]-> MinSize;

j <= customValidKeySizes[i]-> MaxSize;

j += customValidKeySizes[i]-> SkipSize)

{

if (j == value)

{

KeySizeValue = value;

return;

}

}

}

}

// If the key does not fall within the range identified

// in the keySizes member variable, throw an exception.

throw gcnew CryptographicException («Invalid key size. «);

}

}

// Initialize the parameters with default values.

public:

void InitializeParameters ()

{

cryptoServiceParameters = gcnew CspParameters ();

cryptoServiceParameters-> ProviderName = «Contoso»;

cryptoServiceParameters-> KeyContainerName = «SecurityBin1»;

cryptoServiceParameters-> KeyNumber = 1;

cryptoServiceParameters-> ProviderType = 2;

}

// Parse specified xmlString for values to populate the CspParams

// Expected XML schema:

// < CustomCryptoKeyValue>

// < ProviderName></ProviderName>

// < KeyContainerName></KeyContainerName>

// < KeyNumber></KeyNumber>

// < ProviderType></ProviderType>

// < /CustomCryptoKeyValue>

public:

virtual void FromXmlString (String^ xmlString) override

{

if (xmlString ≠ nullptr)

{

XmlDocument^ document = gcnew XmlDocument ();

document-> LoadXml (xmlString);

XmlNode^ firstNode = document-> FirstChild;

XmlNodeList^ nodeList;

// Assemble parameters from values in each XML element.

cryptoServiceParameters = gcnew CspParameters ();

// KeyContainerName is optional.

nodeList =

document-> GetElementsByTagName («KeyContainerName»);

if (nodeList-> Count > 0)

{

cryptoServiceParameters-> KeyContainerName =

nodeList-> Item (0)->InnerText;

}

// KeyNumber is optional.

nodeList = document-> GetElementsByTagName («KeyNumber»);

if (nodeList-> Count > 0)

{

cryptoServiceParameters-> KeyNumber =

Int32: :Parse (nodeList->Item (0)->InnerText);

}

// ProviderName is optional.

nodeList = document-> GetElementsByTagName («ProviderName»);

if (nodeList-> Count > 0)

{

cryptoServiceParameters-> ProviderName =

nodeList-> Item (0)->InnerText;

}

// ProviderType is optional.

nodeList = document-> GetElementsByTagName («ProviderType»);

if (nodeList-> Count > 0)

{

cryptoServiceParameters-> ProviderType =

Int32: :Parse (nodeList->Item (0)->InnerText);

}

}

else

{

throw gcnew ArgumentNullException («xmlString»);

}

}

// Create an XML string representation of the parameters in the

// current customCrypto object.

public:

virtual String^ ToXmlString (bool includePrivateParameters) override

{

String^ keyContainerName = ««;

String^ keyNumber = ««;

String^ providerName = ««;

String^ providerType = ««;

if (cryptoServiceParameters ≠ nullptr)

{

keyContainerName =

cryptoServiceParameters-> KeyContainerName;

keyNumber = cryptoServiceParameters-> KeyNumber. ToString ();

providerName = cryptoServiceParameters-> ProviderName;

providerType =

cryptoServiceParameters-> ProviderType. ToString ();

}

StringBuilder^ sb = gcnew StringBuilder ();

sb-> Append («<CustomCryptoKeyValue>»);

sb-> Append («<KeyContainerName>»);

sb-> Append (keyContainerName);

sb-> Append («</KeyContainerName>»);

sb-> Append («<KeyNumber>»);

sb-> Append (keyNumber);

sb-> Append («</KeyNumber>»);

sb-> Append («<ProviderName>»);

sb-> Append (providerName);

sb-> Append («</ProviderName>»);

sb-> Append («<ProviderType>»);

sb-> Append (providerType);

sb-> Append («</ProviderType>»);

sb-> Append («</CustomCryptoKeyValue>»);

return (sb-> ToString ());

}

// Return the name for the key exchange algorithm.

public:

property String^ KeyExchangeAlgorithm

{

virtual String^ get () override

{

return «RSA-PKCS1-KeyEx»;

}

}

// Retrieves the name of the signature alogrithm.

public:

property String^ SignatureAlgorithm

{

virtual String^ get () override

{

return «http: //www. w3. org/2000/09/xmldsig#rsa-sha1»;

}

}

// Required member for implementing the AsymmetricAlgorithm class.

protected:

virtual ~CustomCrypto ()

{

}

// Call the Create method using the CustomCrypto assembly name.

// The create function attempts to create a CustomCrypto

// object using the assembly name. This functionality requires

// modification of the machine. config file. Add the following

// section to the configuration element and modify the values

// of the cryptoClass to reflect what isinstalled

// in your machines GAC.

//< mscorlib>

// < cryptographySettings>

// < cryptoNameMapping>

// < cryptoClasses>

// < cryptoClass CustomCrypto="Contoso. CustomCrypto,

// CustomCrypto,

// Culture=neutral,

// PublicKeyToken=fdb9f9c4851028bf,

// Version=1.0. 1448. 27 640″ />

// < /cryptoClasses>

// < nameEntry name="Contoso. CustomCrypto"

// class="CustomCrypto" />

// < nameEntry name="CustomCrypto" class="CustomCrypto" />

// < /cryptoNameMapping>

// < /cryptographySettings>

//< /mscorlib>

public:

static CustomCrypto^ Create ()

{

return Create («CustomCrypto»);

}

// Create a CustomCrypto object by calling CrytoConfig’s

// CreateFromName method and casting the type to CustomCrypto.

// The create function attempts to create a CustomCrypto object

// using the assembly name. This functionality requires

// modification of the machine. config file. Add the following

// section to the configuration element and modify the values

// of the cryptoClass to reflect what is installed

// in your machines GAC.

//< mscorlib>

// < cryptographySettings>

// < cryptoNameMapping>

// < cryptoClasses>

// < cryptoClass CustomCrypto="Contoso. CustomCrypto,

// CustomCrypto,

// Culture=neutral,

// PublicKeyToken=fdb9f9c4851028bf,

// Version=1.0. 1448. 27 640″ />

// < /cryptoClasses>

// < nameEntry name="Contoso. CustomCrypto"

// class="CustomCrypto" />

// < nameEntry name="CustomCrypto" class="CustomCrypto" />

// < /cryptoNameMapping>

// < /cryptographySettings>

//< /mscorlib>

public:

static CustomCrypto^ Create (String^ algorithmName)

{

return (CustomCrypto^)

CryptoConfig: :CreateFromName (algorithmName);

}

};

}

Хэширование

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

Язык Visual C++

HashAlgorithm^ sha = gcnew SHA1CryptoServiceProvider;

array< Byte>^ result = sha-> ComputeHash (dataArray);

Заключение

класс криптографический framework шифрование

В данной работе были рассмотрены криптографические средства Microsoft. NET. Проведен обзор основных криптографических классов библиотеки Framework Class Libr, пространства имен System. Security. Cryptographу, изучена иерархия классов, реализующих различные криптографические алгоритмы. Основное внимание было направлено на три основных разновидности криптографических классов:

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

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

— Алгоритмы вычисления значения хеша данных

Проведен обзор основных алгоритмов шифрования, их свойства и методы, использующиеся в среде. NET Framework. Так же изучены такие аспекты, как шифрование и расшифрование данных, формирование и проверка цифровой подписи. Далее были рассмотрены примеры использования изучаемых средств на языке Visual C++ для трех основных разновидностей криптографических классов.

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

Список литературы

1. Данные портала http: //msdn. microsoft. com

2. Данные портала http: //www. interface. ru

3. Джеф Просиз. Программирование для Microsoft. NET. Москва. Microsoft Press (Русская редакция). 2003. 697 стр.

4. Курс лекций Учебного Центра безопасности информационных технологий Microsoft Московского инженерно-физического института (государственного университета)

ПоказатьСвернуть
Заполнить форму текущей работой