Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
защита данных / Криптография в MS Visual Studio.doc
Скачиваний:
56
Добавлен:
31.03.2015
Размер:
743.42 Кб
Скачать

Глава 1 Средства обеспечения конфиденциальности данных

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

Версия Microsoft .NET Framework 4.5 содержит классы для реализации следующих алгоритмов симметричного шифрования, используемых для обеспечения конфиденциальности информации [13]:

  • федерального стандарта США AES (абстрактный класс Aes и его наследники AesCryptoServiceProvider и AesManaged);

  • классического алгоритма DES (базовый класс DES и его наследник DESCryptoServiceProvider);

  • RC2 (базовый класс RC2 и его наследник RC2CryptoServiceProvider);

  • Rijndael (базовый класс Rijndael и его наследник RijndaelManaged);

  • TripleDES (базовый класс TripleDES и его наследник TripleDESCryptoServiceProvider).

Общий для всех этих классов базовый абстрактный класс SymmetricAlgorithm содержит следующие свойства:

  • byte[] IV (начальный вектор или вектор инициализации, автоматически устанавливается в новое случайное значение при создании объекта класса);

  • byte[] Key (секретный ключ, необходимый для шифрования и расшифрования данных);

  • int KeySize (длина секретного ключа в битах);

  • KeySizes[] LegalKeySizes (массив значений секретного ключа, допустимых для используемого алгоритма симметричного шифрования; класс KeySizes содержит свойства MaxSize, MinSize и SkipSize, для получения максимального и минимального из допустимых значений длины ключа, а также шага изменения этого значения);

  • int BlockSize (длина блока шифруемых или расшифровываемых данных в битах);

  • KeySizes[] LegalBlockSizes (массив допустимых для криптоалгоритма значений длины блока данных);

  • CipherMode Mode (режим блочного шифрования, перечисление CipherMode содержит значения CBC – режим сцепления блоков шифра, ECB – режим электронной кодовой книги, OFB – режим обратной связи по выходу, CFB – режим обратной связи по шифру, CTS – режим скрытого шифротекста);

  • PaddingMode Padding (правило расширения последнего блока открытого текста при его шифровании в режиме ECB; перечисление PaddingMode содержит значения None – без расширения, PKCS7 – расширение по стандарту PKCS #7, по которому каждый добавляемый байт содержит общее количество добавляемых байт, Zeros – расширение нулевыми байтами, ANSIX923 – расширение по стандарту ANSIX923, по которому все добавляемые байты, кроме последнего, содержат нули, а последний – общее количество добавляемых байт, ISO10126 – расширение по стандарту ISO10126, по которому все добавляемые байты, кроме последнего, содержат случайные значения, а последний – общее количество добавляемых байт);

  • int FeedbackSize – длина обратной связи в битах (используется при шифровании в режимах CFB или OFB; значение этого свойства не может превышать длину блока).

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

Класс SymmetricAlgorithm содержит следующие основные методы, которые частично переопределяются в классах-наследниках:

  • ICryptoTransform CreateEncryptor() – создание объекта шифрования с текущими значениями свойств Key и IV (если значением этих свойств является null, то вызываются методы GenerateKey и GenerateIV);

  • ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV) – создание объекта шифрования с задаваемыми параметрами значениями секретного ключа и начального вектора;

  • ICryptoTransform CreateDecryptor() – создание объекта расшифрования с текущими значениями свойств Key и IV (если значением этих свойств является null, то вызываются методы GenerateKey и GenerateIV);

  • ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV) – создание объекта расшифрования с задаваемыми параметрами значениями секретного ключа и начального вектора;

  • void GenerateKey() – генерация случайного значения секретного ключа;

  • void GenerateIV() – генерация случайного значения начального вектора;

  • bool ValidKeySize(int bitLength) – проверка допустимости длины секретного ключа для используемого криптоалгоритма;

  • void Clear() – очистка памяти, занятой конфиденциальной информацией (например, секретными ключами);

  • void Dispose() – освобождение всех ресурсов, используемых объектом класса SymmetricAlgorithm (метод должен вызываться после завершения выполнения криптографических операций с помощью этого объекта);

  • protected virtual void Dispose(bool disposing) – освобождение ресурсов, используемых объектом класса SymmetricAlgorithm (всех, если значение параметра true, или только не управляемых средой .Net, если значение параметра false).

Класс AesCryptoServiceProvider представляет реализацию криптоалгоритма блочного симметричного шифрования AES с помощью криптографического интерфейса приложений Windows (CryptoAPI, cryptographic application programming interface), функции которого обеспечивают доступ приложений к ресурсам криптопровайдеров Windows. Конструктор, вызываемый при создании объектов этого класса, параметров не содержит. Если значение длины секретного ключа не равно одному из трех допустимых значений (128, 192 или 256 бит), то генерируется исключение PlatformNotSupportedException.

Класс AesManaged представляет реализацию алгоритма симметричного шифрования AES в управляемом коде. Его конструктор не содержит параметров. При использовании объектов этого класса могут возникать исключения классов CryptographicException и InvalidOperationException (если данный класс не поддерживается платформой .Net в компьютерной системе пользователя).

Класс DESCryptoServiceProvider представляет реализацию криптоалгоритма блочного симметричного шифрования DES с помощью CryptoAPI. Конструктор этого класса не содержит параметров. Длина блока, ключа и обратной связи устанавливается в 64 бита. Если криптопровайдер не поддерживает алгоритм DES, то генерируется исключение класса CryptographicException.

Класс RC2CryptoServiceProvider представляет реализацию криптоалгоритма блочного симметричного шифрования RC2 с помощью CryptoAPI. Его конструктор не содержит параметров. Поддерживаются ключи длиной от 40 до 128 бит с шагом 8 бит. При использовании объектов этого класса могут возникать исключения классов CryptographicException и InvalidOperationException. Этот класс содержит дополнительные свойства:

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

  • bool UseSalt – признак добавления к секретному ключу 11 нулевых байт случайного значения (примеси, может использоваться при длине ключа 40 бит).

Класс RijndaelManaged содержит реализацию в управляемом коде алгоритма блочного симметричного шифрования Rijndael (оригинального варианта криптоалгоритма AES). Конструктор класса параметров не содержит. При использовании объектов этого класса возможна генерация исключения InvalidOperationException.

Класс TripleDESCryptoServiceProvider содержит реализацию криптоалгоритма блочного симметричного шифрования TripleDES («тройного» DES) с помощью CryptoAPI. Конструктор класса параметров не содержит. Значения длины ключа, длины блока и длины обратной связи устанавливаются соответственно в 192, 64 и 64 бита. Если криптопровайдер не поддерживает алгоритм TripleDES, то генерируется исключение класса CryptographicException.

При шифровании и расшифровании файлов в приложениях для платформы .Net применяются классы FileStream и CryptoStream.

Класс FileStream из пространства имен System. IO (поток байт, связанный с файлом) содержит следующие свойства:

  • string Name – имя файла, связанного с потоком;

  • long Position – текущая позиция в файле (при неправильном использовании этого свойства возможна генерация исключений NotSupportedException – поток не поддерживает изменение текущей позиции, IOException – ошибка ввода-вывода, ArgumentOutOfRangeException – отрицательное значение текущей позиции, EndOfStreamException – значение текущей позиции за концом файла);

  • long Length – длина потока в байтах (при использовании этого свойства возможна генерация исключений NotSupportedException, если поток не поддерживает изменение текущей позиции, и IOException, если при определении длины возникла ошибка);

  • bool CanRead – признак возможности чтения данных из файла;

  • bool CanWrite – признак возможности записи в файл;

  • bool CanSeek – признак возможности перемещения указателя текущей позиции в файле;

  • SafeFileHandle SafeFileHandle – дескриптор связанного с потоком файла, назначенный операционной системой (-1, если файл закрыт).

Возможно использование конструкторов класса FileStream со следующими параметрами:

  • путь к файлу вместе с его именем, режим открытия файла (константа перечисления FileMode: CreateNew – создание нового файла, Create – создание нового или перезапись существующего файла, Open – открытие существующего файла, OpenOrCreate – открытие существующего или создание нового файла, Truncate – открытие и усечение до 0 существующего файла, Append – открытие существующего с перемещением указателя текущей позиции в конец файла или создание нового файла);

  • путь к файлу вместе с его именем, режим открытия файла, режим использования файла (константа перечисления FileAccess: Read – только чтение, Write – только запись, ReadWrite – возможны чтение и запись);

  • путь к файлу вместе с его именем, режим открытия файла, режим использования файла, режим совместного доступа к файлу (константа перечисления FileShare: None – любые другие попытки доступа к файлу возможны только после его закрытия, Read – файл может быть повторно открыт для чтения, Write – файл может быть повторно открыт для записи, ReadWrite – файл может быть повторно открыт для чтения и записи, Delete – файл может быть удален до его закрытия);

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

При создании объекта класса FileStream возможна генерация исключений IOException (попытка создания нового файла с уже существующим именем), UnauthorizedAccessException (попытка перезаписи существующего скрытого файла), FileNotFoundException (попытка открытия несуществующего файла), ArgumentException (попытка чтения из усеченного до 0 файла), NotSupportedException (попытка чтения за концом файла), SecurityException (отсутствие у процесса необходимых разрешений на действие с файлом).

Операции ввода-вывода данных при использовании объектов класса FileStream доступны через методы:

  • int Read(byte[] array, int offset, int count) – чтение count байт в буфер array со смещением offset байт относительно его начала и получение фактического количества прочитанных байт;

  • void Write(byte[] array, int offset, int count) ‒ запись count байт из буфера array со смещением offset байт относительно его начала;

  • long Seek(long offset, SeekOrigin origin) – перемещение указателя текущей позиции файла на offset байт относительно origin (возможные значения перечисления SeekOrigin: Begin – начало файла, Current – текущая позиция, End – конец файла) и возвращение новой текущей позиции;

  • void Flush() – запись данных из буфера ввода-вывода в файл (сохранение в нем всех изменений);

  • void Dispose() – закрытие потока, освобождение всех связанных с ним ресурсов, запись в файл всех произведенных изменений;

  • void Close() – закрытие потока и освобождение всех связанных с ним ресурсов (например, дескриптора файла).

Класс CryptoStream из пространства имен System. Security. Cryptography (поток данных для шифрования и расшифрования) включает основные свойства, аналогичные свойствам класса FileStream, кроме Name и SafeFileHandle. Конструктор класса CryptoStream имеет параметры:

  • поток данных, которые будут зашифровываться или расшифровываться (например, объект класса FileStream);

  • объект криптографических преобразований, которые будут применяться к данным из потока (например, результат применения метода CreateEncryptor к объекту одного из классов-наследников абстрактного класса SymmetricAlgorithm);

  • режим использования открываемого криптографического потока данных (константа перечисления CryptoStreamMode: Read – чтение данных из потока, Write – запись данных в поток).

При ошибке создания объекта класса CryptoStream генерируется исключение ArgumentException.

Основными методами класса CryptoStream являются методы Read, Write, Seek, Flush, Close и Dispose, аналогичные соответствующим методам класса FileStream.

Генерация ключа симметричного шифрования возможна одним из двух способов:

  1. из запоминаемой парольной фразы путем ее предварительного хеширования;

  2. с помощью генератора случайных чисел.

Для получения ключа симметричного шифрования-расшифрования из парольной фразы может использоваться абстрактный базовый класс библиотеки FCL DeriveBytes и его наследники:

  • PasswordDeriveBytes (генерация ключа из пароля по алгоритму PBKDF1, определенному в стандарте PKCS #5 password-based cryptography specification version 2.0 с возможностью использования алгоритмов хеширования SHA1 или MD5);

  • Rfc2898DeriveBytes (генерация ключа шифрования из пароля с помощью алгоритма HMACSHA1).

Класс PasswordDeriveBytes из пространства имен System. Security. Cryptography имеет следующие свойства:

  • string HashName – имя алгоритма хеширования, который будет использоваться для генерации ключа из парольной фразы (возможна генерация исключения CryptographicException, если задано недопустимое имя алгоритма хеширования);

  • int IterationCount – количество итераций при выполнении хеширования парольной фразы;

  • byte[] Salt – массив байт примеси при создании криптографического ключа из парольной фразы.

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

Создание объекта класса PasswordDeriveBytes возможно с помощью конструкторов, имеющих следующие параметры:

  • парольную фразу и значение примеси;

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

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

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

Класс PasswordDeriveBytes включает следующие методы:

  • byte[] CryptDeriveKey(string algname, string alghashname, int keySize, byte[] rgbIV) – получение ключа длиной keySize бит (если указан 0, то используется длина ключа по умолчанию для заданного алгоритма шифрования) для алгоритма шифрования algname с помощью алгоритма хеширования alghashname и начального вектора для операции блочного симметричного шифрования rgbIV;

  • byte[] GetBytes(int cb) – получение псевдослучайного ключа длиной cb байт;

  • void Reset() – сброс состояния объекта.

Класс CspParameters (параметры криптопровайдера и поддерживаемых им контейнеров ключей) имеет свойства:

  • CryptoKeySecurity CryptoKeySecurity – права доступа и параметры аудита для контейнера ключей [10];

  • CspProviderFlags Flags – флаги режима работы криптопровайдера (перечисление CspProviderFlags включает значения NoFlags, если никакие флаги не используются, UseMachineKeyStore, если используется контейнер ключей из профиля компьютера, UseDefaultKeyContainer, если используется контейнер ключей по умолчанию, UseNonExportableKey, если используется не экспортируемый из контейнера секретный ключ, UseExistingKey, если используется текущий ключ, UseArchivableKey, если разрешено резервное копирование секретного криптографического ключа, UseUserProtectedKey, если требуется отображение диалогового окна при доступе к закрытому ключу из контейнера, NoPrompt, если криптопровайдер не информирует пользователя об использовании его закрытого ключа, CreateEphemeralKey, если будет создана случайная, эфемерная, пара асимметричных ключей, не сохраняемая при уничтожении объекта класса для асимметричного криптоалгоритма);

  • SecureString KeyPassword – пароль (PIN-код), необходимый для доступа к контейнеру ключей на смарт-карте (класс SecureString будет описан далее);

  • IntPtr ParentWindowHandle – дескриптор родительского окна для диалога, отображаемого при попытке доступа к контейнеру ключей на смарт-карте.

В классе CspParameters также определены общие (публичные) поля:

  • string KeyContainerName – имя контейнера ключей;

  • int KeyNumber – тип пары ключей в контейнере (значение 1, Exchange, соответствует ключам, предназначенным для обмена секретными ключами симметричного шифрования, а значение 2, Signature, соответствует ключам вычисления и проверки электронной цифровой подписи; значением по умолчанию является 1);

  • string ProviderName – имя криптопровайдера;

  • int ProviderType – код типа криптопровайдера (например, для совместимости с криптосистемой DSA используется значение 13, а с криптосистемой RSA – 1).

Класс CspParameters имеет конструктор без параметров, создающий объект для криптопровайдера по умолчанию типа 1 (использование криптосистемы RSA для вычисления и проверки ЭЦП, а также для обмена секретными ключами симметричного шифрования). Другие конструкторы класса CspParameters имеют параметры:

  • int dwTypeIn – создание объекта для криптопровайдера по умолчанию заданного параметром типа;

  • int dwTypeIn,string strProviderNameIn – создание объекта для криптопровайдера с именем strProviderNameIn типа dwTypeIn;

  • int dwTypeIn,string strProviderNameIn, string strContainerNameIn – создание объекта для криптопровайдера с именем strProviderNameIn типа dwTypeIn и контейнером ключей с именем strContainerNameIn;

  • int providerType,string providerName,string keyContainerName,CryptoKeySecurity cryptoKeySecurity,IntPtr parentWindowHandle – создание объекта для криптопровайдера с именем providerName типа providerType и контейнером ключей с именем keyContainerName, размещенным на смарт-карте и для доступа к которому используется диалоговое окно, являющимся дочерним окном для окна с дескриптором parentWindowHandle (параметр cryptoKeySecurity задает права доступа и параметры аудита для контейнера ключей);

  • int providerType,string providerName,string keyContainerName,CryptoKeySecurity cryptoKeySecurity,SecureString keyPassword) – создание объекта для криптопровайдера с именем providerName типа providerType и контейнером ключей с именем keyContainerName, размещенным на смарт-карте и для доступа к которому используется пароль keyPassword (параметр cryptoKeySecurity задает права доступа и параметры аудита для контейнера ключей).

В классе SecureString (секретный пароль) из пространства имен System. Security определено свойство

int Length (длина пароля).

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

  • void AppendChar(char c) – добавление заданного символа в конец пароля;

  • void Clear() – удаление всех символов из пароля;

  • SecureString Copy() – создание нового объекта с копией пароля из текущего объекта;

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

  • void InsertAt(int index,char c) – вставка символа c в позицию index пароля;

  • bool IsReadOnly() – признак возможности использования пароля только для чтения;

  • void MakeReadOnly() – определение пароля доступным только для чтения;

  • void RemoveAt(int index) – удаление символа в позиции index из пароля;

  • void SetAt(int index,char c) – изменение символа пароля в позиции index на значение символа c.

Класс Rfc2898DeriveBytes из пространства имен System. Security. Cryptography имеет свойства IterationCount и Salt, аналогичные соответствующим свойствам класса PasswordDeriveBytes.

Создание объекта класса Rfc2898DeriveBytes возможно с помощью конструкторов, имеющих следующие параметры:

  • парольную фразу и значение примеси;

  • парольную фразу и длину случайной примеси;

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

  • парольную фразу, длину случайной примеси и количество итераций при генерации ключа из парольной фразы.

Класс Rfc2898DeriveBytes содержит методы GetBytes и Reset, аналогичные соответствующим методам класса PasswordDeriveBytes.

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

Для получения случайного ключа шифрования потребуется использовать абстрактный базовый класс библиотеки FCL RandomNumberGenerator и его наследник RNGCryptoServiceProvider. Класс RNGCryptoServiceProvider из пространства имен System. Security. Cryptography имеет конструктор без параметров, а также конструктор с параметрами, передаваемыми криптопровайдеру Windows (объектом класса CspParameters).

Основные методы класса RNGCryptoServiceProvider:

  • void GetBytes(byte[] data) – заполнение буфера data массивом случайных чисел;

  • void GetNonZeroBytes(byte[] data) – заполнение буфера data массивом случайных ненулевых значений.

При использовании случайного ключа шифрования необходимо позаботиться о его безопасном распространении между отправителем (создателем) и получателем (пользователем) конфиденциальной информации. Это может быть выполнено с помощью методов CreateKeyExchange и DecryptKeyExchange классов для обмена секретными ключами симметричного шифрования RSAOAEPKeyExchangeFormatter и RSAOAEPKeyExchangeDeformatter или RSAPKCS1KeyExchangeFormatter и RSAPKCS1KeyExchangeDeformatter.

Класс RSAOAEPKeyExchangeFormatter из пространства имен System. Security. Cryptography имеет свойство RandomNumberGenerator Rng, определяющее объект для генерации случайной числовой последовательности.

Класс RSAOAEPKeyExchangeFormatter включает конструктор без параметров и конструктор с параметром типа AsymmetricAlgorithm, содержащим объект с реализацией алгоритма асимметричного шифрования. Этот объект предоставляет открытый ключ, на котором будет зашифрован случайный секретный ключ.

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

  • byte[] CreateKeyExchange(byte[] rgbData) – получение секретного ключа rgbData, зашифрованного открытым ключом получателя конфиденциальной информации с помощью асимметричного алгоритма;

  • void SetKey(AsymmetricAlgorithm key) – задание алгоритма асимметричного шифрования key, предоставляющего открытый ключ.

Класс RSAOAEPKeyExchangeDeformatter из пространства имен System. Security. Cryptography имеет конструктор без параметров и конструктор с параметром AsymmetricAlgorithm, содержащим объект с реализацией алгоритма асимметричного шифрования. Этот объект предоставляет закрытый (личный) ключ, с помощью которого будет расшифрован случайный секретный ключ.

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

  • byte[] DecryptKeyExchange(byte[] rgbData) – восстановление секретного ключа из зашифрованного блока rgbData закрытым ключом получателя конфиденциальной информации с помощью асимметричного алгоритма;

  • void SetKey(AsymmetricAlgorithm key) – задание алгоритма асимметричного шифрования key, предоставляющего закрытый ключ.

Классы RSAPKCS1KeyExchangeFormatter и RSAPKCS1KeyExchangeDeformatter из пространства имен System. Security. Cryptography аналогичны классам RSAOAEPKeyExchangeFormatter и RSAOAEPKeyExchangeDeformatter, но реализуют другой вариант криптографической асимметричной системы RSA для обмена секретными ключами симметричного шифрования.

Рассмотрим примеры использования криптографических классов библиотеки FCL для обеспечения конфиденциальности данных с помощью алгоритмов симметричного шифрования.

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