Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#103

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 00:12
Ich bin dir wirklich sehr dankbar für alles. Aber leider funktioniert dein Code bei mir nicht.
Für folgendes erhalte ich auch nur Salat
Delphi-Quellcode:
 // _TEST_TEST_D36E844639D6B4B9ADAF9A11C2ABF841CCE43E94C57539C03CC9524545DD8E8D
 ShowMessage( TEncoding.ANSI.GetString(
    GetSHA1HashFromFile(aFileName, [0, -64])
   )
   );
Du machst einen Fehler SHA1 liefert 160Bit/20Byte Werte. Du musst also
hash := GetSHA1HashFromFile( filename, [0,-21] );
berechnen, wenn du den Hash Wert des Files ohne den angehängten (20 Byte) Hash Wert berechnen willst.

So geht's:

SHA1 ans Ende des Files schreiben durch Aufruf von
procedure SchreibeSHA1HashAnsEndeDesFiles( const filename : string );

Delphi-Quellcode:
procedure HashAnsEndeDesFilesSchreiben( filename : string; hash : TBytes );
var f : TFileStream;
begin
  f := TFileStream.Create( filename, fmOpenWrite );
 try
  f.Position := f.Size;
  f.Write( hash[0], length( hash ) );
 finally
  f.Free;
 end;
end;


procedure SchreibeSHA1HashAnsEndeDesFiles( const filename : string );
var hash, hash2 : TBytes;
begin
  hash := System.hash.THashSHA1.GetHashBytesFromFile( filename ); // Delphi system.hash
  // hash2 := GetSHA1HashFromFile( filename , [] ); // oder wir verwenden "unsere" SHA1 Funktion
  HashAnsEndeDesFilesSchreiben( filename, hash );
end;

Den Hashwert am Ende des Files überprüfen:
function PruefeSHA1HashAmEndeDesFiles( const filename : string ) : boolean;


Delphi-Quellcode:
function LiesHashAmEndeDesFiles( const filename : string; len : integer ) : TBytes;
var f : TFileStream;
begin
  f := TFileStream.Create( filename, fmOpenRead );
 try
  f.Position := f.Size - len ;
  SetLength( Result, len );
  f.Read( Result, len );
 finally
  f.Free;
 end;
end;

function PruefeSHA1HashAmEndeDesFiles( const filename : string ) : boolean;
var hashAmFileEnde, hash : TBytes;
begin
  hash := GetSHA1HashFromFile( filename, [0,-21] ); // SHA1 erzeugt 160bit (20Byte) Werte
  hashAmFileEnde := LiesHashAmEndeDesFiles( filename, 20 );
  Result := CompareMem( hash, hashAmFileEnde, 20 );
end;


Testen:

Delphi-Quellcode:
procedure pruefen_SHA1;
var filename : string;
    allesok : boolean;
begin
  filename := 'C:\Users\Michael\Desktop\1GB.txt';

  // Ans Fileende schreiben:
  SchreibeSHA1HashAnsEndeDesFiles( filename );
  // Prüfen, ob der HashWert OK ist:
  allesok := PruefeSHA1HashAmEndeDesFiles( filename );

  ShowMessage( 'Check File : ' + allesok.ToInteger.ToString );
end;
Michael Gasser