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

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

Хорев П.Б.

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

Введение

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

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

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

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

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

Реализации криптоалгоритмов RC4,MD2 иMD4 содержатся в разработанной группойTheMentalis.orgTeamи свободно распространяемой библиотекеCryptoLibrary[3]. Для ее использования в приложениях на языкеC# нужно подключить к проекту библиотеку Org.Mentalis.Security.dll (с помощью команды менюMicrosoftVisualStudioProject|AddReference| вкладкаBrowse) и добавить к используемым в приложении пространствам именOrg.Mentalis.Security.Cryptography:

using Org.Mentalis.Security.Cryptography;

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

Реализация алгоритма симметричного потокового шифрования RC4 представлена в библиотекеCryptoLibraryабстрактным классомRC4 (наследником стандартного класса библиотекиFCLSymmetricAlgorithm) и его наследниками ‒ классами 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);

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

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

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

Для вывода сеансового ключа из парольной фразы удобно использовать стандартный класс библиотеки FCLPasswordDeriveBytesи его метод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);

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

При использовании для шифрования случайного сеансового ключа с его последующим экспортом и импортом следует использовать стандартные классы библиотеки FCLRSACryptoServiceProvider(реализация алгоритма асимметричного шифрования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 в библиотекеCryptoLibraryпредставлена абстрактным классом MD4 (наследником стандартного абстрактного класса библиотекиFCLHashAlgorithm) и его наследником – классом MD4CryptoServiceProvider. Реализация алгоритма хеширования MD2 в библиотекеCryptoLibraryпредставлена абстрактным классом MD2 (наследником стандартного абстрактного класса библиотеки FCLHashAlgorithm) и его наследником – классом MD2CryptoServiceProvider.

Использование этих классов в приложениях на языке C# не имеет особых отличий от использования стандартных криптографических классов библиотекиFCLс реализацией алгоритмов хеширования (MD5CryptoServiceProvider, RIPEMD160Managed и др.). При вычислении и проверке электронной цифровой подписи (ЭЦП) классы MD4CryptoServiceProvider и MD2CryptoServiceProvider могут использоваться совместно с классами RSAPKCS1SignatureFormatter (вычисление ЭЦП по алгоритмуRSA) и RSAPKCS1SignatureDeformatter (проверка ЭЦП по алгоритмуRSA).

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