md5 на C/C++
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
Ищу что-нибудь (готовый алгоритм, библиотечку), что позволит быстро генерировать md5-хэши из строк.
Все, что я находил до этого, отказывалось работать по разным причинам, хех..
Все, что я находил до этого, отказывалось работать по разным причинам, хех..
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
-
- Эксперты no-Steam
- Сообщения: 2600
- Зарегистрирован: 15.02.2007
- Откуда: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 43 раза
- Контактная информация:
NiGHt-LEshiY, тебе именно MD5 ?
Насчет кода специально для строк я хз, обычно там универсальный код, для любых данных.
Насчет кода специально для строк я хз, обычно там универсальный код, для любых данных.
Код: Выделить всё
unsigned long GetMD5( void *data, int size );
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
[-Dio-]
Я тоже набирал, не дурак. Они все либо не работают, либо слишком громоздки.
fire64
Где эта функция обитает?
Я тоже набирал, не дурак. Они все либо не работают, либо слишком громоздки.
fire64
Где эта функция обитает?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
-
- Разработчик
- Сообщения: 302
- Зарегистрирован: 17.03.2008
- Откуда: такие как я?
- Поблагодарили: 2 раза
- Контактная информация:
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 раз
- Контактная информация:
eldest
Спасибо, всё работает как следует.
Теперь надо узнать, насколько быстро работает, хех.
Добавлено спустя 22 минуты 2 секунды:
Ещё вопрос. Как корректней загнать md5hash в переменную(ые) в виде текста?
Просто мне нужно использовать strcmp, дабы выяснить, является ли текущий хэш искомым.
Спасибо, всё работает как следует.
Теперь надо узнать, насколько быстро работает, хех.
Добавлено спустя 22 минуты 2 секунды:
Ещё вопрос. Как корректней загнать md5hash в переменную(ые) в виде текста?
Просто мне нужно использовать strcmp, дабы выяснить, является ли текущий хэш искомым.
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
-
- Эксперты no-Steam
- Сообщения: 2600
- Зарегистрирован: 15.02.2007
- Откуда: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 43 раза
- Контактная информация:
- x_000
- Полковник
- Сообщения: 4889
- Зарегистрирован: 25.02.2008
- Откуда: Deutsches Reich
- Благодарил (а): 6 раз
- Поблагодарили: 18 раз
о аллах триединый!NiGHt-LEshiY писал(а):Просто мне нужно использовать strcmp, дабы выяснить, является ли текущий хэш искомым.
ну если тебе это действительно ТАК надо, то не забывай выделять под хэш буфер достаточного размера
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
x_000
А какие проблемы с strcmp? Или проверять посимвольно?
А какие проблемы с strcmp? Или проверять посимвольно?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
x_000
С символами, а не со строками, если проверять посимвольно.
А как по твоему сравнить две строки без работы со строками?
С символами, а не со строками, если проверять посимвольно.
А как по твоему сравнить две строки без работы со строками?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
fire64
Там точно должно быть %02x.
Если тут что-нибудь поменять - хэши становятся кривыми.
На выходе всегда одно и то же - 12ff50. Надо как нибудь растащить по массиву md5hash в виде %02x. Но за одну итерацию выводится два символа, а не один.
Добавлено спустя 45 минут 23 секунды:
Додумался наконец.
Там точно должно быть %02x.
Код: Выделить всё
for (int i=0; i<16; i++)
printf("%02x", md5hash[i]);
Код: Выделить всё
sprintf( found, "%x", md5hash );
std::cout << found << std::endl;
Добавлено спустя 45 минут 23 секунды:
Додумался наконец.
Код: Выделить всё
for (int i=0; i<16; i++)
{
sprintf(charbuff, "%02x", md5hash[i]);
strcat(charHash, charbuff);
}
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.
Просьба присылать сообщения об ошибках в ЛС.
- NiGHt-LEshiY
- Полковник
- Сообщения: 10258
- Зарегистрирован: 13.06.2008
- Откуда: Россия
- Благодарил (а): 752 раза
- Поблагодарили: 2667 раз
- Контактная информация:
eldest
Благодарю.
Итак, я разобрался с генерацией md5 и с записью значения в тектовом виде.
Проблема в том, что в самом главном цикле программы всё должно выполняться быстро. Функция strcmp, как мы знаем, быстротой не отличается.
Нужна замена, работающая быстрей. На крайняк можно ассемблером, но что именно нужно написать я не в курсе.
Или написать свою функцию, подобную strcmp, но которая не проверяет длины строк (у md5 всегда 32 символа)?
Будет ли быстрей работать проверка каждого символа, вроде такой:
Благодарю.
Итак, я разобрался с генерацией 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, но которая не проверяет длины строк (у 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 раз
strcmp и так не проверяет длины строкNiGHt-LEshiY писал(а):strcmp, но которая не проверяет длины строк
а со строками работать не надо, переводи тот мд5, который у тебя в строке в число