Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как расчитать MD5 - хеш самого себя (Приложения) [D7, XP]


Страницы:   1 2 3

Дима ©   (2008-07-22 20:44:00) 

Привет Уважаемые!

Есть консольное приложение, в нем использую функцию по расчету MD5:
function md5(s: string): string;
...


Использую так:
var
FileName: String;
...
Constr
Fnam: 'MyApp.exe';
...
FileName := Md5(ChangeFileExt(ExtractFileName(Fnam), ''));

Но это же расчет MD5 Имени файла а не самого приложения!

Как мне реализовать сей Сабж?

С Уважением Дима.


Дима   (2008-07-22 22:22:00) [41]

Inc(CurrentHash[0], A);
   Inc(CurrentHash[1], B);
   Inc(CurrentHash[2], C);
   Inc(CurrentHash[3], D);
   Index := 0;
   FillChar(HashBuffer, Sizeof(HashBuffer), 0);
 end;

 procedure Update(const Buffer; Size: longword);
 var
   PBuf: ^byte;
 begin
   Inc(LenHi, Size shr 29);
   Inc(LenLo, Size * 8);
   if LenLo < (Size * 8) then
     Inc(LenHi);
   PBuf := @Buffer;
   while Size > 0 do
   begin
     if (Sizeof(HashBuffer) - Index) <= DWord(Size) then
     begin
       Move(PBuf^, HashBuffer[Index], Sizeof(HashBuffer) - Index);
       Dec(Size, Sizeof(HashBuffer) - Index);
       Inc(PBuf, Sizeof(HashBuffer) - Index);
       Compress;
     end
     else
     begin
       Move(PBuf^, HashBuffer[Index], Size);
       Inc(Index, Size);
       Size := 0;
     end;
   end;
 end;

 procedure Final(var Digest);
 begin
   HashBuffer[Index] := $80;
   if Index >= 56 then Compress;
   PDWord(@HashBuffer[56])^ := LenLo;
   PDWord(@HashBuffer[60])^ := LenHi;
   Compress;
   Move(CurrentHash, Digest, Sizeof(CurrentHash));
   Burn;
 end;

begin
 Init;
 Update(s[1], Length(s));
 Final(a);
 result := '';
 for i := 0 to 15 do
   result := result + IntToHex(a[i], 2);
 Burn;
end;


Всё! Сорри за кодэ-флуд!


Дима   (2008-07-22 22:20:00) [42]

A := CurrentHash[0];
   B := CurrentHash[1];
   C := CurrentHash[2];
   D := CurrentHash[3];

   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[0] + $D76AA478, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[1] + $E8C7B756, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[2] + $242070DB, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[3] + $C1BDCEEE, 22);
   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[4] + $F57C0FAF, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[5] + $4787C62A, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[6] + $A8304613, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[7] + $FD469501, 22);
   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[8] + $698098D8, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[9] + $8B44F7AF, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[10] + $FFFF5BB1, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[11] + $895CD7BE, 22);
   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[12] + $6B901122, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[13] + $FD987193, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[14] + $A679438E, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[15] + $49B40821, 22);

   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[1] + $F61E2562, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[6] + $C040B340, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[11] + $265E5A51, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[0] + $E9B6C7AA, 20);
   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[5] + $D62F105D, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[10] + $02441453, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[15] + $D8A1E681, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[4] + $E7D3FBC8, 20);
   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[9] + $21E1CDE6, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[14] + $C33707D6, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[3] + $F4D50D87, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[8] + $455A14ED, 20);
   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[13] + $A9E3E905, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[2] + $FCEFA3F8, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[7] + $676F02D9, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[12] + $8D2A4C8A, 20);

   A := B + LRot32(A + (B xor C xor D) + Data[5] + $FFFA3942, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[8] + $8771F681, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[11] + $6D9D6122, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[14] + $FDE5380C, 23);
   A := B + LRot32(A + (B xor C xor D) + Data[1] + $A4BEEA44, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[4] + $4BDECFA9, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[7] + $F6BB4B60, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[10] + $BEBFBC70, 23);
   A := B + LRot32(A + (B xor C xor D) + Data[13] + $289B7EC6, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[0] + $EAA127FA, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[3] + $D4EF3085, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[6] + $04881D05, 23);
   A := B + LRot32(A + (B xor C xor D) + Data[9] + $D9D4D039, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[12] + $E6DB99E5, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[15] + $1FA27CF8, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[2] + $C4AC5665, 23);

   A := B + LRot32(A + (C xor (B or (not D))) + Data[0] + $F4292244, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[7] + $432AFF97, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[14] + $AB9423A7, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[5] + $FC93A039, 21);
   A := B + LRot32(A + (C xor (B or (not D))) + Data[12] + $655B59C3, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[3] + $8F0CCC92, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[10] + $FFEFF47D, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[1] + $85845DD1, 21);
   A := B + LRot32(A + (C xor (B or (not D))) + Data[8] + $6FA87E4F, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[15] + $FE2CE6E0, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[6] + $A3014314, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[13] + $4E0811A1, 21);
   A := B + LRot32(A + (C xor (B or (not D))) + Data[4] + $F7537E82, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[11] + $BD3AF235, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[2] + $2AD7D2BB, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[9] + $EB86D391, 21);


Дима   (2008-07-22 22:20:00) [43]


> Это что и это чье и почему параметр string


Привожу листинг всей функции ниже!

// Подчет контрольной суммы Md5 hex

function md5(s: string): string;
var a: array[0..15] of byte;
 i: integer;
 LenHi, LenLo: longword;
 Index: DWord;
 HashBuffer: array[0..63] of byte;
 CurrentHash: array[0..3] of DWord;

 procedure Burn;
 begin
   LenHi := 0; LenLo := 0;
   Index := 0;
   FillChar(HashBuffer, Sizeof(HashBuffer), 0);
   FillChar(CurrentHash, Sizeof(CurrentHash), 0);
 end;

 procedure Init;
 begin
   Burn;
   CurrentHash[0] := $67452301;
   CurrentHash[1] := $EFCDAB89;
   CurrentHash[2] := $98BADCFE;
   CurrentHash[3] := $10325476;
 end;

 function LRot32(a, b: longword): longword;
 begin
   Result := (a shl b) or (a shr (32 - b));
 end;

 procedure Compress;

 var
   Data: array[0..15] of dword;
   A, B, C, D: dword;
 begin
   Move(HashBuffer, Data, Sizeof(Data));


Anatoly Podgoretsky   (2008-07-22 22:17:00) [44]

function md5(s: string): string;

Это что и это чье и почему параметр string


Palladin   (2008-07-22 22:17:00) [45]

что именно так?
открытие файла - так
взятие памяти - похоже не так


Дима   (2008-07-22 22:00:00) [46]

...
var
 Fi: file;
 pBuf: PChar;
begin
 Assign(Fi, FileName);
 Reset(Fi, 1);
 GetMem(pBuf, BufSize);
...

Так?


Дима   (2008-07-22 21:56:00) [47]


> Что мешает тебе прочитать содержимое файла в буфер строковой
> переменной ?

Нехватка знаний!, так как я еще Начинающий.

Морозю глупость №3:
А что Вам Премного-Уважаемый, мешает показать в коде, как сие Реализуется?


Сергей М.   (2008-07-22 21:47:00) [48]

Что мешает тебе прочитать содержимое файла в буфер строковой переменной ?


Сергей М.   (2008-07-22 21:46:00) [49]


> размер может быть подправлен кем то! И получится не очень
> хорошо


Чтой-то вдруг ?

Ну "подправили" этот "размер" на байт-другой - тебе что, заплохело ? Ночь наполет спать что ли не будешь - все об этих паршивых двух байтах будешь думать ?)


Дима   (2008-07-22 21:44:00) [50]


> Размер может быть у файла.


Корректирую 2 глупость! Применительно к файлу - как?


Сергей М.   (2008-07-22 21:42:00) [51]


> Имя приложения к примеру неизменно, а размер


Сколько ж можно морозитьь глупость ?

У приложения нет и не может быть размера.

Размер может быть у файла.

Приложение <> Файл.


Дима   (2008-07-22 21:40:00) [52]


>
> К чему тут упоминание о "консольности" чего-то там ?


Сорри, теперь сам понял что сморозил глупость!

Поправьте если что не так! Просто в своем приложении хочу расчитать MD5-хеш!
Но не знаю как реализовать?

То есть Имя приложения к примеру неизменно, а размер может быть подправлен кем то! И получится не очень хорошо. Вот и есть желание заценить при изменении новый MD5-хеш.


Сергей М.   (2008-07-22 21:31:00) [53]


> Как мне реализовать сей Сабж?
>


А никак.

MD5 приложения- это нонсенс.


> консольное


Да хоть розовое с бантиком.

К чему тут упоминание о "консольности" чего-то там ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо