md5 на C/C++

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

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

NiGHt-LEshiY
(у md5 всегда 32 символа)?
:D неа, длина md5 хэша равна 16 байт.
32 эт в виде хекса, тобиш "%02x" что в два раза больше
char* seek[32]; переводи в бинарный формат unsigned char * seek[16];

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

#17 Сообщение 26.07.2010, 18:07

x_000
Так и собрался делать. С числами приятней и быстрей работать.

Добавлено спустя 1 минуту 16 секунд:
eldest
Изначально он и так бинарный. И 16-байтовый. Но 16 байт = 32 символа в hex, не так ли? Я именно это имел в виду.
В общем, этими переводами в hex я только усложнил и замедлил программу. Пора исправляться.

Добавлено спустя 14 минут 31 секунду:
Есть быстрый способ перевести из hex в dec?
f8 => 248
99 => 153
Или по старинке - руками?
Кодекс поведения участников сообщества — обязательно к прочтению.
Просьба присылать сообщения об ошибках в ЛС.

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

#18 Сообщение 26.07.2010, 19:04

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

static char x2c(char *hex) {
    register char digit;
    digit = ((hex[0] >= 'A') ? ((hex[0] & 0xdf) - 'A')+10 : (hex[0] - '0'));
    digit *= 16;
    digit += (hex[1] >= 'A' ? ((hex[1] & 0xdf) - 'A')+10 : (hex[1] - '0'));
    return(digit);
}

void bin2hex(char * hexbuffer, unsigned char * binary, size_t len) { // arg3 (size_t len) - length of arg2
    for (int i=0; i<len; i++)
        sprintf(&hexbuffer[i*2], "%02x", binary[i]);
}

void hex2bin(unsigned char * binarybuffer, char * hex, size_t len) { // arg3 (size_t len) - length of arg2
    for (int i=0; i<len/2; i++)
        binarybuffer[i] = x2c(&hex[i*2]);
}

char * hexstring = new char[32];
bin2hex(hexstring, md5hash, 16);
cout << hexstring << endl;

unsigned char binary[ 16 ];
binary[16] = '\0';
hex2bin(binary, hexstring, 32);
cout << binary << endl;
Есть быстрый способ перевести из hex в dec?
f8 => 248
99 => 153
Или по старинке - руками?

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

strtoul("f8", NULL, 16); // return 248;
strtoul("99", NULL, 16); // return 153;.
// или x2c();

Morfin
Лейтенант
Лейтенант
Сообщения: 237
Зарегистрирован: 19.10.2007
Поблагодарили: 1 раз

#19 Сообщение 03.08.2010, 15:53

В linux я делал так:

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

char *md5(const char *data)
{
  unsigned char md5[17]; //raw md5 hash
  char *hash=NULL; //hex md5 hash like 98c7d35f011444b7d523bcb4bbf6867e
  MD5_CTX md5handler;
  MD5_Init(&md5handler);
  MD5_Update(&md5handler,data,strlen(data));
  MD5_Final(md5,&md5handler);
  if (hash) delete [] hash;
  hash=(char*)realloc((void*)hash,33);
  for (int i=0;i<16;++i) {
     sprintf (hash + 2*i, "%02x", md5[i]);
  };
  return hash;
}
P.S Знаю код говно но работает(пришлось прибегнуть к libcrypto).
P.P.S Изначально генерируется сырой хэш, который затем следует перевести в hex
Изображение

Ответить