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

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

?чатель., 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. Это означает, что новый ключ, сгенерированный в криптографическом провайдере, сохраняется в контейнере. При изменении параметр