1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Md на C++

Тема в разделе "Общие вопросы по С и С++", создана пользователем sergg, 9 май 2010.

  1. sergg

    sergg Member

    Репутация:
    0
    Регистрация:
    9 май 2010
    Сообщения:
    18
    Симпатии:
    0
    Хочу написать на Си++ реализацию 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)?

    Спасибо.
     
Загрузка...

Поделиться этой страницей