mboost-dp1

filehash


Gå til bund
Gravatar #1 - CBM
9. nov. 2016 12:55
Jeg skal have beregnet en hashværdi af en fil vha SHA256 og jeg skal gøre det i Delphi v.9.

Jeg fandt noget kode fra en W.Ehrhardt

(Links til pas fil kan findes ved hurtig google søgning)

Han har flg. funktion :

Procedure hashfile ({ifdef CONST} const {$endif} fname: Str255; OhHash: PHashDesc; var Digest: THashDigest; var buf; bsize: word; var Err: word);

Jeg er bare i tvivl om hvorledes jeg anvender den


Fx fname... er det så filnavnet? Fx test.exe eller c:\test\test.exe ?

Hvad er PHash?

Digest burde være resultatet men virker til at være en input parameter?

Buf har ingen type?

Bsize må være filens størrelse i bytes

Err er til fejlkode?

Nogen der evt kunne downloade pas filen og vise et kode eksempel hvor der udregnes et file hash med denne funktion?

Http://www.wolfgang-ehrhardt.de/crchash_en.html


Han har et demo program men har lidt problemer med at se præcis hvor denne funktion bruges i hans eksempler


Gravatar #2 - arne_v
9. nov. 2016 23:06
Hvorfor ikke vælge en simpel DIY løsning?

Genbrug er godt men ikke hvis det er en gættekonkurrence.

Brug OpenSSL DLL for implementation.

Demo:


program tstsha256;

uses
SysUtils, Windows;

procedure SHA256_Init(var ctx : pointer); cdecl; external 'libeay32.dll';
procedure SHA256_Update(var ctx : pointer; buf : PChar; buflen : integer); cdecl; external 'libeay32.dll';
procedure SHA256_Final(md : PChar; var ctx : pointer); cdecl; external 'libeay32.dll';

procedure test(buf : string);

var
ctxstore : array [1..10000] of char;
ctx : pointer;
md : array [1..32] of char;
i : integer;

begin
ctx := @ctxstore[1];
SHA256_Init(ctx);
SHA256_Update(ctx, PChar(buf), Length(buf));
SHA256_Final(@md[1], ctx);
for i := 1 to 32 do begin
write(IntToHex(Ord(md[i]), 2));
end;
writeln;
end;

begin
test('Dette er en test!');
end.


Testet med Lazarus ikke Delphi.

Det kan godt være lidt tricky at med Delphi->C.

Men API er:
- simpelt
- meget udbredt (i C)

Gravatar #3 - CBM
10. nov. 2016 06:48
Hvad indeholder ctxstore og
Md?

Buf er filens binære indhold konverteret til string tænker jeg?

Når du så laver en write i dit for loop, tænker jeg at jeg her skal putte det i en variabel i stedet for, typisk opsamle det i en string

Jeg skal egentlig bruge en funktion der tager en buffer som input (filens binære indhold, typisk en byte buffer) og giver en string som output (filehash)

Men må erkende at jeg ikke har prøvet at arbejde med filehashing før.

Jeg er fortaler for at det skal gøres så enkelt som muligt



Gravatar #4 - CBM
10. nov. 2016 07:56
hmm

ctxstore = en GUID af en art?
md = "result buffer" ?
Gravatar #5 - _tweak
10. nov. 2016 08:17
*bam* det er lang tid siden jeg har set pascal/delphi :)
Gravatar #6 - CBM
10. nov. 2016 09:31
nvrmd fik det til at spille :)
Gravatar #7 - arne_v
10. nov. 2016 14:46
Lidt blandet.

ctxstore er reelt en C SHA256_CTX struct.

Man kunne bruge tid paa at oversætte den til Delphi.

Men jeg er doven og der er ikke nogen grund til det. Sålænge at størrelsen af ctxstore (10000) er mindre end eller lig med størrelsen af C SHA256_CTX struct, så virker det.

md er hash resultatet.

buf er det som hashes.

Bemærk at SHA256_Update kan kaldes flere gang, så man behøver ikke læse hele filen ind på en gang.
Gravatar #8 - arne_v
10. nov. 2016 16:59
er større end eller lig med
Gravatar #9 - arne_v
10. nov. 2016 17:04
_tweak (5) skrev:
*bam* det er lang tid siden jeg har set pascal/delphi


Det er desværre ikke så udbredt idag.

Fremragende sprog til undervisning i programmering.

OK sprog til visse former for enkeltstående programmer.

Jeg har skrevet rigtigt mange VAX Pascal programmer fra slut 80'erne til tidlig 00'erne.
Gravatar #10 - CBM
10. nov. 2016 17:34
Jeg foretrækker faktisk disse lidt ældre sprog som Delphi :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login