• XSS.stack #1 – первый литературный журнал от юзеров форума

CryptoAPI MD5

Paramedic

RAM
Пользователь
Регистрация
25.11.2019
Сообщения
111
Реакции
83
C:
/*
  
    Описание:

    Функция хеширует ANSI строку по алгоритму MD5, на выходе выдавая хеш в представлении UNICODE строки.

    Параметры:

    LPWSTR lpDestination - буффер, в который будет передана строка с хешем.

    LPSTR lpString - ANSI строка, которую требуется хешировать.
  
    Завершение:

    При завершении функция возвращает результат её исполнения в виде переменной типа bool.

    */

    bool MD5(LPWSTR lpDestination, LPSTR lpString)
    {
        bool bRet = false;
        WCHAR wszHash[MD5_MAX_LENGTH + 1] = { 0 };
        BYTE bHash[MD5_MAX_LENGTH / 2] = { 0 };
        DWORD dwDataLength = MD5_MAX_LENGTH;

        LPWSTR lpCharList = L"0123456789abcdef";
        LPWSTR lpFormat = L"%c%c";

        do
        {
            if (!CryptCreateHash(hProv, CALG_MD5, NULL, 0, &hHash))
            {
#ifdef __DEBUG
                DebugMessage(L"Crypt::MD5() - can't create hash.");
#endif
                break;
            }

            if (!CryptHashData(hHash, (LPBYTE)lpString, StringUtils::StringLengthA(lpString), 0))
            {
#ifdef __DEBUG
                DebugMessage(L"Crypt::MD5() - can't hash data.");
#endif
                break;
            }

            if (!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwDataLength, 0))
            {
#ifdef __DEBUG
                DebugMessage(L"Crypt::MD5() - can't get hash value.");
#endif
                break;
            }
          
            for (int i = 0; i < dwDataLength; i++)
            {
                WCHAR wszHashPart[3] = { 0 };
              
                if (!wsprintfW(wszHashPart, lpFormat, lpCharList[bHash[i] >> 4], lpCharList[bHash[i] & 0xf]))
                {
#ifdef __DEBUG
                    DebugMessage(L"Crypt::MD5() - can't format hash part.");
#endif
                    break;
                }

                StringUtils::StringAppendW(wszHash, wszHashPart);
            }

            wszHash[MD5_MAX_LENGTH + 1] = 0;

            bRet = true;

        } while (false);

        StringUtils::StringCopyW(lpDestination, wszHash);

        return bRet;
    }
 
Последнее редактирование:
В чем вопрос темы? Если похвастаться кодом, то код плохой, тащить его себе в проекты не надо. Вкратце: hProv/hHash - глобальные? кто будет делать СryptDestroyHash? почему результат bHash и его hex-представление wszHash одной длины (hex-запись числа, очевидно, в два раза длиннее)? Еще можно порассуждать про константы, непонятные внешние определения и т.д.
 
В чем вопрос темы? Если похвастаться кодом, то код плохой, тащить его себе в проекты не надо. Вкратце: hProv/hHash - глобальные? кто будет делать СryptDestroyHash? почему результат bHash и его hex-представление wszHash одной длины (hex-запись числа, очевидно, в два раза длиннее)? Еще можно порассуждать про константы, непонятные внешние определения и т.д.
Я выложил концепт хеширования MD5 на CryptoAPI, который возможно будет кому-то полезен. Этот код не предназначается для пасты, его нужно будет допилить. Да, глобальные. Как инициализатор криптопровайдера, так и его деструктор являются отдельными функциями, и реализовать самому подобное - не является проблемой. По поводу длины не заметил, спасибо. Отредактировал пост с правками.
> Еще можно порассуждать про константы, непонятные внешние определения и т.д.
Если ты говоришь о MD5_MAX_LENGTH, то держи:

C:
#define MD5_MAX_LENGTH 32

Все функции достаточно понятно названы, код читаем. В остальном не вижу никаких проблем.

Если хочешь покритиковать - критикуй конструктивно, я всегда рад конструктивной критике.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх