Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2010, 15: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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



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