Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
защита данных / RC4, MD2 и MD4 в MS Visual Studio.doc
Скачиваний:
49
Добавлен:
31.03.2015
Размер:
70.14 Кб
Скачать

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

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

using CryptoPro.Sharpei;

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

Реализация алгоритма симметричного блочного шифрования ГОСТ 28147-89 содержится в классе Gost28147CryptoServiceProvider, являющемся наследником абстрактного класса Gost28147, который, в свою очередь, является наследником стандартного абстрактного класса библиотеки FCLSymmetricAlgorithm.

Особенностью класса 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, который, в свою очередь, является наследником стандартного абстрактного класса библиотеки FCLAsymmetricAlgorithm.

Для экспорта сеансового ключа используется метод 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, являющимся наследником абстрактного стандартного класса библиотеки FCLHashAlgorithm, и его наследником – классом Gost3411CryptoServiceProvider.

Для вычисления кодов аутентификации сообщений, основанных на хешировании, и имитовставок (кодов аутентификации сообщений, основанных на симметричном шифровании) предназначены соответственно классы Gost3411HMAC (наследник абстрактного стандартного класса HMAC) и Gost28147ImitCryptoServiceProvider (наследник абстрактного класса Gost28147Imit, который, в свою очередь, является наследником абстрактного стандартного класса KeyedHashAlgorithm).

Соседние файлы в папке защита данных