Md на C++

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

  1. sergg

    sergg Member

    Регистрация:
    9 май 2010
    Сообщения:
    20
    Симпатии:
    0
    Хочу написать на Си++ реализацию MD5, пишу в C++Builder.
    Я нашел откуда скачать реализованный алгоритм, но там не очень понятно, поэтому решил писать сам по алгоритму с википедии(http://ru.wikipedia.org/wiki/MD5).
    Первый шаг и второй шаги реализовал так:
    Код (Text):
    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)?

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

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