Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 08.05.2010, 14:56   #1
btf
Пользователь
 
Регистрация: 03.12.2009
Сообщений: 25
По умолчанию MD5 на C++

Хочу написать на Си++ реализацию MD5, пишу в C++Builder.
Я нашел откуда скачать реализованный алгоритм, но там не очень понятно, поэтому решил писать сам по алгоритму с википедии(http://ru.wikipedia.org/wiki/MD5).
Первый шаг и второй шаги реализовал так:
Код:
String GetHash(String in) 
{ 
int length=in.Length(); //Длина входящего сообщения. 
int rests=length%64; //остаток от деления на 64байта(512бит). 
int size=0; //размер расширенного сообщения. 

if(rests<56) //если остатот от деления меньше 56 
{ 
size=length-rests+56+8; //подгоняем длину сообщения, что бы была кратна 64(+8байт для шага 2) 
} 
else //иначе 
{ 
size=length+64-rests+56+8; //подгоняем длину сообщения, что бы была кратна 64(+8байт для шага 2) 
} 

unsigned char *inChar=new unsigned char[size]; //массив char, в котором будет храниться входящее сообщение с расширенной длиной. 

for(int i=0;i<length;i++) //от 0 символа до length 
{ 
inChar[i]=in[i+1]; //заполняем первые length символов inChar символами из входщей строки 
} 

inChar[length]=128; //добавляем 1 бит в конец потока(128(Dec)=0x80(HEX)=1000000(Bin)) 

for(int i=length+1;i<size;i++) //оставшуюся часть 
{ 
inChar[i]=0; //заполняем нулями 
}
//Step2:
unsigned long lengthBit=(unsigned long)length*8; //представление длины входящего сообщения в битах
unsigned char Bits[8]; //массив для 64-разрядного представления длин входящего сообщения
//далее заполняем массив младшими битами каждого байта
Bits[0]=lengthBit & 0xFF;
Bits[1]=(lengthBit >> 8) & 0xFF;
Bits[2]=(lengthBit >> 16) & 0xFF;
Bits[3]=(lengthBit >> 24) & 0xFF;
Bits[4]=(lengthBit >> 32) & 0xFF;
Bits[5]=(lengthBit >> 40) & 0xFF;
Bits[6]=(lengthBit >> 48) & 0xFF;
Bits[7]=(lengthBit >> 56) & 0xFF;

for(int i=0;i<8;i++) //каждый элемент массива Bits[]
 {
 inChar[size-8+i]=Bits[i]; //вставляем в последние 8 байт выравненной строки
 }
Вот это моя реализация первого и второго шага в соответствии с алгоритмом с википедии.

Расскажите пожалуйста, что тут не так(если что-то не так) и поясните, что такое массив X (в шаге 3)?
btf вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Различие MD5 Delphi и MD5 PHP Viteef Общие вопросы Delphi 14 09.02.2011 11:53
Строку в MD5-hash если Строка является MD5-хешем... Человек_Борща Общие вопросы Delphi 0 13.04.2010 14:27
PHP MD5 и Delphi/C/C++ MD5 в чем отличие? Человек_Борща Общие вопросы Delphi 1 05.04.2010 19:18
md5 на C balto Софт 1 20.10.2009 14:33


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840