Форум: "Начинающим";
Текущий архив: 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