MD5 — нужен?

MD5 — это алгоритм хэширования данных, при котором на входе подается строка произвольной длины, а на выходе получается 32 символьная строка. Данный алгоритм хэширования очень популярен в WEB программировании, и может быть интересен при создании брутера vBulletin. Заманчивое предложение, не правда ли?

md5logo Получение MD5 хеша средствами C++

Алгоритм получения MD5 на C++

Реализацию этого алгоритма я искал очень долго, и чтобы его в очередной раз не потерять, я опубликую его на этом блоге. MD5 также может быть применен для создания HWID (об этом в следующих статьях).

#ifdef __alpha
typedef unsigned int UINT4;
#else
typedef unsigned long int UINT4;
#endif

#define MD5_INIT_STATE_0 0x67452301
#define MD5_INIT_STATE_1 0xefcdab89
#define MD5_INIT_STATE_2 0x98badcfe
#define MD5_INIT_STATE_3 0x10325476

void MD5Init(void);
void MD5Update(unsigned char *bug, unsigned int len);
void MD5Final(char* cReturnStr);
void Transform(UINT4 *buf, UINT4 *in);

BYTE  m_lpszBuffer[64];
ULONG m_nCount[2];
ULONG m_lMD5[4];

static unsigned char PADDING[64] = {
 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

#define ROTATE_LEFT(x, n) (((x) > (32-(n))))

#define FF(a, b, c, d, x, s, ac) \
 {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
 }
#define GG(a, b, c, d, x, s, ac) \
 {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
 }
#define HH(a, b, c, d, x, s, ac) \
 {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
 }
#define II(a, b, c, d, x, s, ac) \
 {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
  (a) = ROTATE_LEFT ((a), (s)); \
  (a) += (b); \
 }

void ByteToDWord(DWORD* Output, ULONG* Input, UINT nLength){
UINT i=0;
UINT j=0;
for (; j > 8) & 0xff);
 Output[j+2] = (UCHAR)((Input[i] >> 16) & 0xff);
 Output[j+3] = (UCHAR)((Input[i] >> 24) & 0xff);
}
}

void MD5Init (void)
{
 memset(m_lpszBuffer, 0, 64 );
 m_nCount[0] = m_nCount[1] = 0;

m_lMD5[0] = MD5_INIT_STATE_0;
m_lMD5[1] = MD5_INIT_STATE_1;
m_lMD5[2] = MD5_INIT_STATE_2;
m_lMD5[3] = MD5_INIT_STATE_3;
}

void MD5Update (unsigned char *inBuf, unsigned int inLen)
{
 register int i, ii;
 int mdi;
 UINT4 in[16];

 mdi = (int)((m_nCount[0] >> 3) & 0x3F);

 if ((m_nCount[0] + ((UINT4)inLen > 29);

 while (inLen--) {
   m_lpszBuffer[mdi++] = *inBuf++;

   if (mdi == 0x40) {
     for (i = 0, ii = 0; i > 3) & 0x3f);
nPadLen = (nIndex 
                      

Если у вас возникает вопрос, как это использовать, то отвечаю: Нужно вызвать функцию GetMD5();, где pBuf будет указателем на строку, UINT nLength размером строки pBuf, а cReturnStr будет указывать на возвращаемую строку. Все просто. Небольшой пример:

char in[] = "Hello, mr. Those";
char out[33] = {'\0'};
GetMD5(in,strlen(in),out);

Скачать алгоритм md5 файлом

tt twitter big4 Получение MD5 хеша средствами C++ tt digg big4 Получение MD5 хеша средствами C++ tt facebook big4 Получение MD5 хеша средствами C++ tt gmail big4 Получение MD5 хеша средствами C++ tt myspace big4 Получение MD5 хеша средствами C++ tt reddit big4 Получение MD5 хеша средствами C++

Комментарии (3) на “Получение MD5 хеша средствами C++”

  • ZX_Lost_Soul:

    Спасибо за статью! Перебрал огромное количество исходников в интернете, пока наткнулся на это, реально работающее, решение)

    Только вот у вас ошибка, которая заставила меня перерыть весь код, пока я понял в чём проблема.

    char out[32] нужно делать размерностью не 32, а 33 ! Ведь strcat, который делается в MD5Final() добавляет ещё в конец массива! И если этого не сделать — данные не влазят, повреждается память и программа рандомно крашится.

    Ответить
  • ZX_Lost_Soul:

    *Добавляет слеш-ноль (сайт затёр)

    Ответить
  • Mr.Amirka:

    Большое спасибо…!

    Ответить

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Супер Pixel