Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хорев П. Б. Использование дополнительных криптографических классов в приложениях на языке C#

.pdf
Скачиваний:
91
Добавлен:
28.06.2014
Размер:
82.53 Кб
Скачать

ИСПОЛЬЗОВАНИЕ ДОПОЛНИТЕЛЬНЫХ КРИПТОГРАФИЧЕСКИХ КЛАССОВ В ПРИЛОЖЕНИЯХ НА ЯЗЫКЕ C#

Хорев П.Б.

(ФГБОУ ВПО Национальный исследовательский университет «МЭИ», ФГБОУ ВПО Российский государственный социальный университет, Москва, Россия)

Введение

Библиотека классов среды Microsoft .NET (Framework Class Library, FCL) включает множество классов, содержащих реализации основных криптографических алгоритмов (симметричного шифрования и расшифрования, обмена сеансовыми ключами симметричного шифрования, вычисления и проверки электронной цифровой подписи, хеширования) [1, 2]. Однако среди этих классов отсутствуют реализации многих криптоалгоритмов, необходимых разработчикам приложений для среды Microsoft .NET:

популярных алгоритмов шифрования и хеширования, реализации которых содержатся во входящих в состав операционной системы Microsoft Windows криптопровайдерах (симметричного потокового шифрования RC4, хеширования MD2 и MD4);

российских алгоритмов симметричного шифрования (определенного в ГОСТ 28147-89), электронной цифровой подписи (ГОСТ Р 34.10-2001), хеширования (ГОСТ Р 34.11-94).

Вданном докладе будут предложены способы использования дополнительных криптографических классов в приложениях для среды Microsoft .NET, разрабатываемых на языке программирования C#.

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

Реализации криптоалгоритмов RC4, MD2 и MD4 содержатся в разработанной группой The Mentalis.org Team и свободно распространяемой библиотеке Crypto Library [3]. Для ее использования в

приложениях на языке C# нужно подключить к проекту библиотеку

Org.Mentalis.Security.dll (с помощью команды меню Microsoft Visual Studio Project | Add Reference | вкладка Browse) и добавить к используемым в приложении пространствам имен Org.Mentalis.Security.Cryptography:

using Org.Mentalis.Security.Cryptography;

Документация по использованию классов библиотеки Crypto Library находится в свободно распространяемом файле справки Mentalis.org Security Library.chm.

Реализация алгоритма симметричного потокового шифрования RC4 представлена в библиотеке Crypto Library абстрактным классом RC4 (наследником стандартного класса библиотеки FCL SymmetricAlgorithm) и его наследниками ‒ классами RC4CryptoServiceProvider (реализация криптоалгоритма RC4 в неуправляемом коде, выполняемым криптопровайдером Windows) и ARCFourManaged (реализация RC4 в полностью управляемом средой Microsoft .NET коде).

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

SymmetricAlgorithm.

Чтобы «обойти» эту проблему в классах RC4CryptoServiceProvider и ARCFourManaged свойству Mode всегда должно быть присвоено значение OFB, а вектор инициализации всегда имеет длину один байт со значением

0.Переопределенный в этих классах метод GenerateIV является пустым.

Востальном использование классов RC4CryptoServiceProvider и ARCFourManaged практически ничем не отличается от использования стандартных классов библиотеки FCL с реализацией других алгоритмов симметричного шифрования (AesCryptoServiceProvider, AesManaged и др.).

Например, чтобы зашифровать по алгоритму RC4 файл, выбранное пользователем имя которого содержится в элементе формы TextBox с именем InputFName (имя зашифрованного файла находится в элементе OutputFName), можно использовать такой код:

RC4CryptoServiceProvider rc4CSP = new RC4CryptoServiceProvider(); ICryptoTransform encryptor = rc4CSP.CreateEncryptor(rc4CSP.Key,

rc4CSP.IV);

FileStream finStream = new FileStream(InputFName.Text, FileMode.Open); FileStream foutStream = new FileStream(OutputFName.Text,

FileMode.Create);

CryptoStream CrStream = new CryptoStream(foutStream, encryptor, CryptoStreamMode.Write);

byte[] bytes = new byte[finStream.Length]; int numBytesToRead = (int)finStream.Length;

int n = finStream.Read(bytes, 0, numBytesToRead); numBytesToRead = n;

CrStream.Write(bytes, 0, numBytesToRead);

При использовании симметричного шифрования есть две возможности создания и передачи (сохранения) сеансового ключа шифрования:

выводить сеансовый ключ из парольной фразы, которую нужно запомнить и ввести при расшифровании данных;

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

с помощью закрытого асимметричного ключа обмена.

Для вывода сеансового ключа из парольной фразы удобно использовать стандартный класс библиотеки FCL PasswordDeriveBytes и его метод CryptDeriveKey. Но при использовании этого способа для работы с реализациями криптоалгоритма RC4 возникает одна проблема. Первым параметром при вызове метода PasswordDeriveBytes должна быть строка с именем алгоритма симметричного шифрования, а третьим значение вектора инициализации для этого криптоалгоритма. Поскольку имя алгоритма RC4 является неизвестным для этого метода, потребуется указать имя другого криптоалгоритма, например, RC2. Но при этом значением третьего параметра нельзя будет указать имя вектора инициализации для объекта класса-наследника RC4, т.к. его длина равна 1 байту, а длина вектора инициализации для алгоритма RC2 должна быть равна длине блока.

Для преодоления этой проблемы придется создавать в приложении объект класса для криптоалгоритма RC2, например (элемент PassFrase1 содержит введенную парольную фразу, а массив randBytes – случайную примесь длиной 8 байт к выводимому ключу длиной 128 бит):

RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();

randBytes = new byte[8]; rand.GetBytes(randBytes);

byte[] pwd = Encoding.Unicode.GetBytes(PassFrase1.Text); RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); rc4CSP.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, rc2CSP.IV);

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

При использовании для шифрования случайного сеансового ключа с его последующим экспортом и импортом следует использовать стандартные классы библиотеки FCL RSACryptoServiceProvider (реализация алгоритма асимметричного шифрования RSA для обмена сеансовыми ключами), RSAOAEPKeyExchangeFormatter (класс для экспорта сеансового ключа) и RSAOAEPKeyExchangeDeformatter (класс для импорта сеансового ключа).

Никаких особенностей при использовании этих криптографических классов с классами RC4CryptoServiceProvider и ARCFourManaged нет,

например (объект класса RSAParameters используется для сохранения параметров асимметричного шифрования, включая закрытый ключ получателя):

ARCFourManaged rc4 = new ARCFourManaged(); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); RSAOAEPKeyExchangeFormatter keyEnc = new

RSAOAEPKeyExchangeFormatter(rsa);

byte[] sessionKey = keyEnc.CreateKeyExchange(rc4.Key); RSAParameters rsaPar = rsa.ExportParameters(true); RSAOAEPKeyExchangeDeformatter keyDec = new

RSAOAEPKeyExchangeDeformatter(rsa);

rsa.ImportParameters(rsaPar);

rc4CSP.Key = keyDec.DecryptKeyExchange(sessionKey);

Реализация алгоритма хеширования MD4 в библиотеке Crypto Library представлена абстрактным классом MD4 (наследником стандартного абстрактного класса библиотеки FCL HashAlgorithm) и его наследником классом MD4CryptoServiceProvider. Реализация алгоритма хеширования MD2 в библиотеке Crypto Library представлена абстрактным классом MD2 (наследником стандартного абстрактного класса библиотеки FCL HashAlgorithm) и его наследником классом MD2CryptoServiceProvider.

Использование этих классов в приложениях на языке C# не имеет особых отличий от использования стандартных криптографических классов библиотеки FCL с реализацией алгоритмов хеширования

(MD5CryptoServiceProvider, RIPEMD160Managed и др.). При вычислении и проверке электронной цифровой подписи (ЭЦП) классы

MD4CryptoServiceProvider и MD2CryptoServiceProvider могут использоваться совместно с классами RSAPKCS1SignatureFormatter (вычисление ЭЦП по алгоритму RSA) и RSAPKCS1SignatureDeformatter (проверка ЭЦП по алгоритму RSA).

Использование классов для российских криптоалгоритмов

Реализации криптоалгоритмов ГОСТ 28147-89, ГОСТ Р 34.10-2001 и ГОСТ Р 34.11-94 содержатся в разработанной компанией КриптоПро и распространяемой по лицензии библиотеке КриптоПро .NET SDK [4], требующей для своего использования установки криптопровайдера КриптоПро CSP [5]. Для использования КриптоПро .NET SDK в приложениях на языке C# нужно подключить к проекту библиотеку

CryptoPro.Sharpei.Base.dll (с помощью команды меню Microsoft Visual Studio Project | Add Reference | вкладка Browse) и добавить к используемым в приложении пространствам имен CryptoPro.Sharpei:

using CryptoPro.Sharpei;

Документация по использованию классов библиотеки КриптоПро .NET SDK находится в свободно распространяемом файле справки Sharpei.chm.

Реализация алгоритма симметричного блочного шифрования ГОСТ

28147-89 содержится в классе Gost28147CryptoServiceProvider,

являющемся наследником абстрактного класса Gost28147, который, в свою очередь, является наследником стандартного абстрактного класса библиотеки FCL SymmetricAlgorithm.

Особенностью класса Gost28147CryptoServiceProvider является то, что при попытке использования в приложении свойства объектов этого класса Key (сеансового ключа) всегда генерируется исключение CryptographicException. Поэтому для вывода сеансового ключа из парольной фразы и экспорта-импорта случайного сеансового ключа следует использовать иные способы, нежели при работе с другими классами с реализациями алгоритмов симметричного шифрования.

Для вывода сеансового ключа из парольной фразы следует использовать метод ByDeriveBytes класса Gost28147CryptoServiceProvider, например

(парольная фраза содержится в элементе формы с именем PassFrase1, а в массиве randBytes – случайная примесь длиной 8 байт): Gost28147CryptoServiceProvider gostCSP = new

Gost28147CryptoServiceProvider(); byte[] randBytes = new byte[8];

RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider(); rand.GetBytes(randBytes);

byte[] pwd = Encoding.Unicode.GetBytes(PassFrase1.Text); byte[] buf=new byte[pwd.Length+randBytes.Length]; pwd.CopyTo(buf,0);

randBytes.CopyTo(buf, pwd.Length); gostCSP.ByDeriveBytes(buf);

Если при выводе ключа из парольной фразы используется случайная примесь, ее следует сохранить с зашифрованными данными вместе с синхропосылкой (вектором инициализации).

Для обмена случайным сеансовым ключом с получателем зашифрованных данных используются классы GostKeyExchangeFormatter (экспорт сеансового ключа), GostKeyExchangeDeformatter (импорт сеансового ключа) и Gost3410CryptoServiceProvider (алгоритм асимметричного шифрования, используемый при обмене сеансовым ключом).

Класс Gost3410CryptoServiceProvider, содержащий реализацию алгоритма ЭЦП ГОСТ З 34.10-2001, является наследником абстрактного класса Gost3410, который, в свою очередь, является наследником стандартного абстрактного класса библиотеки FCL AsymmetricAlgorithm.

Для экспорта сеансового ключа используется метод

CreateKeyExchangeData класса GostKeyExchangeFormatter, а для импорта метод DecryptKeyExchangeData класса GostKeyExchangeDeformatter.

При использовании в приложении объектов класса Gost3410CryptoServiceProvider следует иметь в виду, что криптопровайдер КриптоПро CSP может хранить закрытые ключи пользователей на различных носителях. Выбор конкретного носителя (например, системного реестра Windows) возможен с помощью программы настройки КриптоПро CSP. На вкладке Оборудование окна настройки следует выбрать считыватели закрытых ключей. Добавление считывателя происходит в диалоге с мастером установки считывателя.

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

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

Рассмотрим пример экспорта и импорта сеансового ключа при использовании класса Gost28147CryptoServiceProvider (значение синхропосылки должно сохраняться отдельно). Объект класса CspParameters используется в примере для указания контейнера ключей из реестра при работе с криптопровайдером КриптоПро CSP, имеющего тип

75:

Gost28147CryptoServiceProvider gostEnc = new Gost28147CryptoServiceProvider();

CspParameters csp = new CspParameters(); csp.KeyContainerName = "Реестр"; csp.ProviderType = 75; Gost3410CryptoServiceProvider gostExch = new

Gost3410CryptoServiceProvider(csp); GostKeyExchangeFormatter keyEnc = new

GostKeyExchangeFormatter(gostExch);

byte[] sessionKey = keyEnc.CreateKeyExchangeData(gostEnc); byte[] IV = gostEnc.IV;

GostKeyExchangeDeformatter keyDec = new GostKeyExchangeDeformatter(gostExch);

gostEnc = (Gost28147CryptoServiceProvider)keyDec. DecryptKeyExchangeData(sessionKey);

gostEnc.IV = IV;

Реализация алгоритма хеширования ГОСТ 34.11-94 представлена абстрактным классом Gost3411, являющимся наследником абстрактного стандартного класса библиотеки FCL HashAlgorithm, и его наследником классом Gost3411CryptoServiceProvider.

Для вычисления кодов аутентификации сообщений, основанных на хешировании, и имитовставок (кодов аутентификации сообщений, основанных на симметричном шифровании) предназначены

соответственно классы Gost3411HMAC (наследник абстрактного стандартного класса HMAC) и Gost28147ImitCryptoServiceProvider (наследник абстрактного класса Gost28147Imit, который, в свою очередь, является наследником абстрактного стандартного класса

KeyedHashAlgorithm).

Заключение

Представлены способы использования в приложениях для среды Microsoft .NET дополнительных криптографических классов, содержащих реализации алгоритмов симметричного шифрования RC4 и ГОСТ 2814789, электронной цифровой подписи ГОСТ 34.10-2001, хеширования MD2, MD4 и ГОСТ 34.11-94.

Для использования алгоритмов RC4, MD2 и MD4 требуется подключение к проекту приложения свободно распространяемой библиотеки Crypto Library, а для использования российских криптоалгоритмов распространяемой по лицензии библиотеки КриптоПро .NET SDK, требующей установки криптопровайдера КриптоПро CSP.

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

ЛИТЕРАТУРА

1.Торстейнсон П., Ганеш Г.А. Криптография и безопасность в технологии .NET. М.:БИНОМ. Лаборатория знаний, 2007.

2.Хорев П.Б. Криптографические средства платформы MICROSOFT

.NET и их использование в инженерном образовании. Труды Международной научно-методической конференции «Информатизация инженерного образования» - ИНФОРИНО-2012 (Москва, 10-11.04.2012 г.). М.: Издательский дом МЭИ, 2012. Стр. 123-126.

3.Crypto Library. http://www.mentalis.org/soft/projects/crypto/.

4.КриптоПро .NET SDK. http://www.cryptopro.ru/products/net.

5.КриптоПро CSP. http://www.cryptopro.ru/products/csp/overview.