Спонсор: Microsoft
Опубликован: 25.06.2010 | Уровень: специалист | Доступ: платный
Лекция 7:

Криптографические функции в .NET Framework

< Лекция 6 || Лекция 7 || Лекция 8 >
Аннотация: В данной лекции .NET Framework изучается с точки зрения программиста, реализующего функции безопасности в корпоративных приложениях
Ключевые слова: cryptography, поток, генератор псевдослучайных чисел, криптография, ПО, расширяемость, объектная модель, .NET Framework, CryptoAPI, пространство имен, security, Common Language Runtime, CLR, доступ, криптографический сервис, шифр, целостность, аутентификация, ASP.NET, сборка, DLL, шифрование, XML, ACL, списки управления доступом, DPAPI, PKCS, pattern, наследование, иерархия классов, хеширование, иерархия, базовый класс, абстрактный класс, интерфейс, hashing algorithm, класс, суффикс, криптопровайдер, управляемый код, Rijndael, потенциальный ключ, алгоритмы шифрования, симметричность, асимметричное шифрование, потоковая модель, цифровой сертификат, хранилище сертификатов, w3c, CMS, cryptographic, messaging, syntax, standardization, открытый ключ, определение категории, абстрактный метод, родительский класс, CNG, абстракция, симметричное шифрование, свойство класса, i-mode, 'padding', Visual Studio, beta, эллиптические кривые, диск, stream, секретный ключ, объект, вектор, инициализация, блок данных, ключ, криптосистема, разрядность, генерация ключей, RSA, модуль, Произведение, место, криптографическая система, алгоритм, функция, полином, генератор, односторонняя функция, множества, t-бит, псевдослучайная последовательность, случайная величина, аппаратные средства, операции, компромисс, пароль, значение, определение
Презентацию к лекции Вы можете скачать здесь.

Цель лекции

  • Изучить основные элементы пространства имен Cryptography
  • Рассмотреть принципы работа с потоками
  • Познакомиться с особенностями реализации и использования генераторов псевдослучайных чисел

Пространство имен Cryptography в .NET Framework

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

Криптографическая объектная модель .NET Framework разработана с учетом этих требований. .NET Framework включает набор криптографических сервисов, расширяющих аналогичные сервисы Windows через CryptoAPI. Пространство имен System.Security.Cryptography общеязыковой исполняющей среды ( common language runtime, CLR ) в Microsoft .NET открывает программный доступ к самым разнообразным криптографическим сервисам, с помощью которых приложения могут шифровать и дешифровать данные, обеспечивать их целостность, а также обрабатывать цифровые подписи и сертификаты [10.1]. Некоторые из таких сервисов применяются непосредственно в самой .NET Framework (например, для поддержки аутентификации в ASP.NET ). Пространство имен System.Security.Cryptography разделено между двумя сборками - mscorlib.dll и System.Security.dll, причем сборка mscorlib.dll неявно подключается по умолчанию и предоставляет классы с алгоритмами таких операций, как шифрование и создание хешей, а дополнительно подключаемая сборка System.Security.dll позволяет получить доступ к функциональности, связанной с XML -подписью, модификацией ACL (списков управления доступом в Windows ), использованием интерфейса DPAPI, созданием кодов аутентификации на основе хешированных ключей ( HMAC ) и др.

Пространство имен System.Security.Cryptography включает дочерние пространства имен ( Xml, X509Certificates, PKCS ) и на самом высоком уровне может быть разбито на пять основных частей (табл. 10.1) [10.2]. Главное предназначение этого пространства - предоставлять классы с алгоритмами таких операций, как шифрование и создание хешей. Категория алгоритмов реализуется на основе расширяемого шаблона ( pattern ) [10.3], включающего два уровня наследования. На рис. 10.1 приведен фрагмент иерархии классов для алгоритмов хеширования. На вершине иерархии располагается абстрактный базовый класс, имя которого соответствует типу алгоритма (здесь - HashAlgorithm ). От базового абстрактного класса наследуется абстрактный класс второго уровня, предоставляющий открытый интерфейс для использования данного алгоритма. Например, SHA1 ( Secure Hash Algorithm ) представляет собой производный от HashAlgorithm класс и содержит методы и свойства, специфичные для алгоритма SHA1. Наконец, сама реализация алгоритма является производной от класса второго уровня; именно ее экземпляр создается и используется клиентским приложением. Криптографические библиотеки, прилагаемые к .NET Framework 2.0 и 3.0, предоставляют множество управляемых реализаций алгоритмов, а также классы-"обертки" для встроенных реализаций из CryptoAPI. К именам неуправляемых реализаций обычно добавляется суффикс " CryptoServiceProvider " (например, SHAlCryptoServiceProvider ), указывающий на то, что данная реализация на самом деле предоставляется криптопровайдером. В имена управляемых реализаций включается суффикс " Managed " (например, SHAlManaged ). Такие реализации не опираются на CryptoAPI и содержат исключительно управляемый код.

Наличие общего абстрактного класса позволяет унифицировать доступ к свойствам и методам, специфичным для каждого типа алгоритмов. Например, для класса Rijndael свойство LegalKeySizes вернет значения 128, 192, и 256, соответствующие разрядности ключей, для которых определен данный криптоалгоритм; метод IsWeakKey абстрактного класса TripleDES позволяет получить информацию о криптостойкости потенциального ключа, сверяя его со списком известных слабых ключей.

Таблица 10.1. Основные элементы пространства имен Cryptography
Категория Описание
Алгоритм шифрования Набор классов, применяемых для реализации алгоритмов симметричного и асимметричного шифрования, а также хеширования
Вспомогательные классы Классы, обеспечивающие генерацию криптографически стойких последовательностей псевдослучайных чисел, выполнение преобразований, взаимодействие с хранилищем CryptoAPI и шифрование на основе потоковой модели
Сертификаты X.509 Классы, определенные в пространстве имен System.Security.Cryptography.X509Certificates и предоставляющие цифровые сертификаты и (начиная с . NET 2.0 ) классы для доступа к хранилищу сертификатов Windows
Цифровые подписи XML Классы, определенные в пространстве имен System.Cryptography.Xml и предоставляющие цифровые подписи в XML -документах в соответствии со стандартами, опубликованными консорциумом W3C
CMS / PKCS#7 Начиная с версии .NET 2.0, осуществляется управляемая поддержка упакованных CMS / PKCS сообщений непосредственно от вызовов неуправляемого кода. ( CMS - Cryptographic Message Syntax - синтаксис криптографических сообщений, PKCS - Public-Key Cryptography Standard - стандарт шифрования с открытым ключом [10.3, 10.6])

Расширения криптографической объектной модели могут быть двух типов [10.5]:

  • Добавление новой реализации криптоалгоритма, уже определенного в .NET Framework ;
  • Добавление нового криптоалгоритма.

Чтобы добавить поддержку нового типа алгоритмов, необходимо создать новый абстрактный класс. Родительским классом для него может быть один из классов SymmetricAlgorithm, AsymmetricAlgorithm или HashAlgorithm. Затем нужно определить набор свойств и методов, общих для всех реализаций алгоритмов. Добавить новую реализацию в .NET Framework просто - для этого нужно создать класс-наследник абстрактного класса алгоритмов определенной категории, содержащий конкретную реализацию абстрактных методов родительского класса.

Алгоритмы хеширования: иерархия классов

увеличить изображение
Рис. 10.1. Алгоритмы хеширования: иерархия классов

В некотором смысле работа с CNG значительно проще, чем работа с управляемыми криптографическими классами, поскольку приходится заботиться о меньшем числе абстракций и наследуемых свойств по умолчанию. Эффективность зависит от аккуратности программиста в обращении с каждым отдельным элементом. Дело в том, что иногда случаях криптографические классы .NET Framework по умолчанию используют неподходящие свойства алгоритма, что может привести к неполадкам. Чтобы этого избежать, необходимо установить соответствие между каждым отдельным свойством ключа CNG и его управляемого эквивалента [10.6]. При выполнении симметричного шифрования, поскольку выполняется подготовка для обмена зашифрованным текстом между CNG и .NET Framework, следует помнить о следующих свойствах класса .NET Framework SymmetricAlgorithm: BlockSize, IV, Key, KeySize, Mode и Padding. Даже небольшая неправильность в одном из них приведет к сбоям. Обеспечение асимметричного шифрования, работающего с разными реализациями, требует несколько большего объема работы, поскольку разные алгоритмы используют самые разные свойства; поэтому поиском общего списка свойств для установления соответствия не удастся добиться результата. Вместо этого необходимо сосредоточиться на том, как разные реализации выполняют импорт и экспорт информации о ключах, и самостоятельно обеспечить необходимое преобразование.

Microsoft работает над следующей версией Visual Studio под кодовым названием "Orcas" (на момент написания статьи доступна версия Beta 2 ) и новой версией .NET Framework [10.6]. В среду .NET Framework 3.5 включен ряд новых реализаций алгоритмов, основанных на CNG ; к ним относятся некоторые алгоритмы эллиптических кривых, предоставляемые посредством функций CNG, обеспечивающих хранение ключей. Кроме того, .NET Framework 3.5 предоставляет более развитые возможности взаимодействия между встроенным и управляемым кодом.

Работа с потоками

CLR использует модель программирования, основанную на потоках [10.1]. Распространенным сценарием является необходимость криптографического преобразования бинарного потока данных перед записью на диск или передаче по сетевому соединению. .NET Framework позволяет реализовать такие преобразования с использованием класса CryptoStream и объектов, реализующих интерфейс ICryptoTransform. Класс CryptoStream унаследован от System.IO.Stream.

Модель ICryptoTransform представлена на рис. 10.2. ICryptoTransform соответствует математическому преобразованию над блоком данных фиксированной длины - например, шифрованию секретным ключом.

Модель ICtyptoTransform

Рис. 10.2. Модель ICtyptoTransform

Все классы криптоалгоритмов включают методы для создания объектов, реализующих интерфейс ICryptoTransform. В частности, SymmetricAlgorithm имеет два метода - CreateEncryptor () и CreateDecryptor (), которые позволяют создать объект ICryptoTransform на базе ключевого материала, вектора инициализации и режима работы, указанного для данного экземпляра класса криптоалгоритма.

Преобразование реализуется посредством "заворачивания" входного потока в ICryptoTransform с использованием класса CryptoStream. На рис. 10.3 [10.5] представлен поток данных, который в реальном времени читается из CryptoStream. CryptoStream сам по себе является потоком, но его содержимое генерируется путем последовательного применения ICryptoTransform к блокам данных. CryptoStream использует буферизованный доступ, позволяя выполнять шифрование, не заботясь о размере блока для конкретного алгоритма.

Схема работы с потоками

Рис. 10.3. Схема работы с потоками

Генераторы псевдослучайных чисел

Качественный ключ, предназначенный для использования в рамках симметричной криптосистемы, представляет собой случайный двоичный набор. Если требуется ключ разрядностью n, в процессе его генерации с одинаковой вероятностью должен получаться любой из 2^n возможных вариантов. Генерация ключей для асимметричных криптосистем - процедура более сложная, т.к. ключи, применяемые в таких системах, должны обладать определенными математическими свойствами. Например, в случае системы RSA модуль шифрования представляет собой произведение двух больших простых чисел.

Генераторы случайных чисел - место, в котором часто ломаются криптографические системы [10.8]. Это означает, что, если для генерации ключей используется криптографический слабый алгоритм, независимо от используемого шифра вся система будет нестойкой.

Рассмотрим понятие криптографически стойкого генератора псевдослучайных кодов, или, для краткости, псевдослучайного генератора, которое было введено Блюмом и Микали [10.10]. Пусть g : \{0, 1\}^n \to \{0,1\}^{q(n)} - функция, вычислимая за полиномиальное от n время, q(n) - некоторый полином. Такая функция называется генератором. Генератор g является псевдослучайным [10.9], если порождаемые им последовательности неотличимы никаким полиномиальным вероятностным алгоритмом от случайных последовательностей той же длины q(n) . В 1989-1990 гг. Импальянцо, Левин и Луби [10.13] и Хостад [10.12] доказали, что псевдослучайные генераторы существуют тогда и только тогда, когда существуют односторонние функции.

Лучший способ генерации множества случайных битов - извлечение их из естественно случайных событий реального мира [10.14]. Генераторы псевдослучайных чисел . NET Framework используют в качестве начальной информации для генерации криптографически стойкой последовательности набор случайных значений, получаемых из разных частей операционной системы (см. [10.5]). Более высокое качество формирования псевдослучайных последовательностей обеспечивает наличие специальной аппаратуры, использующей события физической природы для получения случайных величин. В настоящее время некоторые процессоры имеют встроенные микросхемы, предназначенные для генерации случайных битов; псевдослучайные генераторы .NET Framework обеспечивают возможность использования таких аппаратных средств для повышения качества генерируемых последовательностей.

В объектной модели .NET Framework классы, реализующие функциональность генераторов псевдослучайных чисел, наследуются от класса RandomNumberGenerator. По умолчанию в качестве реализации класса RandomNumberGenerator используется класс RNGCryptoServiceProvider, который является оболочкой псевдослучайного генератора, предоставляемого Windows по CryptoAPI [10.15]. В отличие от класса System.Random в .NET Framework или функций rand () и random () в библиотеке языка C, псевдослучайный генератор CryptoAPI не создает воспроизводимых последовательностей. Иначе говоря, невозможно создать несколько экземпляров класса RNGCryptoServiceProvider, которые будут возвращать одинаковые последовательности псевдослучайных чисел.

Во многих приложениях пользователи хотели бы иметь возможность выполнять криптографические операции с использованием пароля в качестве ключа шифрования. Однако пароли, как правило, являются нестойкими криптографическими ключами, т.к. они не обладают достаточной случайностью и подвержены атакам методом перебора, оптимизированного с использованием знаний о пользователе (опробуются пароли, которые представляются наиболее вероятными). С другой стороны, пользователю трудно запомнить последовательность из случайных цифр. Чтобы найти компромисс между криптостойкими ключами и паролями, приемлемыми для пользователя, были разработаны алгоритмы извлечения из паролей материала, пригодного для использования при генерации ключей шифрования (см. [10.5]). Например, класс PasswordDeriveBytes .NET Framework реализует алгоритм, который является расширением алгоритма PBKDF 1, описанного в стандарте PKCS #5 v2.0 [10.16]. Этот алгоритм принимает на вход 4 параметра - пароль, значение Salt, количество итераций и тип алгоритма хеширования (термин Salt связан в основном с процессом хеширования - это некое случайное число, которое добавляется к хешируемому тексту, чтобы повысить надёжность хеша и предотвратить атаки по словарю). Алгоритм вычисляет хеш-функцию от комбинации пароля и значения Salt и в результате возвращает последовательность байтов, пройдя указанное количество итераций.

Краткие итоги

Рассмотрены основные элементы пространства имен Cryptography. Изучены принципы работы с потоками, важные с точки зрения необходимости криптографического преобразования бинарного потока данных перед записью на диск или передаче по сетевому соединению. Приведено определение генератора псевдослучайных чисел. Рассмотрены принципы реализации и использования генераторов псевдослучайных чисел на платформе . NET.

< Лекция 6 || Лекция 7 || Лекция 8 >
Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????

Денис Овчинников
Денис Овчинников
Россия
Павел Артамонов
Павел Артамонов
Россия, Москва, Московский университет связи и информатики, 2016