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

Использование системных функций хеширования
Я уже выкладывал на сайте ассемблерные реализации алгоритмов хеширования MD4, MD5 и SHA1. Но в Windows есть уже готовые функции для подсчета не только этих хешей, но и некоторых других. Конечно, делать все самому гораздо приятнее для души и полезнее для мозгов, но почему бы не переложить часть работы на систему? Как говорил один мой хороший товарищ: "У лошади голова большая, вот пусть она и думает".
Начнем, как обычно, с описания всего того, чего не поддерживает FASM "из коробки". Функции из advapi32.dll он знает, а вот с константами сплошная грусть-печаль.
Code (Assembler) : Убрать нумерацию
- CRYPT_VERIFYCONTEXT = 0xF0000000
- CRYPT_SILENT = 0x00000040
- PROV_RSA_FULL = 1
- HP_HASHVAL = 0x0002
- CALG_MD2 = 0x00008001
- CALG_MD4 = 0x00008002
- CALG_MD5 = 0x00008003
- CALG_SHA1 = 0x00008004
Code (Assembler) : Убрать нумерацию
- invoke CryptAcquireContext,hProv,NULL,NULL,PROV_RSA_FULL,\
- CRYPT_VERIFYCONTEXT+CRYPT_SILENT
- invoke CryptCreateHash,[hProv],CALG_MD5,0,0,hHash
Code (Assembler) : Убрать нумерацию
- ; strData -> хешируемые данные
- ; data_length = длина данных
- invoke CryptHashData,[hHash],strData,[data_length],0
Code (Assembler) : Убрать нумерацию
- ; hash -> буфер для получения результата хеширования
- ; hash_len = длина буфера
- mov [tmp],hash_len
- invoke CryptGetHashParam,[hHash],HP_HASHVAL,hash,tmp,0
Точно так же можно легко вычислять хеши и при помощи других алгоритмов, например, SHA-256 или SHA-512. Только тут надо учитывать, что они поддерживаются в системах не ниже Windows XP SP3. Кстати, все перечисленные в статье криптографические функции в настоящее время отнесены Microsoft в разряд устаревших. Вместо них рекомендуется переходить на так называемое Cryptographic Next Generation, но поддержка этих функций начинается только с Windows 10. Так что, принимая во внимание реальную заботу MS о пользователях в плане обратной совместимости, можно еще долго пользоваться и упомянутыми функциями. Вряд ли в обозримом будущем с ними что-то случится.
В приложении пример программы с исходным текстом, которая считает хеши MD2, MD4, MD5 и SHA1 от введенной строки с использованием системных функций.
Просмотров: 929 | Комментариев: 5

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

morgot
(11.06.2022 в 04:29):
CNG можно использовать начиная с висты вроде как. Но криптоапи как то привычнее,и врядли его удалят (часть апи, типа cryptdexodeobjectex так и остались, им замены в новых апи нет). Правда, для шифрования в cng больше вариантов, например эллипьтческие кривые.
Извините за опечатки, пишу с телефона
Извините за опечатки, пишу с телефона

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

Добавить комментарий
Заполните форму для добавления комментария

Кстати, очень может быть. Уже не раз встречал порочную практику от MS, когда в какую-нибудь староглиняную функцию, исправно работающую чуть не с Win2k, добавляется новый параметр, специфичный, например, для Win10 и выше. И все, минимальной поддерживаемой системой автоматически становится бесятка. При том, что 99,9% функционала будет работать и на большинстве предыдущих систем.