Blog. Just Blog

Использование системных функций хеширования

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование системных функций хеширования
Использование системных функций хеширования

Я уже выкладывал на сайте ассемблерные реализации алгоритмов хеширования MD4, MD5 и SHA1. Но в Windows есть уже готовые функции для подсчета не только этих хешей, но и некоторых других. Конечно, делать все самому гораздо приятнее для души и полезнее для мозгов, но почему бы не переложить часть работы на систему? Как говорил один мой хороший товарищ: "У лошади голова большая, вот пусть она и думает".

Начнем, как обычно, с описания всего того, чего не поддерживает FASM "из коробки". Функции из advapi32.dll он знает, а вот с константами сплошная грусть-печаль.
  1. CRYPT_VERIFYCONTEXT = 0xF0000000
  2. CRYPT_SILENT        = 0x00000040
  3. PROV_RSA_FULL       = 1
  4. HP_HASHVAL          = 0x0002
  5. CALG_MD2  = 0x00008001
  6. CALG_MD4  = 0x00008002
  7. CALG_MD5  = 0x00008003
  8. CALG_SHA1 = 0x00008004
С помощью функции CryptAcquireContext создаем контекст криптографического провайдера. Мы уже сталкивались с этой технологией, когда разбирали системные генераторы случайных чисел. Затем подготавливаем к использованию выбранный алгоритм хеширования с помощью функции CryptCreateHash. Например, MD5.
  1.         invoke  CryptAcquireContext,hProv,NULL,NULL,PROV_RSA_FULL,\
  2.                 CRYPT_VERIFYCONTEXT+CRYPT_SILENT
  3.         invoke  CryptCreateHash,[hProv],CALG_MD5,0,0,hHash
Теперь переходим непосредственно к вычислению хеша. С помощью функции CryptHashData применяем выбранный алгоритм к хешируемым данным. Причем хеш считается накопительно, то есть для больших объемов данных эту функцию можно вызывать поочередно ко всем фрагментам. Для относительно небольших данных достаточно одного вызова.
  1.         ; strData -> хешируемые данные
  2.         ; data_length = длина данных
  3.         invoke  CryptHashData,[hHash],strData,[data_length],0
После вычисления надо получить готовый результат и поместить его куда-нибудь в сухое прохладное место. Для этого используется функция CryptGetHashParam. Для каждого типа хеша требуется буфер своего размера. Так, для семейства алгоритмов MD будет достаточно 16 байт, а для SHA1 уже нужен буфер в 20 байт. Впрочем, никто не мешает зарезервировать память с запасом. 64 байта хватит всем.
  1.         ; hash -> буфер для получения результата хеширования
  2.         ; hash_len = длина буфера
  3.         mov     [tmp],hash_len
  4.         invoke  CryptGetHashParam,[hHash],HP_HASHVAL,hash,tmp,0
Когда все вычисления закончены, надо прибраться за собой, освободив функцией CryptDestroyHash ресурсы, задействованные для хеширования. Если вычислений больше не планируется и криптопровайдер в дальнейшем не нужен, то надо освободить и его, для этого есть функция CryptReleaseContext.

Точно так же можно легко вычислять хеши и при помощи других алгоритмов, например, SHA-256 или SHA-512. Только тут надо учитывать, что они поддерживаются в системах не ниже Windows XP SP3. Кстати, все перечисленные в статье криптографические функции в настоящее время отнесены Microsoft в разряд устаревших. Вместо них рекомендуется переходить на так называемое Cryptographic Next Generation, но поддержка этих функций начинается только с Windows 10. Так что, принимая во внимание реальную заботу MS о пользователях в плане обратной совместимости, можно еще долго пользоваться и упомянутыми функциями. Вряд ли в обозримом будущем с ними что-то случится.

В приложении пример программы с исходным текстом, которая считает хеши MD2, MD4, MD5 и SHA1 от введенной строки с использованием системных функций.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

System.Hashing.Demo.zip (2,980 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 182 | Комментариев: 3

Метки: Assembler, хеши

Комментарии

Отзывы посетителей сайта о статье
voffka (13.05.2022 в 09:03):
Если прям совсем системные функции, то md4/5 и что-то из sha есть в ntdll.dll, в хр в экспорте нет, а в 7 и выше есть стандартные init, update, final
ManHunter (11.05.2022 в 11:10):
MD2 в экспорте нет, SHA-256\384\512 в экспорте нет, а главное, что теряется универсальность. Тут поменял в обертке ALG_ID, остальной код практически без изменений, за исключением длины хеша. Так что, при всем уважении, нет, не можно без криптопровайдеров.
DRON (11.05.2022 в 10:00):
Можно и без крипто-провайдеров, так как тот же advapi32.dll экспортирует MD4, MD5 и SHA в виде функций типа MD5Init, MD5Update, MD5Final.

Есть ещё вот такая компактная реализация MD5 на ассемблере:
https://www.asmcommunity.net//...ents/?id=563

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2022
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0042 сек.) / Память: 4.75 Mb
Наверх