md5 на C/C++

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#1 Сообщение 24.07.2010, 11:58

Ищу что-нибудь (готовый алгоритм, библиотечку), что позволит быстро генерировать md5-хэши из строк.
Все, что я находил до этого, отказывалось работать по разным причинам, хех..
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
[-Dio-]
Сержант
Сержант
Сообщения: 73
Зарегистрирован: 12.05.2009
Откуда: От туда...
Контактная информация:

#2 Сообщение 24.07.2010, 12:33

Для делфи есть, можно сделать под библиотеку без проблем. Да и в яндексе набрал, ссылок на реализацию на с дофига.
Изображение

Fire666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2600
Зарегистрирован: 15.02.2007
Откуда: Москва
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

#3 Сообщение 24.07.2010, 13:40

NiGHt-LEshiY, тебе именно MD5 ?
Насчет кода специально для строк я хз, обычно там универсальный код, для любых данных.

Код: Выделить всё

unsigned long GetMD5( void *data, int size );

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#4 Сообщение 24.07.2010, 18:22

[-Dio-]
Я тоже набирал, не дурак. Они все либо не работают, либо слишком громоздки.

fire64
Где эта функция обитает?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#5 Сообщение 24.07.2010, 21:12

http://rghost.ru/2192981

Код: Выделить всё

int main() {
    // "This is md5" a9034c573e41c1788a9ba339922a50f5

    unsigned char md5hash[ 16 ];
    char * buffer = new char[MAX_PATH];

    strcpy(buffer, "This is md5");

    cout << buffer << endl;

	md5_buffer(buffer, strlen(buffer), &md5hash);

    cout << md5hash << endl;

    // hex print
    for (int i=0; i<16; i++)
        printf("%02x", md5hash[i]);

    printf("\n");

    return 0;
}

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#6 Сообщение 24.07.2010, 22:24

eldest
Спасибо, всё работает как следует.
Теперь надо узнать, насколько быстро работает, хех.

Добавлено спустя 22 минуты 2 секунды:
Ещё вопрос. Как корректней загнать md5hash в переменную(ые) в виде текста?
Просто мне нужно использовать strcmp, дабы выяснить, является ли текущий хэш искомым.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Fire666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 2600
Зарегистрирован: 15.02.2007
Откуда: Москва
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

#7 Сообщение 24.07.2010, 23:10

попробуй

Код: Выделить всё

sprintf( yourvar, "%x", md5hash );

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#8 Сообщение 25.07.2010, 00:34

NiGHt-LEshiY писал(а):Просто мне нужно использовать strcmp, дабы выяснить, является ли текущий хэш искомым.
о аллах триединый!
ну если тебе это действительно ТАК надо, то не забывай выделять под хэш буфер достаточного размера

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#9 Сообщение 25.07.2010, 00:35

x_000
А какие проблемы с strcmp? Или проверять посимвольно?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#10 Сообщение 25.07.2010, 00:37

NiGHt-LEshiY писал(а):А какие проблемы с strcmp? Или проверять посимвольно?
аллах с тобой, вообще не надо работать со строками! это медленно и вообще

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#11 Сообщение 25.07.2010, 00:38

x_000
С символами, а не со строками, если проверять посимвольно.

А как по твоему сравнить две строки без работы со строками?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#12 Сообщение 26.07.2010, 11:25

fire64
Там точно должно быть %02x.

Код: Выделить всё

for (int i=0; i<16; i++)
        printf("%02x", md5hash[i]);
Если тут что-нибудь поменять - хэши становятся кривыми.

Код: Выделить всё

sprintf( found, "%x", md5hash );
		std::cout << found << std::endl;
На выходе всегда одно и то же - 12ff50. Надо как нибудь растащить по массиву md5hash в виде %02x. Но за одну итерацию выводится два символа, а не один.

Добавлено спустя 45 минут 23 секунды:
Додумался наконец.

Код: Выделить всё

for (int i=0; i<16; i++)
		{
			sprintf(charbuff, "%02x", md5hash[i]);
			strcat(charHash, charbuff);
		}
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

eldest
Разработчик
Разработчик
Сообщения: 302
Зарегистрирован: 17.03.2008
Откуда: такие как я?
Поблагодарили: 2 раза
Контактная информация:

#13 Сообщение 26.07.2010, 13:41

NiGHt-LEshiY
Поздравляю! с повышением :D

Аватара пользователя
NiGHt-LEshiY
Полковник
Полковник
Сообщения: 10258
Зарегистрирован: 13.06.2008
Откуда: Россия
Благодарил (а): 752 раза
Поблагодарили: 2667 раз
Контактная информация:

#14 Сообщение 26.07.2010, 16:13

eldest
Благодарю.

Итак, я разобрался с генерацией md5 и с записью значения в тектовом виде.

Код: Выделить всё

char* seek = "8dddd5c939abf0e6eba0924fb4003fb4"; // что мы ищем
for (int hash=0; hash<=10000000; hash++)
	{
		curr[0] = '\0'; // вместо memset, лол
		sprintf(buffer, "%d", hash);
		md5_buffer(buffer, strlen(buffer), &md5hash);
		for (int i=0; i<16; i++)
		{
			sprintf(charbuff, "%02x", md5hash[i]);
			strcat(curr, charbuff);
		}
		if (strcmp(seek,curr) == 0){printf("Password: %d\n",hash); break;} // проблемный участок
	}
Проблема в том, что в самом главном цикле программы всё должно выполняться быстро. Функция strcmp, как мы знаем, быстротой не отличается.
Нужна замена, работающая быстрей. На крайняк можно ассемблером, но что именно нужно написать я не в курсе.
Или написать свою функцию, подобную strcmp, но которая не проверяет длины строк (у md5 всегда 32 символа)?
Будет ли быстрей работать проверка каждого символа, вроде такой:

Код: Выделить всё

for (int i=0; i<32; i++)
{
	if (curr[i] != seek[i]) return false;
{
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

Аватара пользователя
x_000
Полковник
Полковник
Сообщения: 4889
Зарегистрирован: 25.02.2008
Откуда: Deutsches Reich
Благодарил (а): 6 раз
Поблагодарили: 18 раз

#15 Сообщение 26.07.2010, 17:34

NiGHt-LEshiY писал(а):strcmp, но которая не проверяет длины строк
strcmp и так не проверяет длины строк
а со строками работать не надо, переводи тот мд5, который у тебя в строке в число

Ответить