Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.31;
Скачать: CL | DM;

Вниз

Как расчитать MD5 - хеш самого себя (Приложения)   Найти похожие ветки 

 
Дима   (2008-07-22 20:44) [0]

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

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


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

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

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

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


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


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


А никак.

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


> консольное


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

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


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


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


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

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

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


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


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


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

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

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

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


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


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


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


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


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


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

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


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

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


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


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

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

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


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

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

Так?


 
Palladin ©   (2008-07-22 22:17) [9]

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


 
Anatoly Podgoretsky ©   (2008-07-22 22:17) [10]

function md5(s: string): string;

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


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


> Это что и это чье и почему параметр 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));


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

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:22) [13]

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;


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


 
Palladin ©   (2008-07-22 22:26) [14]

ну и на кой ты его здесь привел?


 
Anatoly Podgoretsky ©   (2008-07-22 22:27) [15]

> Дима  (22.07.2008 22:20:11)  [11]

Сделай так

function md5(var buf; Lenght: Integer): string;
или
function md5(var buf: TIP; Lenght: Integer): string;


 
turbouser ©   (2008-07-22 22:29) [16]

Орех :)


 
@!!ex ©   (2008-07-22 22:35) [17]

> [16] turbouser ©   (22.07.08 22:29)

Не смешно... Грустно. :(


 
Дима   (2008-07-22 23:17) [18]


> Anatoly Podgoretsky ©   (22.07.08 22:27) [15]


Не чего не получилось, лезут ошибки!

Эхх...


 
Anatoly Podgoretsky ©   (2008-07-22 23:34) [19]

> Дима  (22.07.2008 23:17:18)  [18]

Так изменение только прототипа недостаточно, нужны изменения и в процедурах.


 
Loginov Dmitry ©   (2008-07-22 23:49) [20]

> Assign(Fi, FileName);
> Reset(Fi, 1);
> GetMem(pBuf, BufSize);
> ...
>
> Так?


Не совсем. Так ты попытаешься открыть файл с монопольным доступом. Не выйдет, т.к. файл уже открыт.
Используй глобальную переменную FileMode (измени ее на fmOpenRead or fmShareDenyNone).
Более красивый способ - грузить файл в TMemoryStream с помощью функции LoadFromFile, после чего копировать содержимое стрима в строку в помощью SetString(), TMemoryStream.Read() или Move(), а уж после - твое md5.


 
Дима   (2008-07-23 05:07) [21]


> Loginov Dmitry ©   (22.07.08 23:49) [20]


Спасибо, сегодня попробую в коде! Разжеванно доходчиво! Респект!


 
Дима   (2008-07-23 08:38) [22]

Соорудил так:
var
InFile: TFileStream;
//InMemory: TMemoryStream;
s: String;

const
FileName = "Md5GetExe.exe";
begin
 try
begin
InFile := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
//InMemory := TMemoryStream.Create.LoadFromFile(FileName);
s := (MD5DigestToStr(MD5Stream(InFile)));
WriteLn(s);
end;


Расчитывает верно! Но в память загнать не хватило опыта!


 
Palladin ©   (2008-07-23 08:45) [23]

а зачем тебе его в память загонять?


 
Дима   (2008-07-23 09:04) [24]


> Palladin ©   (23.07.08 08:45) [23]


Да теперь и не нужно уже :)
> Более красивый способ - грузить файл в TMemoryStream с помощью
> функции LoadFromFile

По совету
> Loginov Dmitry ©


Что то опять накосячил с реализацией, или как?


 
Palladin ©   (2008-07-23 09:13) [25]

Понятия не имею в чем он нашел красоту загрузки всего файла в память...


 
Anatoly Podgoretsky ©   (2008-07-23 09:25) [26]

> Palladin  (23.07.2008 9:13:25)  [25]

Такие функции по определению должны быть потоковыми.


 
Dennis I. Komarov ©   (2008-07-23 09:38) [27]

> [24] Дима   (23.07.08 09:04)

Я скажу как вычислить md5 хешь файла, но сперва скажите где Вы его собрались хранить?


 
Ega23 ©   (2008-07-23 09:51) [28]

Автор, ты уверен, что тебе именно хэш нужен, а не контрольная сумма?
Первое от файла - это бред. А вот второе - уже совсем даже и не бред...


 
Dennis I. Komarov ©   (2008-07-23 10:07) [29]

> [28] Ega23 ©   (23.07.08 09:51)

А собствено почему это?


 
Ega23 ©   (2008-07-23 10:12) [30]


> А собствено почему это?


Почему md5 от файла - бред? Или что?


 
User   (2008-07-23 10:15) [31]

http://delphiworld.narod.ru/base/md5.html, - функция вычисления хеш-суммы ..., в том числе:
function MD5File(const FileName: string): TMD5Digest;


 
Anatoly Podgoretsky ©   (2008-07-23 10:15) [32]

> Dennis I. Komarov  (23.07.2008 10:07:29)  [29]

А потому что лишнее, для проверки целостности, более чем достаточно быстро работающей процедуры расчета CRC32 вместо этого монстра.


 
Dennis I. Komarov ©   (2008-07-23 10:16) [33]

> Почему md5 от файла - бред? Или что?

угу


 
Dennis I. Komarov ©   (2008-07-23 10:18) [34]

> [32] Anatoly Podgoretsky ©   (23.07.08 10:15)

Возможно излишнее, но не бред :)


 
Ega23 ©   (2008-07-23 10:21) [35]


> Возможно излишнее, но не бред :)


Да бред. Это всё равно что пассатижи в качестве маникюрных щипчиков использовать.


 
User   (2008-07-23 10:29) [36]

MD5 вроде надежнее: http://www.insidepro.com/kk/163/163r.shtml -Обходи мента сзади, а Patch-Guard - спереди, хотя и долгий, на мелких файлых работа незаметна, на тяжеловесных ощутимо (пробовал pagefile.sys 1 Gb -около минуты считал) ...


 
Anatoly Podgoretsky ©   (2008-07-23 10:41) [37]

> Dennis I. Komarov  (23.07.2008 10:18:34)  [34]

Пока не озвучены другие критерии, то бред. Тут даже простой контрольной суммы хватило бы.


 
Anatoly Podgoretsky ©   (2008-07-23 10:42) [38]

> User  (23.07.2008 10:29:36)  [36]

Надежность для заявленой темы не нужна. Надежности даже CRC16, или CheckSum32/64 с избытком/


 
User   (2008-07-23 10:46) [39]

> Надежность для заявленой темы не нужна. - откуда мы знаем, для чего задающему вопрос нужен ответ? ...

> Надежности даже CRC16, или CheckSum32/64 с избытком/
http://www.insidepro.com/kk/118/118r.shtml - Как подделывают CRC16/32


 
Ega23 ©   (2008-07-23 10:53) [40]


> Как подделывают CRC16/32


А ты его через RSA закрой, а юзеру - только публичный ключ выдавай.  :)



Страницы: 1 2 вся ветка

Текущий архив: 2008.08.31;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.01 c
2-1216745096
Дима
2008-07-22 20:44
2008.08.31
Как расчитать MD5 - хеш самого себя (Приложения)


10-1147542762
RUNaum
2006-05-13 21:52
2008.08.31
Как понять что ActiveX в "design-time"?


15-1215708691
deadteachers
2008-07-10 20:51
2008.08.31
Пролили кофе с сахаром на клавиатуру ноутбука


10-1148641186
Davinchi
2006-05-26 14:59
2008.08.31
Обработчик события OnKeyDown в ActiveFormX не реагирует на ...


15-1215938456
Zeqfreed
2008-07-13 12:40
2008.08.31
Подскажите, как музыка называется