Форум программистов, компьютерный форум CyberForum.ru

Разбираюсь с md5 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.83
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
22.01.2011, 23:52     Разбираюсь с md5 #1
Задание - реализовать md5.
Разбираюсь в описании алгоритма. Вроде всё хорошо написано в мануалах, но плохо знаю язык, и реализация первых шагов вызывает затруднение.
Непонятно, вот, что именно:
  • На вход алгоритма подается входной поток данных, в конец потока 1, а затем некоторого числа нулей. Нули добавляются до тех пор, пока длина всего потока не станет равной 512*N+448, т.е. равной 448 по модулю 512. Такое выравнивание происходит в любом случае, даже если длина потока уже удовлетворяет данному условию.
  • Затем в конец дописывается двоичное представление длины первоначального потока всего 64 бита. Если же длина больше чем 2^64, то берутся младшие 64 бита. Это добавление представляет собой два «слова», младшее идет первым, за ним старшее. После этого суммарная длина потока станет кратной 16 32-битным словам.
Как это выглядит?
З.Ы. Исходники исходники глядел.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
23.01.2011, 00:11     Разбираюсь с md5 #2
http://md5x.ru/a/Realizaciy_algoritm...na_yzke_C.html
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
23.01.2011, 19:11  [ТС]     Разбираюсь с md5 #3
asics, спасибо. гуглить научили. RFC смотрел.

Добавлено через 18 часов 9 минут
help
Как открыть файл и добавить в него 1 и нулики, и потом 64 битный блок?
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
27.01.2011, 13:44  [ТС]     Разбираюсь с md5 #4
Plz, plz, plz ))))))))))))))))))))))))
Вот из RFC кусок выдернул
C
1
2
3
4
5
6
if ((file = fopen (filename, "rb")) == NULL)
 printf ("%s can't be opened\n", filename);
 
  else {
 MDInit (&context);
 while (len = fread (buffer, 1, 1024, file)) MDUpdate (&context, buffer, len);
как работает эта строчка?
C
1
len = fread (buffer, 1, 1024, file)
В переменную буфер (её объявленный размер 1024) помещается 1 байт из file? и максимально, таких операции 1024?
chesar
56 / 53 / 5
Регистрация: 15.12.2009
Сообщений: 231
Записей в блоге: 1
01.02.2011, 19:51  [ТС]     Разбираюсь с md5 #5
Хехе... Я ищо жЫв!
Вот, что есть на данный момент. Реализация первых двух шагов. За основу взят текст некого btf
Открываем файл, получаем его длинну, дополняем до кратности 512.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//---------------------------------------------------------------------------
 
#include <clx.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
 
FILE *fp;
if((fp=fopen("D:\\wso.exe", "rb"))==NULL)
printf("\n\nError!!!. I can't open the file");
else
printf("\n\nI open the file");
//узнаем длинну:
fseek(fp, 0L, SEEK_END);
int length=ftell(fp);
printf("\n\nThe size of file is %ld bytes", 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]=fgetc(fp); //заполняем первые 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 байт выравненной строки
}
 
printf("/n new size: %ld", size); int kr=size%64;
 
getch ();        return 0;
}
Слабо представляю, что творится с битами в этот момент. По байтам-то все четко. Но вот не изменяется ли битовая последовательность? Можно как проверить?
Yandex
Объявления
01.02.2011, 19:51     Разбираюсь с md5
Ответ Создать тему
Опции темы

Текущее время: 18:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru