Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Использование средств шифрования данных в приложениях для Microsoft .Net (Учебное пособие).doc
Скачиваний:
127
Добавлен:
28.06.2014
Размер:
743.94 Кб
Скачать

Глава 2 Средства обмена секретными ключами и обеспечения аутентичности и целостности данных

2.1. Классы, реализующие алгоритмы асимметричного шифрования

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

  • алгоритма Эль-Гамаля DSA (абстрактный базовый класс DSA и его наследник DSACryptoServiceProvider);

  • протокола Диффи-Хеллмана на эллиптических кривых ECDH (абстрактный базовый класс ECDiffieHellman и его наследник ECDiffieHellmanCng);

  • алгоритма DSA на эллиптических кривых (абстрактный базовый класс ECDsa и его наследник ECDsaCng);

  • алгоритма RSA (абстрактный базовый класс RSA и его наследник RSACryptoServiceProvider).

Базовый класс AsymmetricAlgorithm имеет следующие свойства:

  • string KeyExchangeAlgorithm – строка с названием асимметричного криптоалгоритма для обмена секретными ключами симметричного шифрования;

  • string SignatureAlgorithm – строка с названием асимметричного криптоалгоритма для электронной цифровой подписи;

  • int KeySize – длина ключа асимметричного шифрования в битах;

  • KeySizes[] LegalKeySizes – допустимые значения для ключей асимметричного шифрования (свойства объектов класса KeySizes приведены в разделе 1.1).

Метод класса AsymmetricAlgorithm:

void Clear() – освобождение все ресурсов объекта асимметричного шифрования.

Класс DSACryptoServiceProvider содержит свойства и методы для вычисления и проверки электронной цифровой подписи (ЭЦП). Этот класс имеет конструктор без параметров и конструкторы с параметрами:

  • CspParameters parameters (создание объекта с заданными параметрами для криптопровайдера);

  • int dwKeySize (создание объекта с ключом заданной длины);

  • int dwKeySize, CspParameters parameters (создание объекта с ключом заданной длины и заданными параметрами для криптопровайдера).

Дополнительные свойства класса DSACryptoServiceProvider:

  • CspKeyContainerInfo CspKeyContainerInfo (дополнительная информация о контейнере ключей, используемом криптопровайдером; объект класса CspKeyContainerInfo имеет свойства Accessible – признак доступности ключевой пары в контейнере, CryptoKeySecurity – права доступа к контейнеру ключей, Exportable – признак возможности экспорта закрытого ключа из контейнера, HardwareDevice – признак хранения закрытого ключа на аппаратном устройстве, KeyContainerName – строка с именем контейнера ключей, KeyNumber – тип пары ключей асимметричного криптоалгоритма (см. раздел 1.1), MachineKeyStore – признак хранения пары ключей в разделе системного реестра с настройками компьютера, Protected – признак защищенности ключевой пары, ProviderName – строка с именем криптопровайдера, ProviderType – тип криптопровайдера, RandomlyGenerated – признак реализации генератора случайных чисел в управляемом коде, Removable – признак возможности удаления пары ключей из контейнера, UniqueKeyContainerName – строка с гарантированно уникальным именем контейнера ключей);

  • bool PersistKeyInCsp – признак использования ключа в криптопровайдере;

  • bool PublicOnly – признак наличия в объекте асимметричного шифрования только открытого ключа;

  • static bool UseMachineKeyStore – признак хранения ключей в профиле компьютера в системном реестре, а не в профиле пользователя.

Дополнительные методы класса DSACryptoServiceProvider:

  • byte[] CreateSignature(byte[] rgbHash) – вычисление электронной цифровой подписи (ЭЦП) для заданного хеш-значения rgbHash;

  • byte[] ExportCspBlob(bool includePrivateParameters) – экспорт так называемого блоба (большого двоичного объекта, BLOB, binary large object) с информацией о ключевой паре (включая сведения о закрытом ключе, если значение параметра равно true);

  • DSAParameters ExportParameters(bool includePrivateParameters) – экспорт параметров асимметричного криптоалгоритма (включая сведения о закрытом ключе, если значение параметра равно true), класс DSAParameters будет описан далее;

  • void ImportCspBlob(byte[] keyBlob) – импорт блоба с информацией о ключевой паре;

  • void ImportParameters(DSAParameters parameters) – импорт параметров асимметричного криптоалгоритма;

  • byte[] SignData(byte[] buffer) – хеширование и вычисление ЭЦП для данных из заданного буфера;

  • byte[] SignData(Stream inputStream) – хеширование и вычисление ЭЦП для данных из заданного потока;

  • byte[] SignData(byte[] buffer, int offset, int count) – вычисление ЭЦП для count байт из буфера buffer со смещением offset;

  • byte[] SignHash(byte[] rgbHash, string str) – вычисление ЭЦП для хеш-значения rgbHash, полученного с помощью алгоритма хеширования с именем str;

  • bool VerifyData(byte[] rgbData, byte[] rgbSignature) – проверка ЭЦП rgbSignature под данными rgbData;

  • bool VerifyHash(byte[] rgbHash, string str, byte[] rgbSignature) – проверка ЭЦП rgbSignature для хеш-значения rgbHash, полученного с помощью алгоритма хеширования str;

  • bool VerifySignature(byte[] rgbHash, byte[] rgbSignature) – проверка ЭЦП rgbSignature под хеш-значением rgbHash.

Методы класса DSACryptoServiceProvider по умолчанию используют алгоритм хеширования SHA1.

В классе DSAParameters (параметры криптоалгоритма DSA) определены следующие публичные поля:

  • int Counter – значение счетчика для алгоритма DSA;

  • byte[] G – значение параметра g (основание степени);

  • byte[] J – значение параметра j;

  • byte[] P – значение модуля p (простого числа длиной от 64 до 128 байт);

  • byte[] Q – значение 160-разрядного простого множителя числа p–1;

  • byte[] Seed – начальное значение для алгоритма генерации псевдослучайных чисел, с помощью которого получается значение параметра k;

  • byte[] X – значение закрытого показателя степени x;

  • byte[] Y – значение открытого параметра y (результата возведения в степень, части открытого ключа пользователя).

Класс ECDiffieHellmanCng предназначен для согласования (совместного вычисления) секретного ключа симметричного шифрования двумя участниками защищенного обмена данными. Этот ключ может быть вычислен либо с помощью хеширования двух согласованных участниками секретных частей, либо по алгоритму получения кода аутентификации сообщений с помощью хеширования (HMAC) также с использованием двух согласованных участниками частей, либо по протоколу TLS.

Класс ECDiffieHellmanCng имеет следующие дополнительные свойства:

  • CngAlgorithm HashAlgorithm – алгоритм хеширования, используемый при генерации секретного ключа (по умолчанию SHA256, другие возможные алгоритмы: MD5, SHA1, SHA384, SHA512; могут использоваться и дополнительные алгоритмы хеширования, это свойство может использоваться в программе, если свойство KeyDerivationFunction имеет значения Hash или Hmac);

  • ECDiffieHellmanKeyDerivationFunction KeyDerivationFunction – функция генерации секретного ключа (перечисление ECDiffieHellmanKeyDerivationFunction включает значения Hash при использовании функции хеширования, Hmac при использовании основанного на хешировании алгоритма вычисления кода аутентификации сообщения, Tls при использовании протокола TLS, transport layer security);

  • byte[] HmacKey – секретный ключ при использовании HMAC для генерации секретного ключа симметричного шифрования;

  • CngKey Key – пара асимметричных ключей (класс CngKey будет описан далее);

  • byte[] Label – идентификатор, используемый при генерации секретного ключа по протоколу TLS (по умолчанию null);

  • ECDiffieHellmanPublicKey PublicKey – открытый ключ асимметричной криптосистемы (класс ECDiffieHellmanPublicKey будет описан далее);

  • byte[] SecretAppend – секретная завершающая часть, используемая при генерации секретного ключа с помощью хеширования или конструкции HMAC (по умолчанию null);

  • byte[] SecretPrepend – секретная начальная часть, используемая при генерации секретного ключа с помощью хеширования или конструкции HMAC (по умолчанию null);

  • byte[] Seed – данные, используемые при генерации секретного ключа по протоколу TLS (по умолчанию null);

  • bool UseSecretAgreementAsHmacKey – признак использования секретных частей при генерации секретного ключа с помощью HMAC (по умолчанию false).

Класс ECDiffieHellmanCng содержит конструктор без параметров и конструкторы с параметрами:

  • CngKey key – создание объекта класса для заданной параметром пары ключей;

  • int keySize – создание объекта класса со случайным ключом заданной длины.

Дополнительные методы класса ECDiffieHellmanCng:

  • byte[] DeriveKeyMaterial(CngKey otherPartyPublicKey) – получение секретного ключа в результате соглашения между двумя участниками защищенной связи (параметр метода задает открытый ключ второго участника);

  • byte[] DeriveKeyMaterial (ECDiffieHellmanPublicKey otherPartyPublicKey) – действие аналогично предыдущему методу;

  • SafeNCryptSecretHandle DeriveSecretAgreementHandle (CngKey otherPartyPublicKey) – получение дескриптора (системного указателя) секретного ключа, согласованного двумя участниками защищенной связи (класс SafeNCryptSecretHandle определен в пространстве имен Microsoft.Win32.SafeHandles и будет описан далее);

  • SafeNCryptSecretHandle DeriveSecretAgreementHandle (ECDiffieHellmanPublicKey otherPartyPublicKey) – действие аналогично предыдущему методу.

Класс CngKey (объектами его являются пары асимметричных ключей для так называемой криптографии нового поколения CNG, cryptography new generation, основанной на эллиптических кривых EC, elliptic curve [1]) включает следующие свойства:

  • CngAlgorithm Algorithm – алгоритм асимметричного шифрования (класс CngAlgorithm будет описан далее);

  • CngAlgorithmGroup AlgorithmGroup – группа асимметричных криптоалгоритмов (класс CngAlgorithmGroup будет описан далее);

  • CngExportPolicies ExportPolicy – правила экспорта криптографического ключа (перечисление CngExportPolicies включает значения None при отсутствии правил экспорта, AllowExport при разрешении многократного экспорта закрытого ключа, AllowPlaintextExport при разрешении многократного экспорта закрытого ключа как открытого текста, AllowArchiving при разрешении однократного экспорта закрытого ключа в целях его резервного копирования, AllowPlaintextArchiving при разрешении однократного экспорта закрытого ключа в виде открытого текста);

  • SafeNCryptKeyHandle Handle – получение дескриптора пары ключей;

  • bool IsEphemeral – признак эфемерности (существования только до конца работы программы) криптографического ключа;

  • bool IsMachineKey – признак сохранения ключа в профиле компьютера, а не пользователя;

  • string KeyName – имя владельца ключа (null при его эфемерности);

  • int KeySize – длина ключа в битах;

  • CngKeyUsages KeyUsage – назначение ключа (перечисление CngKeyUsages включает значения None при отсутствии целей использования ключа, Decryption при использовании для шифрования и расшифрования, Signing при использовании для вычисления и проверки электронной цифровой подписи, KeyAgreement при использовании для согласования секретного ключа симметричного шифрования, AllUsages при использовании пары ключей в любых целях);

  • IntPtr ParentWindowHandle – дескриптор родительского окна при отображении пользовательского интерфейса для подтверждения прав доступа к закрытому ключу (например, при запросе PIN-кода), по умолчанию null;

  • CngProvider Provider – криптопровайдер, управляющий доступом к паре ключей (класс CngProvider будет описан далее);

  • SafeNCryptProviderHandle ProviderHandle – дескриптор криптопровайдера, управляющего доступом к паре ключей;

  • CngUIPolicy UIPolicy – параметры элемента управления пользовательского интерфейса, используемого при проверки прав доступа к закрытому ключу (класс CngUIPolicy будет описан далее);

  • string UniqueName ‒ уникальное (альтернативное) имя владельца пары ключей (при их эфемерности null).

Методы класса CngKey:

  • static CngKey Create(CngAlgorithm algorithm) – создание объекта для заданного криптоалгоритма с эфемерным ключом;

  • static CngKey Create(CngAlgorithm algorithm, string keyName) – создание объекта для заданного криптоалгоритма с ключом с заданным именем владельца;

  • static CngKey Create(CngAlgorithm algorithm, string keyName, CngKeyCreationParameters creationParameters) – создание объекта для заданного криптоалгоритма с ключом с заданным именем владельца и указанными параметрами создания (класс CngKeyCreationParameters будет описан далее);

  • void Delete() – удаление связанного с объектом ключа;

  • void Dispose() – освобождение всех связанных с объектом ресурсов;

  • static bool Exists(string keyName) ‒ проверка наличия ключа с указанным именем в контейнере ключей по умолчанию;

  • static bool Exists(string keyName, CngProvider provider) ‒ проверка наличия ключа с указанным именем в контейнере ключей заданного криптопровайдера;

  • static bool Exists(string keyName, CngProvider provider, CngKeyOpenOptions options) ‒ проверка наличия ключа с указанным именем в контейнере ключей заданного криптопровайдера, открытого с указанными опциями (перечисление CngKeyOpenOptions содержит значения None, если при открытии доступа к ключу опции не определяются, UserKey, если ключ открывается в профиле пользователя, MachineKey, если ключ открывается в профиле компьютера, Silent, если при открытии ключа не отображается пользовательский интерфейс проверки прав доступа; такой интерфейс обязателен, например, при хранении закрытого ключа на смарт-карте);

  • byte[] Export(CngKeyBlobFormat format) – получение блоба экспортируемых ключей (класс CngKeyBlobFormat будет описан далее);

  • CngProperty GetProperty(string name, CngPropertyOptions options) – получение значения свойства пары ключей с именем свойства name и параметрами свойства options (перечисление CngPropertyOptions включает значения None, если параметры свойства не заданы, CustomProperty, если свойство определено вне CNG, Persist, если свойство должно быть сохранено вместе с парой ключей; класс CngProperty будет рассмотрен далее);

  • bool HasProperty(string name, CngPropertyOptions options) – проверка наличия заданного свойства с заданными параметрами;

  • static CngKey Import(byte[] keyBlob, CngKeyBlobFormat format) – импорт ключа из блоба keyBlob формата format;

  • static CngKey Import(byte[] keyBlob, CngKeyBlobFormat format, CngProvider provider) – импорт ключа из блоба keyBlob формата format в криптопровайдер provider;

  • static CngKey Open(string keyName) – создание объекта для пары существующих ключей с именем владельца keyName;

  • static CngKey Open(SafeNCryptKeyHandle keyHandle,CngKeyHandleOpenOptions keyHandleOpenOptions) – создание объекта для существующей пары ключей с дескриптором keyHandle (перечисление CngKeyHandleOpenOptions задает тип заданной пары ключей: None, если ключ не эфемерный, и EphemeralKey, если ключ эфемерный);

  • static CngKey Open(string keyName,CngProvider provider) – создание объекта для существующей пары ключей с именем владельца keyName из контейнера ключей криптопровайдера provider;

  • static CngKey Open(string keyName,CngProvider provider,CngKeyOpenOptions openOptions) ‒ создание объекта для существующей пары ключей с именем владельца keyName из контейнера ключей криптопровайдера provider (перечисление CngKeyOpenOptions содержит параметры открытия ключа);

  • void SetProperty(CngProperty property) – задание значения указанному свойству пары ключей.

Абстрактный базовый класс ECDiffieHellmanPublicKey (открытый ключ асимметричной системы Диффи-Хеллмана) имеет наследникаECDiffieHellmanCngPublicKey, который имеет свойство

CngKeyBlobFormat BlobFormat – формат блоба при экспорте открытого ключа.

Класс ECDiffieHellmanCngPublicKey не имеет собственного конструктора и содержит следующие методы:

  • static ECDiffieHellmanPublicKey FromByteArray(byte[] publicKeyBlob,CngKeyBlobFormat format) – создание объекта класса из блоба форматаformat с открытым ключом publicKeyBlob);

  • CngKey Import() – импорт открытого ключа в объект класса CngKey;

  • byte[] ToByteArray() – представление открытого ключа в виде массива байт.

Класс SafeNCryptSecretHandle из пространства имен Microsoft. Win32. SafeHandles представляет средства для работы в программе с дескрипторами (системными указателями) объектов Windows. Этот класс содержит свойства:

  • bool IsClosed – проверка закрытия объекта, связанного с дескриптором;

  • bool IsInvalid – проверка допустимости значения дескриптора.

Конструктор класса SafeNCryptSecretHandle не имеет параметров. Этот класс включает следующие методы:

  • void Close() – освобождение дескриптора и связанного с ним объекта;

  • IntPtr DangerousGetHandle() – получение значения дескриптора;

  • bool ReleaseHandle() – освобождение ресурсов объекта CNG, связанного с дескриптором и возвращение true, если оно завершилось успешно;

  • void SetHandleAsInvalid() – задание дескриптора как более не используемого.

Класс CngAlgorithm позволяет создавать объекты для асимметричных криптоалгоритмов и алгоритмов хеширования. Этот класс включает следующие свойства:

  • string Algorithm – имя криптоалгоритма;

  • static CngAlgorithm ECDiffieHellmanP256 – объект для протокола обмена секретными ключами Диффи-Хеллмана на эллиптических кривых с модулем 256 бит;

  • static CngAlgorithm ECDiffieHellmanP384 ECDiffieHellmanP256 – объект для протокола Диффи-Хеллмана на эллиптических кривых с модулем 384 бит;

  • static CngAlgorithm ECDiffieHellmanP521– объект для протокола Диффи-Хеллмана на эллиптических кривых с модулем 521 бит;

  • static CngAlgorithm ECDsaP256 – объект для алгоритма электронной цифровой подписи DSA (digital signature algorithm) на эллиптических кривых с модулем 256 бит;

  • static CngAlgorithm ECDsaP384 – объект для алгоритма электронной цифровой подписи DSA на эллиптических кривых с модулем 384 бит;

  • static CngAlgorithm ECDsaP521 – объект для алгоритма электронной цифровой подписи DSA на эллиптических кривых с модулем 521 бит;

  • static CngAlgorithm MD5 – объект для алгоритма хеширования MD5;

  • static CngAlgorithm Sha1 – объект для алгоритма хеширования SHA1;

  • static CngAlgorithm Sha256 – объект для алгоритма хеширования SHA256;

  • static CngAlgorithm Sha384 – объект для алгоритма хеширования SHA384;

  • static CngAlgorithm Sha512 – объект для алгоритма хеширования SHA512.

Конструктор класса CngAlgorithm имеет параметр – строку с именем криптоалгоритма. Данный конструктор может использоваться для создания объектов класса для алгоритмов, которые не представлены статическими свойствами класса и поддерживает дальнейшее развитие криптографии нового поколения.

В классе CngAlgorithm определены методы для перегрузки операций == и !=:

  • static bool operator ==(CngAlgorithm left, CngAlgorithm right);

  • static bool operator !=(CngAlgorithm left, CngAlgorithm right).

Класс CngAlgorithmGroup (группа криптоалгоритмов) включает свойства:

  • string AlgorithmGroup – строка с именем группы криптоалгоритмов;

  • static CngAlgorithmGroup DiffieHellman – объект для семейства протоколов Диффи-Хеллмана;

  • static CngAlgorithmGroup Dsa – объект для семейства алгоритмов DSA;

  • static CngAlgorithmGroup ECDiffieHellman – объект для семейства протоколов Диффи-Хеллмана на эллиптических кривых;

  • static CngAlgorithmGroup ECDsa – объект для семейства алгоритмов DSA на эллиптических кривых;

  • static CngAlgorithmGroup Rsa – объект для семейства алгоритмов RSA.

Конструктор CngAlgorithmGroup имеет параметр – строку с именем группы криптоалгоритмов. Основная цель использования данного конструктора — предоставление возможности создания объектов CngAlgorithmGroup для групп алгоритмов, которые не представлены статическими свойствами этого класса.

В классе CngAlgorithmGroup определены методы для перегрузки операций == и !=:

  • static bool operator ==(CngAlgorithmGroup left, CngAlgorithmGroup right);

  • static bool operator !=(CngAlgorithmGroup left, CngAlgorithmGroup right).

Класс CngProvider (криптопровайдер для криптографии нового поколения) имеет свойства:

  • static CngProvider MicrosoftSmartCardKeyStorageProvider – объект для аппаратного криптопровайдера Microsoft на базе смарт-карт;

  • static CngProvider MicrosoftSoftwareKeyStorageProvider – объект для программного криптопровайдера Microsoft;

  • string Provider – имя криптопровайдера, связанного с объектом.

Конструктор класса CngProvider имеет параметр – строку с именем криптопровайдера, отличного от криптопровайдеров Microsoft. Методы класса CngProvider перегружают операции == и !=:

  • static bool operator ==(CngProvider left, CngProvider right);

  • static bool operator !=(CngProvider left, CngProvider right).

В классе CngKeyCreationParameters (параметры создаваемой пары асимметричных ключей) определены следующие свойства:

  • Nullable<CngExportPolicies> ExportPolicy – параметры политики экспорта ключей;

  • CngKeyCreationOptions KeyCreationOptions – параметры создания ключей (перечисление CngKeyCreationOptions включает значения None, если никакие параметры при создании ключей не используются,MachineKey, если ключи создаются в профиле компьютера, OverwriteExistingKey, если перезаписываются существующие ключи);

  • Nullable<CngKeyUsages> KeyUsage – область применения (назначение) пары ключей;

  • CngPropertyCollection Parameters – дополнительные параметры пары ключей (класс CngPropertyCollection будет описан далее);

  • IntPtr ParentWindowHandle – дескриптор родительского окна для диалоговых окон, создаваемых объектами классов CNG при создании ключей;

  • CngProvider Provider – криптопровайдер, обеспечивающий хранение ключей;

  • CngUIPolicy UIPolicy – информация о пользовательском интерфейсе, отображаемом при создании пары ключей.

Конструктор класса CngKeyCreationParameters не имеет параметров.

Класс CngUIPolicy (параметры пользовательского интерфейса, отображаемого при получении доступа к закрытому ключу асимметричного шифрования) содержит следующие свойства:

  • string CreationTitle – текст заголовка диалогового окна, отображаемого при получении доступа к закрытому ключу;

  • string Description – поясняющий текст внутри диалогового окна;

  • string FriendlyName – дружественное (понятное) имя ключа, к которому запрашивается доступ;

  • CngUIProtectionLevels ProtectionLevel – уровень защиты закрытого ключа (перечисление CngUIProtectionLevels включает значения None, если пользовательский интерфейс не отображается, ProtectKey, если интерфейс отображается при первом доступе к закрытому ключу в процессе, ForceHighProtection, если интерфейс отображается при любом доступе к закрытому ключу);

  • string UseContext – описание контекста использования ключей.

Класс CngUIPolicy имеет конструкторы с параметрами:

  • CngUIProtectionLevels protectionLevel (уровень защиты закрытого ключа);

  • CngUIProtectionLevels protectionLevel, string friendlyName (уровень защиты ключа и его дружественное имя);

  • CngUIProtectionLevels protectionLevel, string friendlyName, string description (уровень защиты, дружественное имя и пояснение);

  • CngUIProtectionLevels protectionLevel, string friendlyName, string description, string useContext (уровень защиты, дружественное имя, пояснение и область применения ключа);

  • CngUIProtectionLevels protectionLevel, string friendlyName, string description, string useContext, string creationTitle (уровень защиты, дружественное имя, пояснение, область применения ключа и заголовок диалогового окна).

Объекты класса CngUIPolicy могут, например, использоваться для отображения диалогового окна ввода PIN-кода при доступе к закрытому ключу на смарт-карте.

Класс CngPropertyCollection (набор свойств объектов классов CNG) содержит следующие свойства:

  • int Count – количество свойств в наборе;

  • int index – индекс свойства в наборе;

  • IList<T> Items – список свойств.

Конструктор класса CngPropertyCollection не имеет параметров. В этом классе также определены методы;

  • void Add(T item) – добавление свойства в набор;

  • void Clear() – удаление всех свойств из набора;

  • virtual void ClearItems() – удаление всех элементов из набора (переопределяемый метод);

  • bool Contains(T item) – проверка вхождения свойства в набор;

  • void CopyTo(T[] array,int index) – копирование набора свойств в массив array, начиная с индекса index;

  • IEnumerator<T> GetEnumerator() – объект для перебора свойств в наборе;

  • int IndexOf(T item) – индекс заданного свойства в наборе или -1, если такого свойства там нет;

  • void Insert(int index,T item) – вставка свойства item в набор в позицию index;

  • virtual void InsertItem(int index,T item) – вставка свойства item в набор в позицию index (переопределяемый метод);

  • bool Remove(T item) – удаление заданного свойства из набора и возвращение true в случае успеха;

  • void RemoveAt(int index) – удаление свойства с заданным индексом из набора;

  • virtual void RemoveItem(int index) – удаление свойства с заданным индексом из набора (переопределяемый метод);

  • void SetItem(int index,T item) – замена свойства набора с индексом index новым свойством item.

Класс ECDsaCng предназначен для вычисления и проверки электронной цифровой подписи (ЭЦП). В нем определены следующие свойства:

  • CngAlgorithm HashAlgorithm – алгоритм хеширования, используемый при вычислении и проверке ЭЦП (поддерживаются алгоритмы MD5, SHA1, SHA256, SHA384, SHA512 и др., по умолчанию применяется SHA256);

  • CngKey Key – пара ключей асимметричного шифрования, используемых при вычислении и проверке ЭЦП;

  • string KeyExchangeAlgorithm – имя криптоалгоритма, используемого для обмена секретными ключами симметричного шифрования (поскольку класс ECDsaCng не применяется для обмена ключами, значением этого свойства является null);

  • string SignatureAlgorithm – имя алгоритма ЭЦП (значением этого свойства является строка "ECDsa").

Класс ECDsaCng имеет конструктор без параметров, создающий объект с парой случайных ключей, и конструкторы с параметрами:

  • CngKey key – создание объекта класса на основе заданной пары ключей;

  • int keySize – создание объекта на основе случайной пары ключей заданной длины (допустимы размеры ключа256, 384 и 521 бит) .

В класса ECDsaCng определены методы:

  • byte[] SignData(byte[] data) – вычисление ЭЦП для указанных данных;

  • byte[] SignData(Stream data) – вычисление ЭЦП для данных из указанного потока (с перемещением указателя текущей позиции в конец потока);

  • byte[] SignData(byte[] data,int,int count) – вычисление ЭЦП для данных длиной count из буфера data со смещением offset;

  • byte[] SignHash(byte[] hash) – вычисление ЭЦП для заданного хеш-значения;

  • bool VerifyData(byte[] data, byte[] signature) – проверка ЭЦП signature для данных data;

  • bool VerifyData(Stream data,byte[] signature) – проверка ЭЦП signature для данных из потока data (с перемещением указателя текущей позиции в конец потока);

  • bool VerifyData(byte[] data,int offset,int count,byte[] signature) ‒ проверка ЭЦП signature для данных длиной count из буфера data со смещением offset;

  • bool VerifyHash(byte[] hash,byte[] signature) – проверка ЭЦП signature для хеш-значения hash.

В классе RSACryptoServiceProvider, предназначенном для вычисления и проверки ЭЦП, а также для обмена секретными ключами симметричного шифрования (совместно с классами RSAOAEPKeyExchangeFormatter, RSAOAEPKeyExchangeDeformatter, RSAPKCS1KeyExchangeFormatter и RSAPKCS1KeyExchangeDeformatter, рассмотренными в разделе 1.1) определены следующие свойства:

  • CspKeyContainerInfo CspKeyContainerInfo – дополнительные сведения о контейнере ключей асимметричного шифрования;

  • string KeyExchangeAlgorithm – имя асимметричного криптоалгоритма, используемого для обмена секретными ключами симметричного шифрования (например, строка "RSA-PKCS1-KeyEx");

  • bool PersistKeyInCsp – признак сохранения пары ключей в контейнере;

  • bool PublicOnly – признак использования в объекте класса только открытого ключа;

  • string SignatureAlgorithm – имя асимметричного криптоалгоритма, используемого для вычисления и проверки ЭЦП (в текущей версии Microsoft .Net значением свойства является http://www.w3.org/2000/09/xmldsig#rsa-sha1);

  • bool UseMachineKeyStore – признак сохранения пары ключей в профиле компьютера, а не пользователя.

Класс RSACryptoServiceProvider имеет конструктор без параметров, создающий объект с парой ключей по умолчанию для используемого криптопровайдера или с новой случайной парой ключей. Данный объект будет предназначен для обмена секретными ключами симметричного шифрования. Другие конструкторы данного класса имеют параметры:

  • CspParameters parameters – создание объекта с указанными параметрами, передаваемыми криптопровайдеру (класс CspParameters был рассмотрен в разделе 1.1); по умолчанию связанная с объектом пара ключей предназначена для обмена секретными ключами симметричного шифрования, а для создания пары ключей ЭЦП необходимо задать полю KeyNumber параметра parameters значение Signature (2);

  • int dwKeySize – создание объекта с парой ключей по умолчанию (если она существует) или новой случайной парой ключей заданной длины, предназначенной для обмена ключами симметричного шифрования;

  • int dwKeySize, CspParameters parameters – создание объекта с парой ключей длины dwKeySize бит и параметрами для криптопровайдера parameters (по умолчанию создаваемая пара ключей предназначена для обмена секретными ключами симметричного шифрования, а для создания пары ключей ЭЦП необходимо задать полю KeyNumber параметра parameters значение Signature).

Методы, определенные в классе RSACryptoServiceProvider:

  • byte[] Decrypt(byte[] rgb, bool fOAEP) – расшифрование данных из буфера rgb по алгоритму RSA с учетом заполнения OAEP, если fOAEP==true, или по стандарту PKCS 1 v1.5 в противном случае;

  • byte[] Encrypt(byte[] rgb, bool fOAEP) – шифрование данных из буфера rgb по алгоритму RSA с учетом заполнения OAEP, если fOAEP==true, или по стандарту PKCS 1 v1.5 в противном случае;

  • RSAParameters ExportParameters(bool includePrivateParameters) – экспорт параметров криптосистемы RSA, включая закрытые параметры при значении параметра true (класс RSAParameters будет описан далее);

  • void ImportParameters(RSAParameters parameters) – импорт параметров криптосистемы RSA;

  • byte[] SignData(byte[] buffer, Object halg) – хеширование по алгоритму halg данных из буфера buffer и вычисление ЭЦП для полученного хеш-значения (параметр halg может принимать значения типов String, HashAlgorithm или Type);

  • byte[] SignData(Stream inputStream, Object halg) – хеширование по алгоритму halg данных из потока inputStream и вычисление ЭЦП для полученного хеш-значения (параметр halg может принимать значения типов String, HashAlgorithm или Type);

  • byte[] SignData(byte[] buffer, int offset, int count, Object halg) – хеширование по алгоритму halg данных длиной count из буфера buffer со смещением offset и вычисление ЭЦП для полученного хеш-значения (параметр halg может принимать значения типов String, HashAlgorithm или Type);

  • bool VerifyData(byte[] buffer, Object halg, byte[] signature) – хеширование по алгоритму halg данных из буфера buffer и проверка ЭЦП signature для полученного хеш-значения (параметр halg может принимать значения типов String, HashAlgorithm или Type).

Другие методы класса RSACryptoServiceProvider (ExportCspBlob, ImportCspBlob, SignHash, VerifyHash) аналогичны по своему действию одноименным методам класса DSACryptoServiceProvider, рассмотренным ранее в этом разделе. Единственное отличие заключается в том, что объекты класса RSACryptoServiceProvider могут использовать алгоритмы хеширования SHA1 и MD5.

По умолчанию данные, зашифрованные с помощью класса RSACryptoServiceProvider, нельзя расшифровать с помощью функции CryptoAPI CryptDecrypt, а данные, зашифрованные с помощью функции CryptoAPI CryptEncrypt, нельзя расшифровать с помощью класса RSACryptoServiceProvider.Для обеспечения совместимости с интерфейсом CryptoAPI необходимо вручную изменить порядок зашифрованных байтов на противоположный перед их передачей функциям этого интерфейса. Для изменения порядка байтов массива в управляемом коде на противоположный достаточно вызвать метод Array.Reverse.

В классе RSAParameters (параметры криптосистемы RSA) определены следующие публичные поля:

  • byte[] D – значение закрытого ключа (параметра d) криптосистемы RSA;

  • byte[] Exponent – значение открытого показателя степени e (части открытого ключа);

  • byte[] DP – значение d mod (p - 1);

  • byte[] DQ – значение d mod (q - 1);

  • byte[] InverseQ – значение, мультипликативно обратное к q по модулю p;

  • byte[] Modulus – значение модуля n;

  • byte[] P – значение первого простого числа p;

  • byte[] Q – значение второго простого числа q.

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