Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Министерство общего и профессионального образования РФ
Уральский государственный технический университет – УПИ
Кафедра молекулярной физики
РАЗРАБОТКА И УСТАНОВКА КРИПТОПРОВАЙДЕРА ДЛЯ КОМПЬЮТЕРОВ ПОД УПРАВЛЕНИЕМ ОС WINDOWS
Отчет к проблемному заданию по дисциплине
«Языки программирования»
Исполнители: Группа: Руководитель: Дата: |
Фт-25024 |
Екатеринбург
2006
Содержание
Введение. 3
Постановка задачи. 6
Обзор проблемной области. 6
Решение. 10
Установка криптопровайдера MinimalCrypt (ОС Windows 98 SE) 11
Приложение 1 – Выдержка из MSDN «Writing a CSP». 12
Приложение 2 - Описание функций библиотеки криптопровайдера (источник: MSDN Library – January, 2004) 13
Введение
Криптография – наука о защите данных – динамично развивается сегодня в связи с актуальностью проблем защиты данных от несанкционированного доступа. Основная область применения методов криптографии – данные, хранящиеся на ПК и передаваемые с его помощью. Алгоритмы криптографии, используя математические методы, комбинируют открытые входные данные (хранящиеся в двоичном формате) и ключ шифрования (двоичная последовательность), в результате чего получается набор данных, недоступный для прямого чтения. Применение криптографии обеспечивает относительно надёжное хранение, передачу данных и предотвращение их чтения несанкционированной стороной. Применяя хороший алгоритм шифрования, можно максимально усложнить временные на взлом защиты и расшифровку текста подбором ключа (brutal force).
В сфере защиты компьютерной информации криптография применяется в основном для: шифрования и дешифрования данных; а также создания и проверки цифровых подписей. Шифрование данных позволяет ограничить доступ к конфиденциальной информации, сделать ее нечитаемой и непонятной для посторонних. Применение цифровых подписей оставляет данные открытыми, но дает возможность верифицировать отправителя и проверять целостность полученных данных.
В операционных системах семейства Windows разработан CryptoAPI, позволяющий абстрагироваться от конкретного алгоритма шифрования и представляющий собой стандартизированную обертку для используемых в системе средств защиты информации. Crypto API является основой средств защиты Microsoft Internet Security Framework. В его функционал входят базовые средства защиты безопасных каналов и подписи кода. Интерфейс CryptoAPI обеспечивает API высокого уровня для аутентификации, подписи, шифрования/дешифрации, а также полную инфраструктуру защиты с общим ключом. Благодаря данной инфраструктуре, можно воспользоваться функциями управления сертификатами, такими как запрос на создание сертификата, его сохранение или верификация. Реализация функций, предоставляемых Crypto API производится криптопровайдером.
Криптопровайдер – это динамически подключаемая библиотека, реализующая криптографические функций со стандартизованным интерфейсом. Криптопровайдер также играет роль хранилища для ключей всех типов. Подобная архитектура позволяет использовать различные алгоритмы шифрования в системе с минимальными изменениями исходного кода приложения, так как интерфейс (т. е. название и параметры функций) не меняется. Программисту, работающему с CryptoAPI необходимо знать лишь наборы криптографических стандартов (шифрования, хеширования, цифровой подписи и несимметричного обмена ключами), которые реализуют криптопровайдеры, установленные в системе.
Кроме различия в реализуемых стандартах, криптопровайдеры отличаются способом физической организации ключевой базы. С точки зрения программирования, способ физической организации ключевой базы значения не имеет. Однако он весьма важен с точки зрения эксплуатации и безопасности системы. Существующие криптопровайдеры Microsoft хранят свою ключевую базу на жестком диске (в Реестре или в файлах), а криптопровайдеры фирм Gemplus, Schlumberger и Infenion, которые включены в поставку Windows 2000, Windows XP и Windows ME, – на смарт-картах.
Каждый криптопровайдер характеризуется собственным именем и типом. Его имя – набор символов, по которому система распознает криптопровайдер. Так, базовый криптопровайдер Microsoft назван «Microsoft Base Cryptographic Provider vl.0». Тип криптопровайдера – целое число (в нотации языка С – DWORD), значение которого идентифицирует набор поддерживаемых алгоритмов цифровой подписи и несимметричного обмена ключей. Уже упомянутый криптопровайдер «Microsoft Base Cryptographic Provider vl.0» имеет тип 1 (в файле WinCrypt. h определена константа PROV RSAFULL), этот тип криптопровайдеров реализует в качестве алгоритмов цифровой подписи и несимметричного обмена ключей стандарт RSA. Другой базовый криптопровайдер Microsoft – «Microsoft Base DSS and Diffie-Hellman Cryptographic Provider» имеет тип 13 (в файле WinCrypt. h определена константа PROV_DSS_DH), этот тип криптопровайдеров реализует в качестве алгоритма цифровой подписи стандарт DSS, а для реализации ключевого обмена использует алгоритм Диффи – Хеллмана.
Разумеется, в системе могут существовать несколько различных криптопровайдеров одного и того же типа. Криптопровайдеры фирм Gemplus, Schlumberger и Infenion имеют тот же тип, что и криптопровайдер «Microsoft Base Cryptographic Provider vl.0» и реализуют цифровую подпись и ключевой обмен по алгоритму RSA.
Таким образом, для работы с набором криптопровайдеров в системном реестре содержится список имен всех криптопровайдеров. С каждым именем связан тип криптопровайдера и имя библиотеки, реализующей криптопровайдер. Прежде чем использовать какие-либо функции CryptoAPI, необходимо запустить криптопровайдер.
Постановка задачи
Задачей данной работы является разработка криптопровайдера для ОС Windows. Необходимо создать динамически подключаемую библиотеку, реализующую функции Crypto API в соответствии со стандартом и зарегистрировать ее в системе Windows
Обзор проблемной области
Криптопровайдер представляет собой динамическую библиотеку (DLL), которая экспортирует набор из 23 обязательных функций, соответствующим образом зарегистрированную в системном реестре Windows.
Для того чтобы зарегистрировать в криптопровайдер в реестре, необходимо создать ветку «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\ Defaults\Provider\ИмяПровайдера» и записать следующие ключи:
– Image Path - полное имя файла библиотеки криптопровайдера
– Type – тип криптопровайдера
Также необходимо создать ветку «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\ Defaults\ProviderTypes\Type XXX», где XXX – тип криптопровайдера. В ней нужно создать ключи:
– Name – Имя криптопровайдера
– TypeName – Название типа криптопровайдера
Библиотека криптопровайдера должна содержать цифровую подпись Microsoft (из соображений безопасности видимо). Наличие цифровой подписи является обязательным критерием для использования криптопровайдера в системе.
Подписать библиотеку криптопровайдера позволяет утилита cspsign, разработанная корпорацией Microsoft. В MSDN утверждается, что после создания такой подписи «самопальный» криптопровайдер может быть использован в системе. Однако на деле это не так. Попытка запустить зарегистрированный и подписанный криптопровайдер не даст успеха, т. к. Windows не принимает подписи, сгенерированные cspsign. Все дело в том, что мы, конечные пользователи, используем release-версию Windows, в которой могут быть использованы только подписанные Microsoft криптопровайдеры (см приложение 1). Эту неприятность, как оказалось, можно обойти, заменив системный файл advapi32.dll его отладочной версией. Все необходимое для того, чтобы установить криптопровайдер, можно найти в пакете CSPDK (Crypto Service Provider Development Kit). В нем есть отладочные версии advapi32.dll для различных версий Windows. После того, как будут проделаны все эти операции, криптопровайдер можно будет использовать.
Как уже отмечалось ранее, криптопровайдер должен соответствовать стандарту. Ниже приведен список функций, которые должна предоставлять (экспортировать) библиотека криптопровайдера
Функции управления криптопровайдером
Функция | Краткое описание |
CPAcquireContext | Используется для получения дескриптора определенного ключевого контейнера в криптопровайдере. |
CryptGetProvParam | Возвращает параметры криптопровайдера. |
CryptReleaseContext | Используется для освобождения дескриптора криптопровайдера, созданного CPAcquireContext. |
CryptSetProvParam | Устанавливает параметры криптопровайдера. |
Функции работы с ключами и обмена криптографическими данными
Функция | Краткое описание |
CPDeriveKey | Создает сессионные криптографические ключи из ключевого материала. |
CPDestroyKey | Освобождает дескриптор ключа. |
CPExportKey | Используется для экспорта криптографических ключей и ключевых пар из ключевого контейнера криптопровайдера. |
CPGenKey | Генерирует случайные сессионные ключи и ключевые пары. |
CPGenRandom | Генерирует случайную последовательность |
CPGetKeyParam | Возвращает параметры ключа. |
CPGetUserKey | Возвращает дескриптор одной из постоянных ключевых пар. |
CPImportKey | Используется для импорта криптографического ключа в контейнер криптопровайдера. |
CPSetKeyParam | Устанавливает параметры ключа |
Функции шифрования и дешифрования
Функция | Краткое описание |
CPDecrypt | Используется для дешифрования данных. |
CPEncrypt | Используется для шифрования данных. |
Функции хеширования и цифровой подписи
Функция | Краткое описание |
CPCreateHash | Используется для инициализации хеширова ния потока данных. |
CPDestroyHash | Уничтожает объект хеш-функции. |
CPGetHashParam | Возвращает параметры объекта хеш-функции. |
CPHashData | Используется для добавления данных к объекту хеш-функции. |
CPHashSessionKey | Используется для добавления к объекту хеш-функции значения сессионного ключа. |
CPSetHashParam | Устанавливает параметры объекта хеш-функ ции. |
CPSignHash | Вычисляет значение ЭЦП от значения хеша, определенного дескриптором объекта хеширо вания. |
CPVerifу Signature | Осуществляет проверку подписи, соответствующей объекту хеширования. |
Подробнее обо всех этих функциях можно узнать в MSDN. Следует отметить, что каждая из них должна экспортироваться библиотекой. В противном случае библиотека не будет распознаваться системой как криптопровайдер.
Замечание: В системах с поддержкой CAPICOM (Crypto API for COM) обращение к криптопровайдеру возможно с помощью внутреннего COM-клиента, реализующего стандартные интерфейсы CAPICOM. Таким образом, теоретически, становится возможным, создав и зарегистрировав собственный сервер CAPICOM, подключить собственный криптопровайдер. (Достаточно подключить собственный COM-сервер CAPICOM, реализующий те же интерфейсы с теми же GUID)
Решение
В результате выполнения работы была создана библиотека криптопровайдера, обеспечивающая минимальную функциональность. Библиотека реализует функции, отвечающие за загрузку, выгрузку и проверку криптопровайдера, а также за генерацию случайных последовательностей. Остальные функции реализованы в виде заглушек. Библиотека носит чисто демонстративный характер. Основная ее задача – продемонстрировать возможность подключения собственного криптопровайдера в системах. В ходе выполнения работы выяснилось, что с помощью CSPDK собственный криптопровайдер может быть установлен только в ОС Windows следующих версий:
– Windows 98 SE
– Windows ME
– Windows NT 4 sp3, sp4, sp6
– Windows 2000, sp1, sp2
– Windows CE
Отладка и тестирование библиотеки производились под управлением ОС Windows 98 SE. Демонстрация приложения производится на компьютере под управлением Windows 2000 Server с использованием виртуальной машины Windows 98 SE. В системе удалось Windows XP зарегистрировать криптопровайдер, но не удалось воспользоваться им, поскольку в комплекте CSPDK нет измененной advapi32.dll для XP.
Установка криптопровайдера MinimalCrypt (ОС Windows 98 SE)
Для того, чтобы установить криптопровайдер MinimalCrypt в системе Windows 98 SE, необходимо:
1. Запустить Windows 98 в режиме MS DOS
2. Запустить файл Install.bat (командный файл замены advapi32.dll)
3. Перезагрузить Windows
4. Запустить TestSample. exe
Тестовое приложение TestSample проверяет наличие записей криптопровайдера в системном реестре и вносит их, если те отсутствуют. Приложение предназначено для демонстрации работы криптопровайдера MinimalCrypt, разработанного в ходе выполнения данной работы.
Приложение 1 – Выдержка из MSDN «Writing a CSP»
A cryptographic service provider (CSP) must be digitally signed by Microsoft to be used with the released versions of the Windows operating system. The digital signature separates applicable legal export controls on the CSP from the host operating system and applications, thereby allowing broader distribution of encryption-enabled products than would be possible under other circumstances. Generally, U. S. export law limits the export outside the United States or Canada of products that host strong encryption or an open cryptographic interface. The digital signature requirement effectively prevents arbitrary use of CryptoAPI and allows export of the host operating system and CryptoAPI-enabled removing encryption services from host systems and applications, CryptoAPI places the burden of U. S. encryption export restrictions squarely on the CSP vendor, who is subject to those controls regardless.
In addition, the operating system validates this signature periodically to ensure that the CSP has not been changed.
Microsoft's interests in applying signatures to CSPs are:
· To ensure the exportability of CryptoAPI-enabled systems and applications.
· To exercise due diligence under prevailing U. S. and other national export controls.
· To help maintain the integrity of the CSP.
Vendors should consult legal counsel or U. S. export authorities to determine whether an export approval or exemption applies to their CSP.
Questions and comments about the CSP signing mechanism, signing procedures, and CryptoAPI licensing policy can be sent by e-mail to *****@***com.
For assistance in the classification or export licensing of CSPs for export from the United States, CSP vendors can also consult the following office:
U. merce Department
Bureau of Export Administration
Office of Exporter Services
The U. merce Department's export license process, encryption export controls, and points of contact are described on their Web site at http://www. bxa. doc. gov/encryption/default. htm.
Microsoft will sign CSPs subject only to the limitations of U. S. export controls. Microsoft will sign CSPs from competitors. At present, CSPs are signed at the Microsoft facilities in Redmond, Washington, USA.
Приложение 2 - Описание функций библиотеки криптопровайдера (источник: MSDN Library – January, 2004)
Взято из отчета предыдущего года
CPAcquireContext(
OUT HCRYPTPROV *phProv,
IN LPCSTR szContainer,
IN DWORD dwFlags,
IN PVTableProvStruc pVTable)
Параметры
phProv
[out] Указатель на дескриптор криптопровайдера.
pszContainer
[in] Имя ключевого контейнера. Это указатель на строку, идентифицирующую ключевой контейнер. Оно не зависит от метода, используемого для хранения ключей. Некоторые криптопровайдеры хранят ключевые контейнеры на внешних носителях (смарт-картах, Touche memory), другие — в системном реестре или файлах. Если в dwFlags установлен флаг CRYPTVERIFYCONTEXT, тоpszContainer должен быть равен NULL. Если pszContainer равен NULL, то будет использоваться имя ключевого контейнера по умолчанию. Криптопровайдеры Microsoft в этом случае задают имя пользователя, вошедшего в систему, в качестве имени контейнера.
Приложения не должны применять такие ключевые контейнеры для хранения секретных ключей. Когда несколько приложений используют один и тот же контейнер, одно из приложений может изменить или уничтожить ключи, необходимые для работы других.
Приложения могут получить имя контейнера, с которым они работают, прочитав значение PPCONTAINER с помощью вызова функции CryptGetProvParam.
dwFlags
[in] Значение флагов.
pVTable
[in] структура вида:
typedef struct _VTableProvStruc {
DWORD Version;
FARPROC FuncVerifylmage;
FARPROC FuncReturnhWnd;
DWORD dwProvType;
BYTE* pbContextlnfo;
DWORD cbContextlnfo;
LPSTR pszProvName; } VTableProvStruc, *PVTableProvStruc;
Параметры
Version
Версия структуры. В различных операционных системах используются различные версии. В Windows NT 4.0 используется версия 1, состоящая только из трех параметров: Version, FuncVerifylmage a FuncReturnhWnd. Версия 2 используется в Windows 98. Она состоит уже из шести параметров. Версия 3,| используется, только начиная с Windows 2000.
FuncVerifyImage
Указатель на функцию проверки цифровой подписи. Эта функция передается в криптопровайдер для того, чтобы разработчик имел возможность вставить в код библиотеки проверку целостности дополнительных модулей, используемых криптоповайдером и имеющих соответствующую подпись.
FuncReturnhWnd
Указатель на функцию, которая возвращает дескриптор окна приложения для взаимодействия с пользователем.
dwProvType
Значение типа, запрашиваемого криптопровайдера.
pbContextlnfo
Указатель на буфер пользовательского контекста.
cbContextlnfo
Размер буфера пользовательского контекста.
PszProvName
Указатель на строку, содержащую имя криптопровайдера.
CPCreateHash(
IN HCRYPTPROV hProv,
IN ALG_ID Algid,
IN HCRYPTKEY hKey,
IN DWORD dwFlags,
OUT HCRYPTHASH *phHash)
Параметры
hProv
[in] Дескриптор криптопровайдера.
Algid
[in] Идентификатор используемого алгоритма хеширования.
hKey
[in] Если используется алгоритм хеширования с секретным ключом, например НМАС или MAC, то в этом параметре передаётся сессионный ключ для объекта хеш-функции. Ключ должен определять алгоритм блочного шифрования, например RC2, в режиме СВС.
Для алгоритмов, не требующих ключа, параметр должен быть равен нулю.
dwFlags
[in] Значения флагов.
phHash
[in/out] Адрес, по которому функция копирует дескриптор нового объекта хеш-функции.
CPDecrypt(
IN HCRYPTPROV hProv,
IN HCRYPTKEY hKey,
IN HCRYPTHASH hHash,
IN BOOL Final,
IN DWORD dwFlags,
IN OUT LPBYTE pbData,
IN OUT LPDWORD pcbDataLen)
Параметры
hKey
[in] Дескриптор сессионного ключа, применяемого для расшифрования данных. Приложение получает его, используя функцию CryptlmportKey или CryptGenKey.
Этот ключ определяет используемый алгоритм шифрования.
hHash
[in] Дескриптор объекта хеш-функции. Если данные одновременно расшифровываются и хешируются, то дескриптор объекта хеширования передается в этом параметре. В процедуру хеширования данные передаются после расшифрования. Эту возможность удобно использовать, если данные одновременно расшифровываются и проверяется ЭЦП.
До того как вызвать функцию CryptDecrypt, приложение должно получить дескриптор объекта хеш-функции, вызвав функцию CryptCreateHash. После расшифрования значение хеша можно получить вызовом функции CryptGetHashParam, подписать функцией CryptSignHash или передать для проверки ЭЦП в функцию CryptVerifу Signature.
Если значение хеша не вычисляется, этот параметр должен быть равен нулю.
Final
[in] Булева величина. Определяет, является ли переданный функции блок последним расшифрованным блоком данных. Она должна быть установлена TRUE, если это последний (или единственный) блок, и FALSE — в противном случае.
dwFlags
[in] Значения флагов.
pbData
[in/out] Буфер, содержащий данные для расшифрования. После расшифрования открытый текст помещается в тот же самый буфер.
pdwDataLen
[in/out] Указатель на значение DWORD, которое содержит длину буфера данных. При вызове функции этот параметр определяет число байт шифртекста в буфере pbData. Если используется блочный шифр, а признак Final — FALSE, это значение должно быть кратным длине блока шифра. Через этот параметр функция возвращает указатель на число байт открытого текста, помещенного в буфер pbData.
CPDeriveKey(
IN HCRYPTPROV hProv,
IN ALG_ID Algid,
IN HCRYPTHASH hHash,
IN DWORD dwFlags,
OUT HCRYPTKEY *phKey)
Параметры
hProv
[in] Дескриптор криптопровайдера.
Algid
[in] Идентификатор используемого алгоритма хеширования. Различные криптопровайдеры поддерживают различные алгоритмы шифрования.
hHash
[in] Дескриптор объекта хеш-функции.
dwFlags
[in] Флаги определяют тип создаваемого сессионного ключа.
phKey
[in/out] Адрес, по которому функция копирует дескриптор созданного ключа.
CPDestroyHash(
IN HCRYPTPROV hProv,
IN HCRYPTHASH hHash)
Параметры
hProv
[in] Дескриптор криптопровайдера.
hHash
[in] Дескриптор объекта хеш-функции.
CPDestroyKey(
IN HCRYPTPROV hProv,
IN HCRYPTKEY hKey)
Параметры
hProv
[in] Дескриптор криптопровайдера.
hKey
[in] Дескриптор удаляемого ключа
CPEncrypt(
IN HCRYPTPROV hProv,
IN HCRYPTKEY hKey,
IN HCRYPTHASH hHash,
IN BOOL Final,
IN DWORD dwFlags,
IN OUT LPBYTE pbData,
IN OUT LPDWORD pcbDataLen,
IN DWORD cbBufLen)
Параметры
hKey
[in] Дескриптор сессионного ключа, используемого для зашифрования данных.
hHash
[in] Дескриптор объекта хеш-функции.
Final
[in] Булева величина. Определяет, является ли переданный функции блок последним зашифрованным блоком данных.
dwFlags
[in] Значения флагов.
pbData
[in/out] Буфер, содержащий данные для зашифрования.
pcbDataLen
[in/out] Указатель на значение DWORD, содержащее длину данных.
cbBufLen
[in] Размер буфера pbData в байтах.
CPExportKey(
IN HCRYPTPROV hProv,
IN HCRYPTKEY hKey,
IN HCRYPTKEY hPubKey,
IN DWORD dwBlobType,
IN DWORD dwFlags,
OUT LPBYTE pbData,
IN OUT LPDWORD pcbDataLen)
Параметры
hExpKey
[in] Дескриптор ключа получателя ключевого блоба. Данные внутри экспортируемого ключевого блоба шифруются с использованием этого ключа. Это гарантирует, что только получатель ключевого блоба сможет расшифровать и использовать экспортируемый ключ.
Чаще всего это открытый ключ алгоритма ключевого обмена, принадлежащий получателю ключевого блоба. Однако определенные протоколы в некоторых криптопровайдерах требуют, чтобы это был сессионный ключ, принадлежащий получателю ключевого блоба.
В Windows 2000 поддерживается экспорт на симметричном ключе (Symmetric Key Wrap), однако эта возможность не поддерживается на более ранних платформах ни криптопровайдером Microsoft Base Cryptographic Provider, ни Microsoft Enhanced Cryptographic Provider.
Если тип ключевого блоба, определяемый параметром dwBlobТуре, установлен в PUBLICKEYBLOB, то этот параметр не используется и должен быть равен нулю.
Если тип ключевого блоба, определяемый параметром dwBlobТуре, установлен в PRIVATEKEYBLOB, то обычно этот параметр является дескриптором сессионного ключа, используемого для шифрования ключевого блоба. Некоторые криптопровайдеры позволяют устанавливать этот параметр в нуль, в этом случае приложение должно самостоятельно зашифровать блоб секретного ключа.
dwBlobType
[in] Тип ключевого блоба, предназначенного для экспорта ключа. В настоящее время определены следующие типы ключевых блобов.
♦ OPAQUEKEYBLOB
Используется для сохранения сессионных ключей в Schannel-криптопровайдерах. OPAQUEKEYBLOB не транспортируется и должен использоваться внутри криптопровайдера, создавшего ключевой блоб.
♦ PRIVATEKEYBLOB
Используется для транспортировки пары открытый/секретный ключи.
♦ SIMPLEBLOB
Используется для экспорта сессионных ключей.
♦ PUBLICKEYBLOB
Используется для экспорта открытых ключей ключевых пар подписи или ключевого обмена.
♦ PUBLICKEYBLOBEX
Используется для обмена значениями Р, G, и (G^X) mod P при обмене ключами по алгоритму Диффи — Хеллмана. Данный тип ключевого блоба в Windows 2000 не применяется и не поддерживается.
♦ SYMMETRICWRAPKEYBLOB
Используется для экспорта симметричного ключа на другом симметричном ключе. Формат экспорта описан в стандарте IETF SMIME X9.42.
dwFlags
[in] Значения флагов.
pbData
[out] Буфер данных, куда функция копирует ключевой блоб.
pcbDataLen
[in/out] Адрес размера ключевого блоба.


