Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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 LibraryJanuary, 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, то будет использоваться имя ключевого контейнера по умолчанию. Криптопровайдеры Mic­rosoft в этом случае задают имя пользователя, вошедшего в си­стему, в качестве имени контейнера.

Приложения не должны применять такие ключевые контейне­ры для хранения секретных ключей. Когда несколько прило­жений используют один и тот же контейнер, одно из приложе­ний может изменить или уничтожить ключи, необходимые для работы других.

Приложения могут получить имя контейнера, с которым они работают, прочитав значение 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 Enhan­ced 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] Адрес размера ключевого блоба.