Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Вниз

Как расчитать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.007 c
8-1184936230
DmitriyZ
2007-07-20 16:57
2008.08.31
Как в Delphi сгенерировать звук произвольной частоты и вывести ег


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


15-1215675321
Guest
2008-07-10 11:35
2008.08.31
Как посчитать: сколько молекул в литре воды?


2-1215326275
Незнайка
2008-07-06 10:37
2008.08.31
EHLib и выпадающее меню


3-1204266576
Barsky
2008-02-29 09:29
2008.08.31
Правильный запрос на FireBird SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский