| Вернуться на сайт |
Пример 7: Хэш-функции
В этой статье мы немного коснемся темы криптографии, а также рассмотрим общие принципы создания хэш-образов и работы функций. Для данного примера понадобится только средство программирования, в моем случае это Borland C++ Builder 6.
Начну с того, что криптография занимается методами преобразования информации, которые бы не позволили легко извлечь ее из сообщений. При этом адресату передается уже не сама защищаемая информация, а результат ее преобразования с помощью шифра. Но кроме угрозы перехвата и получения доступа к информации существуют и другие угрозы. В частности, угроза изменения (подделки) передаваемой информации. Хэш-функции как раз и используются для обнаружения модификации информации (в частности для электронной подписи). Также хэш-функции применяются в системах аутентификации для проверки паролей – открытый пароль пользователя не должен храниться в системе, вместо него хранится его хэш, который затем и сравнивается с хэшем от пароля, вводимого пользователем при входе в систему.
Хэш-функции являются одним из важных элементов криптосистем за счет своего основного свойства - их относительно легко вычислить, но почти невозможно расшифровать. Хэш-функция на входе имеет исходные данные переменной длины, а возвращает строку фиксированного размера (иногда называемую дайджестом сообщения - MD).
Большинство популярных хэш-функций генерируют хэш длиной 128 бит и более. Примерами наиболее распространенных хэш-функций являются MD5 и SHA. Конечно, можно заниматься самому разработкой алгоритмов шифрования, но существует возможность воспользоваться готовыми. Уже несколько лет компания Microsoft включают в новые версии операционных систем Windows средства для реализации технологий компьютерной безопасности, причем доступ к ним выполняется через вызовы функций специального интерфейса прикладного программирования CryptoAPI.
Криптографический интерфейс прикладного программирования (CryptoAPI) представляет собой набор функций, которые можно вызывать из программ на Visual C++, Visual Basic и других языках программирования, предоставляя пользователям программ услуги по защите данных.
Программный интерфейс CryptoAPI позволяет ввести в свои программы криптографические функции. Он предусматривает три набора функций:
Более подробное описание структуры, состава и базовых функций CryptoAPI можно найти в этом документе.
Любой сеанс работы с CryptoAPI начинается с инициализации (получения контекста). Инициализация выполняется при помощи функции CryptAcquireContext. В качестве параметров эта функция принимает имя контейнера ключей, имя криптопровайдера, тип провайдера и флаги, определяющие тип и действия с контейнером ключей и режим работы криптопровайдера:
BOOL WINAPI CryptAcquireContext(HCRYPTPROV* phProv,LPCTSTR pszContainer,
LPCTSTR pszProvider,DWORD dwProvType,DWORD dwFlags);
Криптопровайдер – это сущность (обычно библиотека), реализующая определенный набор криптографических
алгоритмов и обеспечивающая работу с ними. Существует около семи стандартных
провайдеров, предустановленных в системе.
Следующий пример демонстрирует инициализацию CryptoAPI для последующего вычисления хэша MD5:
#include <wincrypt.h> // На форме есть диалог, через который мы выбрали файл. Теперь открываем его для чтения int tHandle=FileOpen(OpenDialog1->FileName, fmOpenRead); __int64 Size = FileSeek(tHandle, 0, 2); // определяем размер файла unsigned char *buffer = new unsigned char[Size]; // создаем динамический массив для файла FileSeek(tHandle, 0, 0); // ставим указатель на начало файла FileRead(tHandle,buffer,Size); // считываем файл в массив FileClose(tHandle); // закрываем файл HCRYPTPROV Prov; // объявляем служебные переменные HCRYPTKEY hKey; HCRYPTHASH Hash; unsigned char buffer_hash[16]={0}; CryptAcquireContext(&Prov,"MYCONTAINER",NULL,PROV_RSA_FULL,CRYPT_DELETEKEYSET); // удаляем набор CryptAcquireContext(&Prov,"MYCONTAINER",NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET); // создаем набор unsigned long dwHashLen; unsigned long dwCount = 4; CryptCreateHash(Prov,CALG_MD5,NULL,0,&Hash); CryptHashData(Hash,buffer,Size,0); // хэшируем данные CryptGetHashParam(Hash, HP_HASHSIZE, (BYTE *)&dwHashLen,&dwCount, 0); CryptGetHashParam(Hash,HP_HASHVAL,(BYTE *)&buffer_hash[0],&dwHashLen,0); // результат в массив CryptDestroyHash(Hash); CryptReleaseContext(Prov,0); // освобождаем контекст //Теперь в массиве buffer_hash у нас находится 16 байт (128 бит) значения хэша |
Деинициализация CryptoAPI выполняется с помощью функции CryptReleaseContext, единственным значащим параметром которой является полученный ранее хэндл криптографического контекста.
Выводы по статье: CryptoAPI предоставляет богатый набор средств шифрования, позволяющих организовать собственную систему защиты данных без использования сторонних средств. Основными препятствиями на пути использования средств CryptoAPI могут стать отсутствие на платформах ниже Windows 2000 поддержки "сильной" криптографии и требования, налагаемые Российским законодательством на средства шифрования, используемые в коммерческой деятельности (эти средства обязательно должны быть сертифицированы). Но ни один из алгоритмов, реализованных в CryptoAPI, не является сертифицированным. Правда, это не мешает разработчикам shareware-программ использовать алгоритмы типа RSA для защиты своих продуктов.
(с) FM, 2008 |
Отзывы как обычно принимаются на mimicria@mail.ru |