Отображение имен алгоритмов на криптографические классы
Обновлен: Ноябрь 2007
Существует четыре способа создания криптографического объекта с помощью SDK (пакет средств разработки программного обеспечения) для Windows:
создание объекта с помощью оператора new;
создание объекта, реализующего конкретный криптографический алгоритм, с помощью метода Create, относящегося к абстрактному классу данного алгоритма;
создание объекта, реализующего конкретный алгоритм шифрования, с помощью метода System.Security.Cryptography.CryptoConfig.CreateFromName;
создание объекта, реализующего класс алгоритмов шифрования (например, симметричный блочный шифр) с помощью метода Create , относящегося к абстрактному классу алгоритмов данного типа (например, SymmetricAlgorithm).
Предположим, что разработчику нужно вычислить хэш-код SHA1 для набора байтов. Пространство имен System.Security.Cryptography содержит две реализации алгоритма SHA1: одна — полностью управляемая реализация, другая оборачивает CryptoAPI. Разработчик может создать экземпляр конкретной реализации SHA1 (например, SHA1Managed class) с помощью оператора new. Однако если не имеет значения, какой класс загружается средой CLR в процессе реализации классом хэш-алгоритма SHA1, объект можно создать, вызвав метод System.Security.Cryptography.SHA1.Create. Этот метод вызывает метод System.Security.Cryptography.CryptoConfig.CreateFromName("System.Security.Cryptography.SHA1"), который возвращает реализацию хэш-алгоритма SHA1.
Разработчик может также вызвать System.Security.Cryptography.CryptoConfig.CreateFromName("SHA1"), поскольку по умолчанию конфигурация шифрования включает короткие имена для алгоритмов, поставляемых в комплекте .NET Framework.
Если используется произвольный хэш-алгоритм, разработчик может вызвать метод System.Security.Cryptography.HashAlgorithm.Create, возвращающий объект, реализующий преобразование хэширования.
Сопоставление имен алгоритмов в файлах конфигурации
По умолчанию среда выполнения возвращает объект System.Security.Cryptography.SHA1CryptoServiceProvider class во всех четырех сценариях. Однако в последних двух сценариях администратор компьютера может изменить тип возвращаемого этими методами объекта. Для этого необходимо сопоставить понятное имя алгоритма с классом, используемым в файле конфигурации компьютера (Machine.config).
В следующем примере показана настройка среды выполнения таким образом, чтобы методы System.Security.Cryptography.SHA1.Create, System.Security.CryptoConfig.CreateFromName("SHA1") и System.Security.Cryptography.HashAlgorithm.Create возвращали объект MySHA1HashClass.
<configuration>
<!-- Other configuration settings. -->
<mscorlib>
<cryptographySettings>
<cryptoNameMapping>
<cryptoClasses>
<cryptoClass MySHA1Hash="MySHA1HashClass, MyAssembly
Culture='en', PublicKeyToken=a5d015c7d5a0b012,
Version=1.0.0.0"/>
</cryptoClasses>
<nameEntry name="SHA1" class="MySHA1Hash"/>
<nameEntry name="System.Security.Cryptography.SHA1"
class="MySHA1Hash"/>
<nameEntry name="System.Security.Cryptography.HashAlgorithm"
class="MySHA1Hash"/>
</cryptoNameMapping>
</cryptographySettings>
</mscorlib>
</configuration>
Имя атрибута можно задать в элементе <cryptoClass> (в предыдущем примере атрибут имел имя MySHA1Hash). Значением атрибута в элементе <cryptoClass> является строка, используемая средой CLR для поиска класса. Можно использовать любую строку, отвечающую требованиям, описанным в разделе Указание полных имен типов.
С одним классом может быть сопоставлено много имен алгоритмов. Элемент <nameEntry> сопоставляет класс с одним понятным именем алгоритма. Атрибут name может быть либо строкой, используемой при вызове метода System.Security.Cryptography.CryptoConfig.CreateFromName, либо именем абстрактного криптографического класса в пространстве имен System.Security.Cryptography. Значением атрибута class является имя атрибута в элементе <cryptoClass>.
![]() |
---|
Алгоритм SHA1 можно получить с помощью метода System.Security.Cryptography.SHA1.Create или метода Security.CryptoConfig.CreateFromName("SHA1"). Каждый метод возвращает только объект, реализующий алгоритм SHA1. Нет необходимости сопоставлять каждое понятное имя алгоритма с одним и тем же классом в файле конфигурации. |
Список имен по умолчанию, а также сопоставляемых с ними классов см. в классе CryptoConfig.