CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
Компания Hewlett-Packard выпустила в продажу ноутбук модели HP Envy x360, основой для которого послужил ...
Компания G.Skill в эти дни объявила о выпуске новых представителей серии оперативной памяти Trident ...
Список материнских плат компании Biostar пополнился свежими моделями под поколения процессоров Intel ...
Похоже, что компания Gionee в эти дни очень сильно занята. Только недавно мы сообщали об анонсе ...
Компания Enermax в своем коротеньком пресс-релизе рассказала общественности о старте серии недорогих ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мышление в стиле Visual Basic

Андрей ГОНЧАРОВ ag@ukr.net

(Продолжение, начало см. в МК № 6, 9—10, 19, 25, 27, 29—30, 33, 36—38, 45, 48 (125, 128—129, 138, 144, 146, 148—149, 152, 155—157, 164, 167))

Пролог

Как известно, любая информация ценна, во-первых, своевременностью, во-вторых, достоверностью. К счастью, наша эпоха располагает средствами для обеспечения оперативного обмена информацией. Однако со вторым аспектом дела обстоят куда сложнее — в мире практически тотальной информатизации проблемы авторизации, конфиденциальности и пр. все равно остаются открытыми. Более того, чем глубже общество входит в «компьютеризированный образ жизни», тем острее встают вопросы защиты информации, ее безопасного хранения и столь же безопасного обмена ею.

Как вы, вероятно, понимаете, компании-разработчики ПО, и в особенности разработчики Операционных Систем, не могли не позаботиться об использовании наиболее удачных (надежных) средств защиты в своих ИТ-продуктах. Так, софтверный гигант №1 Майкрософт и многие почтовые клиентские программы ведущих производителей предоставляют более-менее серьезные гарантии авторизации доступа к хранилищам данных, конфиденциальности переписки. При этом используются те, что на «диком Западе» уже стали стандартом. Например, цифровые подписи — одна из наиболее ярких тенденций развития веб-бизнеса. Впрочем, Украину также ждет неминуемая вестернизация — готовится проект документа о введении цифровых подписей, зачем последует разнообразное их использование в критически важных сферах. Например, в электронной коммерции, которая уже признана существующей в нашей державе.

Однако не стоит строить иллюзий на предмет надежности алгоритмов шифрования: математически безукоризненные алгоритмы — всего лишь алгоритмы, а на всякий алгоритм, в принципе, можно найти управу. Вы можете возразить, будто многие из ныне действующих стандартов, основанные на случайных сочетаниях, считаются надежными, и что их надежность обоснована математическими умами с мировой известностью. Но не следует забывать о том, что такое «случайность» в компьютерном контексте. Расшифровка на первый взгляд надежно упрятанного, запакованного и скрепленного семью печатями сообщения — всего лишь дело времени. Мы сейчас не говорим о сроках — но факт остается фактом. А если учесть стремительные темпы роста сегодняшних мегагерцевых показателей, можно прийти к выводу, что вчерашние супернавороченные методы шифрования завтра-послезавтра — пара дней работы вашего домашнего компьютера с программулей, использующей так называемый «метод грубой силы». В чем он заключается? Да в простом переборе вариантов паролей, ключей и т. д. по словарю. И уже неважно, насколько запутанным и математически грамотным является алгоритм — в ходе перебора вариаций на тему правильного пароля этот алгоритм использоваться не будет вообще — нам важен результат. Он или есть, или его, как говорится, еще нет... Опять-таки, другая сторона медали: при нынешних мощностях машин самые передовые методы шифрования гарантируют «Brute-Force-взлом» за время, исчисляемое сотнями лет... Причем, увеличение «битности» на порядок удваивает/утраивает время расшифровки. (Пример для наших маленьких читателей: сколько чисел можно создать из двух знаков? Правильно — 99. А из трех?)

В кругах специалистов, так или иначе связанных с обеспечением компьютерной безопасности, целостности информации или, к примеру, распределением неких прав доступа к ней, бытует мнение: чем «стандартнее» средство защиты, тем «стандартнее» средство взлома. Вы можете, конечно, не согласиться с этой точкой зрения, ссылаясь на бюджет некоторых гигантов программного обеспечения, и привести многочисленные примеры использования стандартных средств в сфере массовой электронной коммерции. Однако не так давно в Интернете появились программы Advanced ... Password Recovery Kit, где вместо троеточия можно подставить такие слова как PDF, Zip и др. Автора «пакета восполнения» (русского, работавшего по контракту в Штатах) постигла не самая завидная участь (НТВ поспешило известить) — законодательство США предусматривает более суровое наказание за махинации, т. н. «хакинг» и другие разновидности незаконных деяний в этой области, нежели российское. В Британии, к слову, это дело подвели под статью «террор» (кстати, весьма любопытно, насколько эти меры пресечения/наказания модернизировались после заокеанских событий одиннадцатого сентября?)... Все верно: мир еще раз убедился, что взлом алгоритма — дело времени. Возможно, ларчик открывается проще... с другой стороны...

Однако не будем вдаваться в аллегории или впадать в отчаяние — скорее всего, у вас не будет столь критических ситуаций, когда условия конфиденциальности потребуют сотен лет работы процессора(!) или самоотверженному труду коллектива хакеров, подобных тем, что ломали давеча RC5 :-). Средствами любого из языков программирования, поддерживающего вызовы Системных Функций (Интерфейс API) для ОС Windows — будь то 95, 98, NT, Me или XP, — можно сколотить более-менее криптонадежное приложение в стиле MS Exchange, приложения для защищенного обмена сообщениями на основе системы Public/Private Keys... Основа — в API. В данном случае (в случае с Win 9x + NT) мы располагаем средством, которым пользуется и ваш любимый The Bat, и MS Exchange, и Internet Explorer, который америкосы юзают в ходе своих онлайн-покупок... И имя ему —CryptoAPI.

Шифрование

Вот и подходит к концу первый период в изучении Visual Basic — будем считать, что вы научились работать с текстом, визуальными компонентами и Объектами в его среде. И каким бы нелогичным и непоследовательным ни было наше движение от истоков до полноводного устья этой реки, от функции и ее отличий от процедуры или понимания и освоения техники ООП до создания подобия плагин-системы в VB 6.0, ко мне до сих пор поступает масса писем, в которых воодушевленный Читатель нет-нет да подкинет пару-тройку отличных идей. Что самое интересное в этой ситуации, так это то, что многим удалось повлиять на ход событий. И вот я в который раз повторяюсь: следующая тема — Интернет-браузер своими руками... Ан нет! Прежде всего — криптографические приемы «Окон», а также все, что с этим связано. Того требует наибольшее количество читателей. Однако прежде чем начать разговор о CryptoAPI, я бы хотел сообщить, что к теме МайКомПада мы еще не раз вернемся (программка вызвала некоторый интерес не столько у разработчиков, сколько у простых пользователей... Кто б мог подумать???) — в любом случае, многое из того, что будет рассматриваться в дальнейших выпусках, может быть реализовано и в качестве плагина к МКП. Периодически просматривайте сообщения на http://www.vb.kiev.ua, и вы будете в курсе событий на этом фронте — независимо от того, по какому пути пойдет рассказ о программировании в среде VB 6.0. Кроме того, остались незакрытыми многие темы, как-то: CSS (вспоминайте — мы имеем дело с набором StyleSheet), экспорт в HTML и др.

Итак, начну вот с чего. Мне по роду деятельности весьма часто приходится что-либо прятать от глаз людских, что-то, откладывая в долгий ящик, шифровать стандартными и «не очень стандартными» средствами, что-то утаивать от начальства и, кстати, от коллег. Причин много — уверен, вы тоже не «расшариваете» по сетке свою личную папку с личными текстовками на тему «большой и чистой любви» или с обычными RAS-паролями, базой клиентов своих менеджеров, или, что еще более чудовищно, реальной бухгалтерией :-)... Конечно, можно ограничиться Sharing`ом лишь одной единственной, публичной папочки, и при этом, как может многим показаться, доступ будет открыт только к ней. Стоп. Не стану долго мучить новичков-пользователей, но это не методы защиты. И даже хранением суперсекретной информации на переносимых драйвах нельзя гарантировать ее сохранность (наоборот!) Да, существуют программы-затиралки, программы-локеры директорий, дисков и т. д. — однако кто вам даст голову наотрез, что вся эта система не рухнет вместе с «файлами по работе»? И как вы представляете отправку по почте защищенного таким образом файлика? :-)

Намного проще зашифровать некоторые файлы с использованием паролей, ключей и пр. — заручившись помощью криптостойких Оконных API-функций (читай выше), вы сможете добиться быстрого(!) доступа к защищенной информации, и притом на 99.9 оставаться уверенным, что, помня пароль, вы откроете файл завтра.

А почему бы не использовать чужие, готовые разработки из области шифрования целых папок с текстовыми файлами? А потому, что разработав собственный код, можете включить его как плагин к программе, которой пользуетесь ежедневно, и будете вправе шифровать обрабатываемую информацию не выходя из нее. Удобно!

<mcvb-019-001.tif>

Что такое CryptoAPI?

Первое, на что хотелось бы намекнуть (в который раз!): слабы в отношении API? — читайте старые уроки «Мышления в стиле Visual Basic». На моем сайте (http://www.vb.kiev.ua) вы найдете все прошлые выпуски в виде одного цельного PDF-файла (это уже около 6 Мб). Сразу же отмечу: CryptoAPI — это типичный для Бейсика «язык» объявлений API, ничуть не проще и не сложнее, нежели функции отправки сообщений окнам или SysTray-иконка... Как и все остальные Си-рожденные Вин-функции, CryptoAPI следует оформлять тем же образом:

Об особенностях типов передаваемых данных я уже как-то говорил. Сейчас я не имею возможности все повторять — следуйте указаниям, изложенным выше.

Так что же такое CryptoAPI? Это набор функций, которыми пользуется некоторое количество программ, входящих в состав ОС Windows 9x плюс еще некоторое неучтенное количество внешних, «левых» типа The Bat! (сорри, конечно...). Со времен Win95 эти функции ОС устанавливались вместе с MS Internet Explorer 3.02 (это одна из причин, по которым в минимальных требованиях того или иного постороннего ПО-продукта прописан IE3.02+). Позднее, с выходом новых «несерверных» операционок, они лишь совершенствовались, видоизменяясь и видоизменяясь. И вот, видоизмененные, они вошли в состав ядра ОС Win 2000. Грубо говоря, серверная часть лагеря Windows должным образом уделяет внимание аспекту CryptoAPI. Хм... Страшно предположить обратное :-).

Что можно сказать в отношении набора этих функций? Хотя бы то, что, предвидя неминуемые изменения в пределах крипт-компонентов, корпорация реализовала сию технологию как гибкую и настраиваемую систему... плагинов. Ну, понятное дело, вы не найдете в меню кнопки «Пуск» подменю Plugins... (неплохая, кстати, мысль), однако средствами другой, уже стандартной функции, вполне реально извлечь данные об ОС и ее криптологическом потенциале. Таким образом, добавление в Систему новых криптослужб не повлияет на выполнение программ, рассчитанных на более старые (или просто другие!) службы. Новые, как правило, привносятся через Service Pack`и или с новой версией браузера IE.

На языке Microsoft каждый из подобных Crypto-компонентов называется Cryptographic Service Provider (CSP). Каждый из «провайдеров» (вообще-то общепринятым термином является «служба», однако иногда я предпочитаю употреблять первый термин во избежание неминуемых недоразумений. Сервис — это один из способов выполнения программы. Крипт-программа также может запущена как сервис — служба на NT-машинке) предоставляет некие опции, в зависимости от конкретного алгоритма. Например, некоторые из алгоритмов (т. е. функции, отвечающие за данные сервисы и аргументы для них) принимают нетривиальный набор данных.

Вы можете положиться на библиотеку, а заодно на добросовестность автора, и оставить нечто на усмотрение алгоритма — но можете и переопределить дефолт-установки. Об этом читайте ниже. Службы шифрования обладают также и некоторыми свойствами — например, типом.

Работа с такими CSP заключается (примитивно) в открытии контекста CSP, использовании полученного контекста и, ясное дело, закрытии контекста CSP. Несоблюдение какого-либо из условий этой схемы приведет к ошибке на уровне Системы, так что приготовьтесь к «холодной перезагрузке». Ах, да — не забудьте сохранять вовремя проекты...

Открытие CSP

Вся канитель с провайдерами шифрования должна начинаться с процедуры открытия контекста выбранного CSP. Это — функция CryptAcquireContext.

Вероятно, вы читали прошлые уроки по Win32 API в VB 6.0. Тогда вы в курсе дела и знаете, что в большинстве случаев Система вкладывает в переданные аргументы некоторые результаты. Точно так же работают и CryptoAPI (в сущности, различать их вовсе и не нужно; природа их едина).

Так, первый аргумент типа Long будет содержать дескриптор контекста CSP. Этот дескриптор впоследствии и будет использоваться в программном коде в качестве описания того, с чем бы вы хотели иметь дело (Description = Описание; ничего общего с указателями здесь нет).

Второй аргумент — имя контейнера ключей. Если передана пустая строка (vbNullString), «Форточки» будут использовать регистрационное имя пользователя ОС. Настоятельно не рекомендуется использовать такой вариант — мало ли кто/что/зачем изменит имя текущего пользователя сеанса...

Заметка: этот аргумент вам ничего не вернет.

Третьим параметром является имя провайдера CSP. Передавая пустую строку, вы даете понять Системе, что готовы на ее default-предустановки. Этот аргумент также не возвращает новых значений. Существуют константы предопределенных имен провайдеров, которые можно передавать в качестве третьего аргумента:

Передача в третий параметр пустой строки (вы уже поняли, что в отношении API это отнюдь не дабл-кавычки!) означает вариант по умолчанию. В принципе, можно и так — меньше проблем, меньше писанины... А работает не хуже :-).

Четвертым аргументом считают тип провайдера. Возможные варианты приведены в таблице чуть ниже.

Пятым аргументом являются опции открытия контекста. Ниже приведены возможные варианты и описания:

&HF0000000 — без использования личных ключей. Если использован этот флаг, второй параметр CryptAcquireContext должен получить vbNullString;

&H8 — создать новый контейнер ключа (значение — во втором параметре!!! Иначе — катастрофа);

&H20 — Использовать контейнер в качестве имени зарегистрированного пользователя;

&H10 — Удалить контейнер, указанный во втором параметре функции CryptAcquireContext. Если же во втором параметре пустая строка, будет уничтожен контейнер по умолчанию;

&H40 — только Win2K(!): Не использовать UI.

Наконец, синтаксис объявления функции:

Закрытие контекста провайдера производится аналогично — просто передайте функции CryptReleaseContext значение, полученное от CryptAcquireContext (вложенное в первый аргумент-носитель); в качестве второго — ноль:

Перечисление служб (провайдеров)

За перечисление Crypto-служб отвечает CryptEnumProviders. Эта функция возвращает данные логического типа (boolean в разрезе VB. Однако при использовании результатов от вызовов API необходимо преобразование типов — используйте CBool). Что это значит? Это значит, что, используя указанную функцию и счетчик перечисления, вы можете убедиться, установлен ли провайдер, соответствующий константе со значением счетчика.

Объявление функции:

Передаваемые данные функции должны иметь тип Long, за исключением предпоследнего (pszProvName), который, являясь строкой фиксированной длины, заполняется символами с ASCII-кодом 0 —vbNullString.

Первым аргументом является счетчик перечисления. Как и в массивах C++, начальное значение — ноль.

Второй и третий аргументы зарезервированы — передавайте ноль и будете спокойны.

Четвертый станет контейнером для переданного типа провайдера. Только не думайте, что вам прямо на блюдечке подадут удобочитаемое описание типа провайдера с автографом CEO MS... Ниже приведена таблица получаемых значений и, соответственно, константы, которым соответствуют эти значения:

PROV_RSA_FULL 1*

PROV_RSA_SIG 2

PROV_DSS 3

PROV_FOTEZZA 4

PROV_MS_EXCHANGE 5

PROV_SSL 6

PROV_RSA_CHANNEL 12

PROV_DSS_DH 13

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

Пятый аргумент будет нести имя провайдера, причем если передана пустая строка (vbNullChar), то шестой передаст длину буфера, т. е. длину той самой фиксированной строки. Если же передана строка известной длины, вы обязаны передать в шестом аргументе эту длину, иначе — ноль. Тип —Long.

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © www.sector.biz.ua 2006-2015 design by Vadim Popov